自然语言处理NLP——中文抽取式自动文摘(包括中文语料库处理、三种方法实现自动文摘、Rouge评价方法对自动文摘进行打分)

本文介绍了使用Textrank、Word2vec+Textrank和MMR三种方法实现中文抽取式自动文摘,并通过Rouge评价方法对摘要进行质量评估。详细讨论了每个方法的实现步骤,包括中文语料库的处理、模型训练、停用词过滤和余弦相似度计算等。
摘要由CSDN通过智能技术生成

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

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

前期准备工作(包括下载中文语料库、提取正文、繁简转化、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) <= 1e-12:
        return 0.
    denominator = math.log(float
  • 16
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 44
    评论
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值