TextRank算法实践
PageRank算法思想
TextRank算法的思想主要源于PageRank算法,PageRank算法主要用于给互联网网页排序,根据网页之间的跳转来构造一个初始权重矩阵(转移矩阵),默认每个网页质量都是1
使用一个向量v,其表示点击每个网页的概率(初始时都是等概率),然后按照图中所示反复相乘,直到结果不变,就得到了每个网页的权重排序。
另外还要考虑到一些网页没有指向其他网页的情况,其实都会有相应的解决办法,但是因为这个算法比较老了,不再细讲。
TextRank是如何基于PageRank进行的操作的
也就是利用句子代替网页,通过计算句子间的相似度得到相似度矩阵,然后对这个相似度矩阵做pagerank算法。
TextRank处理流程
主要任务:将多个句子作为输入,并生成一个要点式的摘要。
- 如果针对多篇文章,就先需要把所有文章中的文本连接起来;
- 把文本分割成一个个的句子,在分割之前进行文本标准化;
- 对每个句子做向量化,因为要借助词向量来生成句子向量,所以需要对句子先做分词;
- 计算句子之间的相似度,并存储到矩阵中;
- 把相似度矩阵转化为图,其中句子是节点,相似度是节点间的权重;
- 取到top-k权重的句子,作为最终的摘要。
第1步根据自己的任务情况自行操作,这里直接从第2步开始
1 | # 标准化文本 |
步骤3.1分词
1 | # 默认的停用词文件路径 |
结巴分词的词性对照表
1 | // jieba词性对照表 |
根据词性对照表,可以分析得到这里(‘an’, ‘i’, ‘j’, ‘l’, ‘n’, ‘nr’, ‘nrfg’, ‘ns’, ‘nt’, ‘nz’, ‘t’, ‘v’, ‘vd’, ‘vn’, ‘eng’)对应的词性分别为:名行词,成语,简称略称,习用语,名词,人名,地名,机构团体名,其他专名,时间词,动词,副动词,名动词,英文;这里利用参数use_speech_tags_filter来判断是否根据词性进行过滤,如果进行过滤,则只要上述这些词性的词,其他的词会被丢弃。
结巴分词的结果,遍历每个元素,通过word属性可以得到分词结果,通过flag属性可以得到词性,x表示非语素词,一般为标点符号,所以可以过滤掉。
步骤3.2 获取词向量
下载Glove中文词向量 参考资料:https://github.com/Embedding/Chinese-Word-Vectors
1 | def get_word_vector(): |
词向量长度:352163
word_embedding元素内容示例:
1 | {'的': [-0.251355 0.234742 -0.169728 0.026955 0.25885 0.028063 -0.498176, 0.076507 0.151926 0.214029 0.063718 -0.041315 0.509875 0.358331, -0.151229 0.271991 -0.119206 -0.269604 0.2963 0.312931 -0.066358, 0.013657 -0.021935 0.264219 0.048273 -0.212434 -0.064783 -0.243087, 0.166897 -0.039173 0.017801 -0.204246 -0.252223 0.038224 0.233915, 0.094598 -0.024282 0.029599 -0.238779 0.008268 -0.348425 -0.357207, -0.187001 -0.085915 0.094435 -0.196423 -0.098985 -0.023036 -0.048889, -0.121236 -0.061561 0.053498 0.170762 -0.07916 -0.297504 -0.092928, -0.06956 -0.194255 -0.090922 0.148681 0.042842 -0.143766 0.104044, -0.164521 -0.292341 0.28678 0.182208 -0.329816 0.29451 -0.231588, 0.298016 -0.394329 0.100928 0.131523 -0.068831 -0.150447 -0.241897, 0.092547 0.102829 0.007546 -0.108389 -0.070817 -0.081737 -0.027211, 0.129244 -0.093027 -0.295611 -0.236846 -0.05789 -0.066839 0.011099, 0.00524 0.137162 -0.068874 -0.115253 -0.341677 0.285972 -0.01384, 0.070...} |
步骤3.3 计算句子向量以及步骤4、5、6,均在main函数中
1 | def main(text): |
调用nx.pagerank算法可能会出现”AttributeError: module ‘scipy.sparse’ has no attribute ‘coo_array’“的问题
解决办法:将scipy版本更为1.8.0的版本。
测试:
1 | if __name__ == "__main__": |
输出
1 | 词向量长度:352163 |