【文本摘要(1)】抽取式之textrank(无监督学习):生成200字以内摘要

简介: 【文本摘要(1)】抽取式之textrank(无监督学习):生成200字以内摘要

写在最前面

最近在做文本摘要任务,将持续更新以下方法及代码

参考:https://blog.csdn.net/sinat_21843047/article/details/89458435

https://my.oschina.net/letiantian/blog/351154?fromerr=MH7VMUJY

原理

TextRank 算法基于 PageRank,用于为文本生成关键字和摘要。其论文是:

Mihalcea R, Tarau P. TextRank: Bringing order into texts[C]. Association for Computational Linguistics, 2004.

pagerank算法

该方法起源于pagerank

PageRank 最开始用来计算网页的重要性。整个 www 可以看作一张有向图图,节点是网页。如果网页 A 存在到网页 B 的链接,那么有一条从网页 A 指向网页 B 的有向边。

构造完图后,使用下面的公式:

S (Vi) 是网页 i 的中重要性(PR 值)。d 是阻尼系数,一般设置为 0.85。In (Vi) 是存在指向网页 i 的链接的网页集合。Out (Vj) 是网页 j 中的链接存在的链接指向的网页的集合。|Out (Vj)| 是集合中元素的个数。

PageRank 需要使用上面的公式多次迭代才能得到结果。初始时,可以设置每个网页的重要性为 1。上面公式等号左边计算的结果是迭代后网页 i 的 PR 值,等号右边用到的 PR 值全是迭代前的。

关键词提取

将原文本拆分为句子,在每个句子中过滤掉停用词(可选),并只保留指定词性的单词(可选)。

由此可以得到句子的集合和单词的集合。

每个单词作为pagerank中的一个节点。设定窗口大小为k,假设一个句子依次由下面的单词组成:

w1,w2,w3,w4,w5,..., wn

w1,w2,…, wk、 w2,w3,… .,wk+1、 w3,w4,… ,wk+2等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边。

基于上面构成图,可以计算出每个单词节点的重要性。最重要的若干单词可以作为关键词。

关键短语提取

参照关键词提取提取出若干关键词。若原文本中存在若干个关键词相邻的情况,那么这些关键词可以构成一个关键词组。

例如,在一篇介绍支持向量机的文章中,可以找到关键词支持、向量、机,通过关键词组提取,可以得到支持向量机。

摘要生成

将每个句子看成图中的一个节点,若两个句子之间有相似性,认为对应的两个节点之间有一个无向有权边,权值是相似度。

通过pagerank 算法计算得到的重要性最高的若干句子可以当作摘要。

论文中使用下面的公式计算两个句子 Si 和 Sj 的相似度:

分子是在两个句子中都出现的单词的数量。|Si | 是句子 i 的单词数。

由于是有权图,PageRank 公式略做修改:

代码

关于TextRank4ZH

TextRank一算法可以用来从文本中提取关键词和摘要(重要的句子)。TextRank4ZH是针对中文文本的TextRank算法的python算法一实现。

https://github.com/letiantian/TextRank4ZH

安装

依赖

jieba >= 0.35

numpy >= 1.7.1

networkx >= 1.9.1

pip install textrank4zh

使用示例

类TextRank4Keyword、TextRank4Sentence在处理一段文本时会将文本拆分成4种格式:

sentences:由句子组成的列表。

words_no_filter:对sentences中每个句子分词而得到的两级列表。

words_no_stop_words:去掉words_no_filter中的停止词而得到的二维列表。

words_all_filters:保留words_no_stop_words中指定词性的单词而得到的二维列表。

代码1:抽取200字以内摘要

from textrank4zh import TextRank4Sentence
import pandas as pd
tr4s = TextRank4Sentence()
# 抽取200字摘要
def sample_generate(text):
    tr4s.analyze(text=text, lower=True, source = 'all_filters')
    print()
    print( '摘要:' )
    lennum = 0
    summary = ''
    for item in tr4s.get_key_sentences(num=3):
        lennum = lennum + len(item.sentence)
        if lennum > 200:
            break
        summary = summary + item.sentence + '。'
    # print(summary)
    return summary
def generate_file(df):
    df = df.copy()
    generate_diagnosis = []
    i = 1
    for description in df.iloc[:,0]:
        summary = sample_generate(description)
        generate_diagnosis.append(summary)
        print(i,"摘要:",summary)
        i = i + 1
    df.loc[:, "generate_diagnosis"] = generate_diagnosis
    df.to_excel("textrank生成1.xlsx", sheet_name='Sheet1', index=False)
if __name__ == '__main__':
    filepath = './data/test.tsv'
    file = pd.read_csv(filepath, sep='\t')
    generate_file(file)

代码2:摘要词、句

from textrank4zh import TextRank4Keyword, TextRank4Sentence
# text = open('./data/1.txt', 'r', 'gbk').read()
text = '需要摘要的句子'
tr4w = TextRank4Keyword()
tr4w.analyze(text=text, lower=True, window=2)  # py2中text必须是utf8编码的str或者unicode对象,py3中必须是utf8编码的bytes或者str对象
print( '关键词:' )
for item in tr4w.get_keywords(20, word_min_len=1):
    print(item.word, item.weight)
print()
print( '关键短语:' )
for phrase in tr4w.get_keyphrases(keywords_num=20, min_occur_num= 2):
    print(phrase)
tr4s = TextRank4Sentence()
tr4s.analyze(text=text, lower=True, source = 'all_filters')
print()
print( '摘要:' )
for item in tr4s.get_key_sentences(num=3):
    print(item.index, item.weight, item.sentence)  # index是语句在文本中位置,weight是权重

报错处理

报错1:AttributeError: module ‘networkx’ has no attribute ‘from_numpy_matrix’

使用networkx 3.0及以上版本,可能会报这个错误;暂时可将版本降低到1.9.1。

pip3 install networkx==1.9.1

报错2lmportError: cannot import name ‘escape’ from ‘cgi’(Users/xx/miniconda3/iblpython3.8/cgi.py)

解决方法:修改文件

/Users/xx/miniconda3/lib/python3.8/site-packages/networkx/readwrite/gm1. py

vim进入到该.py文件

vim /root/anaconda3/envs/wyt_1.10/lib/python3.8/cgi.py

from cgi import escape

替换为(或者直接增加)

from html import escape

注意:

输入 i 进入编辑insert模式
esc退出编辑模式
:wq保存退出

linux系统里的vim是编辑文本的命令,在vi里查找相应关键字的方法如下:

例如搜索 the写法:/the +回车

/+关键字 ,回车即可。此为从文档当前位置向下查找关键字,按n键查找关键字下一个位置;

?+关键字,回车即可。此为从文档挡圈位置向上查找关键字,按n键向上查找关键字;

目录
相关文章
|
测试技术
fio磁盘压测工具
因为是虚拟机,所以对于性能很虚。借助fio进行测试
1408 0
|
安全 虚拟化 Docker
解决:VMware Workstation 与 Device/Credential Guard 不兼容
因为在官网下载了win版的docker,而会自带下载虚拟机Hyper-V,这个和我之前下载的vmware虚拟机造成冲突了,导致后者不能使用,所以打开vmware报错如下:
6833 0
解决:VMware Workstation 与 Device/Credential Guard 不兼容
|
5月前
|
IDE 搜索推荐 开发工具
Visual Studio 2022 Enterprise 17.14.25 Offline (2026 年 1 月更新)
Microsoft Visual Studio 2022 离线安装包 - 简体中文 | 繁體中文 | English
950 3
Visual Studio 2022 Enterprise 17.14.25 Offline (2026 年 1 月更新)
|
小程序
微信小程序APPID的两种查看方法
查看微信小程序APPID的两种方法:1) 在小程序内点击右上角“...”,进入查看页面,点击“更多资料”查看;2) 登录微信公众平台([https://mp.weixin.qq.com/](https://mp.weixin.qq.com/)),进入【设置】查看“账号信息”。
18234 1
|
计算机视觉 Python
PIL图像转换为Numpy数组:技术与案例详解
本文介绍了如何将PIL图像转换为Numpy数组,以便利用Numpy进行数学运算和向量化操作。首先简要介绍了PIL和Numpy的基本功能,然后详细说明了转换过程,包括导入库、打开图像文件、使用`np.array()`或`np.asarray()`函数进行转换,并通过打印数组形状验证转换结果。最后,通过裁剪、旋转和缩放等案例展示了转换后的应用,以及如何将Numpy数组转换回PIL图像。此外,还介绍了处理base64编码图像的完整流程。
744 4
|
小程序 Java 关系型数据库
基于Java学生选课管理系统设计和实现(源码+LW+调试文档+讲解等)
基于Java学生选课管理系统设计和实现(源码+LW+调试文档+讲解等)
|
机器学习/深度学习 数据采集 算法
经典机器学习算法——Pagerank算法(一)
PageRank 算法由 Google 创始人 Larry Page 在斯坦福读大学时提出,又称 PR——佩奇排名。主要针对网页进行排名,计算网站的重要性,优化搜索引擎的搜索结果。PR 值是表示其重要性的因子
经典机器学习算法——Pagerank算法(一)
|
机器学习/深度学习 算法 数据可视化
面向萌新的数学建模入门指南
面向萌新的数学建模入门指南
1407 0
|
机器学习/深度学习 算法 Python
【阿旭机器学习实战】【10】朴素贝叶斯模型原理及3种贝叶斯模型对比:高斯分布朴素贝叶斯、多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯
【阿旭机器学习实战】【10】朴素贝叶斯模型原理及3种贝叶斯模型对比:高斯分布朴素贝叶斯、多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯
【阿旭机器学习实战】【10】朴素贝叶斯模型原理及3种贝叶斯模型对比:高斯分布朴素贝叶斯、多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯
|
Python
Python 的异步编程: 解释什么是事件循环(Event Loop)?
事件循环是Python异步编程的关键,它无限循环等待并处理异步任务,协调I/O操作执行顺序,实现并发,提高性能。
707 0