前期回顾
原文链接:文本自动摘要:基于TextRank的中文新闻摘要
用TextRank做单领域多文本的自动摘要的过程如下:
- 把所有文章整合成文本数据,并把文本分割成单个句子;
- 用WordAVG的方法,将每个句子中所有单词的词向量合并为句子的向量表示;
- 计算句子向量间的相似性并存放在矩阵中,作为转移概率矩阵M;
- 然后将转移概率矩阵转换为以句子为节点、相似性得分为边的图结构,用于句子TextRank计算;
- 对句子按照TextRank值进行排序,排名最靠前的n个句子作为摘要。
好的,那下面我们就用TextRank算法,以及按照上面的流程,做一个新闻自动摘要的小案例。
基于TextRank的中文新闻摘要
参考了一篇用TextRank做英文新闻摘要的文章。
1、文章:《手把手|基于TextRank算法的文本摘要(附Python代码)》
2、github地址
文档的原网页:
- https://baijiahao.baidu.com/s?id=1626615436040775944&wfr=spider&for=pc
- https://baijiahao.baidu.com/s?id=1626670136476331971&wfr=spider&for=pc
- http://finance.sina.com.cn/roll/2019-02-28/doc-ihrfqzka9798377.shtml
实践的github
好,那就开始。
1. 整合文档,划分句子
首先把文档读入,放在列表中,可以看到,有些句子已经被划分出来了。
['信息量巨大!易会满首秀,直面科创板8大问题,对散户加速入场笑而不语……',
'每日经济新闻',
'02-2717:56',
'每经编辑:郭鑫 王晓波',
'图片来源:新华社记者 李鑫 摄',
'易会满上任一个月,还没有在公开场合说过一句话。',
'2月27日下午三点半开始,XX出席其首场新闻发布会,离发布会开始前两小时现场已经座无虚席,只等XX来到现场。此外,XX、XX等也共同出席。',
...]
不过通过观察,我们可以发现存在两个问题:
一是以[。?!;]作为句子的分隔符,那么列表中的每个字符串元素中可能有多个句子;
二是每个字符串元素可能以[:,]结尾,也就是说可能是一个不完整的句子。
考虑到这只是一个小案例,所以就没花太多时间,仅仅处理一下第一个问题,把句子按照[。?!;]进行划分,如果字符串元素是不完整的句子,那也作为一句。
import numpy as np
import pandas as pd
import re,os,jieba
from itertools import chain
"""第一步:把文档划分成句子"""
# 文档所在的文件夹
c_root = os.getcwd()+os.sep+"cnews"+os.sep
sentences_list = []
for file in os.listdir(c_root):
fp = open(c_root+file,'r',encoding="utf8")
for line in fp.readlines():
if line.strip():
# 把元素按照[。!;?]进行分隔,得到句子。
line_split = re.split(r'[。!;?]',line.strip())
# [。!;?]这些符号也会划分出来,把它们去掉。
line_split = [line.strip() for line in line_split