自然语言处理NLP 您所在的位置:网站首页 文章摘要提取算法有哪些 自然语言处理NLP

自然语言处理NLP

2024-06-04 13:04| 来源: 网络整理| 查看: 265

利用三种方法实现抽取式自动摘要,并给摘要结果打分(一、textrank 二、word2vec+textrank 三、MMR 四、Rouge评测)

具体代码我上传到了Github上,其中有45篇小论文(包括三种摘要方法生成的摘要、标准摘要和各摘要方法生成的摘要的p、r、f值),地址如下: https://github.com/God-Fish-X/Extractable-automatic-Text

网上有很多关于自动文摘的博客和资料,我主要参考自ReignsDu作者,原文地址为https://blog.csdn.net/reigns_(在作者博客的最下方)

此篇博客也是我参考的重点https://blog.csdn.net/qq_22636145/article/details/75099792?locationNum=5&fps=1

写这篇博客的目的主要是记录一下在学习过程中遇到的一些问题,和这些问题的解决方案。

前期准备工作(包括下载中文语料库、提取正文、繁简转化、jieba分词、训练模型)

首先是中文语料库的下载,我使用的是维基百科的中文语料,下载地址是https://dumps.wikimedia.org/zhwiki/

选择最新的即可

在这里插入图片描述 选择较大的文件下载

在这里插入图片描述

接着下载意大利程序员用python研发的维基百科抽取器,可抽取出维基百科中文语料库的内容并输出。 下载地址为:https://github.com/attardi/wikiextractor

win下需要更改文件中的input行,如下图,并用如下语句提取内容(我将分割的数值设置到2048m,把所有内容提取到一个文档中)

在这里插入图片描述

抽取出来的内容是繁体,用opencc对语料库进行繁简转换

使用pip install opencc安装opencc包,遇到的错误无法解决,在查找资料后选择用如下新包,无法安装的问题得以解决

在这里插入图片描述 但此时又遇到了新的问题,在win下安装好后仍报错找不到opencc,即使将opencc的地址添加到path中后问题仍然得不到解决

此处我的解决方法是把提取出的内容拷到ubuntu系统下,在ubuntu系统下重新安装opencc,完成繁简转换

将ubuntu下处理好的语料库重新拷贝到win下,开始jieba分词以及去除停用词(网上有很多停用词文档,自行下载即可)

import jieba import codecs import re file_chinese_one = codecs.open('cut_zh_wiki.txt',"a+",'utf-8') #file_chinese_two = codecs.open('cut_zh_wiki_01.txt',"a+",'utf-8') stopwordslist = [line.strip() for line in open('stopwords.txt',encoding='utf-8').readlines()] #创建停用词列表 for line in open("chinese_corpus/zh_wiki_00",'r',encoding='utf-8'): for i in re.sub('[a-zA-Z0-9]', '', line).split(' '): if i != '': data = list(jieba.cut(i, cut_all = False)) readline = ' '.join(data) + '\n' file_chinese_one.write(readline) file_chinese_one.close() #去除停用词 for line in open("zh_wiki","r",encoding='utf-8'): for i in re.sub('[a-zA-Z0-9]','',line).split(' '): if i != '': data = list(jieba.cut(i,cut_all=False)) outstr = '' for word in data: if word not in stopwordslist: if word != '\t': outstr += word outstr += " " file_chinese_one.write(outstr + '\n') file_chinese_one.close() 这一步是模型训练,在此处我踩坑无数,浪费了将近20个小时 此处用word2vec进行模型训练 代码如下 from gensim.models import word2vec import logging logging.basicConfig(format = '%(asctime)s : %(levelname)s : %(message)s',level=logging.INFO) sentences_one = word2vec.LineSentence(u'./cut_zh_wiki.txt') #sentences_two = word2vec.LineSentence(u'./cut_zh_wiki_01.txt') model_one = word2vec.Word2Vec(sentences_one,size=200,window=10,min_count=64,sg=1,hs=1,iter=10,workers=25) #model_two = word2vec.Word2Vec(sentences_two,size=200,window=10,min_count=64,sg=1,hs=1,iter=10,workers=25) model_one.save(u'./train_test_x/word2vec2') #model_one.wv.save_word2vec_format(u'./w2v',binary=False) #model_two.save(u'./word2vec2')

(此处遇到的问题是,训练后的模型在pycharm中打开是乱码,导致我以为是我文档的编码有问题,导致训练出错;1、我更改了编码方式再次进行训练,结果仍是乱码;2、用别的代码进行模型训练,结果仍是乱码;3、这次我尝试直接测试模型,发现虽然文档打开是乱码,但是测试模型输出是并非乱码;4、于是我重新用上面的代码进行了最后一次训练,训练完成后文档打开虽然是乱码,但可以正常的进行模型测试)

我训练模型用的是笔记本,配置为 7代i5(HQ)、16G内存、2.50GHz四核,每次训练的时间大概在5到6个小时

以下是测试代码和测试结果

from gensim.models import word2vec model = word2vec.Word2Vec.load(u'./train_test_x/word2vec2') similar = model.wv.similarity(u'南京',u'上海') print("南京与上海的相似度为:",similar) similar = model.wv.similarity(u'太原',u'上海') print("太原与合肥的相似度为:",similar) print("与'计算机'最相近的单词") result = model.wv.most_similar(u'地点',topn=20) for each in result: print(each) print()

在这里插入图片描述

接下来的内容且等日后再更新 核心部分(一、textrank 二、word2vec+textrank 三、MMR ) 一、textrank 需要用到的库 import jieba import math from string import punctuation from heapq import nlargest from itertools import product, count from gensim.models import word2vec import numpy as np import sklearn.metrics.pairwise import paddle.fluid as fluid cut_sentences()函数:将一篇文章分割成一个个句子 def cut_sentences(sentence): #以。!?.为结束符,对文章进行分割 puns = frozenset(u"'。") #返回一个冻结的集合 tmp = [] for ch in sentence: tmp.append(ch) #逐字遍历文章并添加到tmp中 if puns.__contains__(ch): #如果遇到句子结束符 yield ''.join(tmp) #将结束符拼接到tmp,并返回 tmp = [] yield ''.join(tmp) create_stopwords()函数:创建停用词列表 def create_stopwords(): stop_list = [line.strip() for line in open("stopwords.txt", 'r', encoding='utf-8').readlines()] #去除首尾空格,创建停用词列表 return stop_list compute_similarity_by_avg(word_list1,word_list2)函数:使用TextRank算法中计算相似度的方法得出两个向量之间的相似度 def compute_similarity_by_avg(word_list1,word_list2): #两个向量之间的相似度 words = list(set(word_list1 + word_list2)) vector1 = [float(word_list1.count(word)) for word in words] vector2 = [float(word_list2.count(word)) for word in words] vector3 = [vector1[x] * vector2[x] for x in range(len(vector1))] vector4 = [1 for num in vector3 if num > 0.] co_occur_num = sum(vector4) if abs(co_occur_num)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有