import numpy as np
import pandas as pd
from nltk.corpus import stopwords
import nltk
import re
from nltk.tokenize import sent_tokenize
from sklearn.metrics.pairwise import cosine_similarity
import networkx as nx# 参考链接https://www.cnblogs.com/cuiyubo/p/10175268.html
"""
【通过TextRank进行文本摘要】:抽取型文本摘要
读取所有文章拆分成句子整合到一维数组 ----> 清洗句子中的噪音词汇 ----> 得到词向量字典 ----> 得到句子向量矩阵----> 得到句子相似度矩阵 ----> 应用pagerank算法1> 获取文本:获取多篇文章,每篇文章为一个数组,由多篇文章最后构成二维数组
2> 分句:将包含多篇文章的二维数组遍历转变为一维数组,并进行分句,最后得到以多个标准句子为元素的一维数组
3> 数据清洗:去除特殊字符 + 字母转换为小写 + 剔除停用词
4> 词向量表示单词:根据开源的词向量库,以字典的形式存储{单词: 词向量}
5> 计算句子向量矩阵:每句话的词向量求平均得到句子向量矩阵
6> 计算余弦相似度矩阵:用余弦相似度计算两句子之间的相似度
7> 应用PageRank算法:在进行下一步之前,我们先将相似性矩阵sim_mat转换为图结构。这个图的节点为句子,边用句子之间的相似性分数表示。在这个图上,我们将应用PageRank算法来得到句子排名。
8> 摘要提取:最后,根据排名提取前N个句子,就可以用于生成摘要了。"""
path_tennis = r"E:AI_LIUprojectsNLPNLP_COREchapter_5TextRank_Datatennis_articles_v4.csv"
df_tennis = pd.read_csv(path_tennis)
# print(df_tennis['article_text'])
sentences = []
for s in df_tennis['article_text']:sentences.append(sent_tokenize(s))   # sent_tokenize()将文章按句子拆分成列表
print(sentences)sentences = [y for x in sentences for y in x]     # 将二维数组sentence转为一维数组
print(sentences)"""
文本预处理
先将list格式的句子序列化,这样读取句子的速度会很快,但是字母小写的时候,又再次转回了list格式
1> 去除特殊字符
2> 字母小写
"""
print(f"sentences原始格式为{type(sentences)}")
clean_sentences = pd.Series(sentences).str.replace("[^a-zA-Z]"," ")
print(f"sentences序列化之后得到的clean_sentences数据格式为{type(clean_sentences)}")
clean_sentences = [ s.lower() for s in clean_sentences]
print(f"clean_sentences设置字母小写之后得到的clean_sentences数据格式为{type(clean_sentences)}")
print(clean_sentences)"""
导入nltk的停用词,剔除噪音"""stop_words = stopwords.words("english")
def remove_stop_wrods(sen):""":param sen: 一维数组:return: 返回去除停用词之后的一维数据"""return (" ").join([j for j in sen if j not in stop_words])# 遍历判断每句话的单词是否在停用词的数组里,剔除停用的单词,保留有用的单词,词与词之间用空格隔开clean_sentences = [remove_stop_wrods(i.split()) for i in clean_sentences]print(f"清理噪音后:n{clean_sentences}")"""
读取词向量
读取的词向量的数据格式为:
I -4.61076051e-02  1.29591778e-01 -5.93765713e-02 -9.25393030e-02
really 9.77605209e-02  3.80744934e-02 -5.39967835e-01 -1.52831122e-01所以,key的索引为0
value的索引为1之后的元素"""vectors_path = r"E:AI_LIUprojectsNLPNLP_COREchapter_5TextRank_Dataglove.6B.300d.txt"
word_embeddings = {}
f = open(vectors_path, encoding='utf-8')
for line in f:values = line.split()word_embeddings[values[0]] = np.asarray(values[1:], dtype='float32')
f.close()
print(f"词向量长度为:{len(word_embeddings)}")"""
计算句子向量矩阵:每句话的词向量矩阵求平均
1> 通过get(key, 无key值时返回长度为300个元素的零矩阵)
2> 求平均时,需要进行平滑处理(这里分母 + 0.01)"""sentences_vectors = []for i in clean_sentences:if len(i) != 0:sentence_v = sum([word_embeddings.get(sen, np.zeros((300,),dtype=np.float32)) for sen in i.split()])/  (len(i.split()) +0.001)else:sentence_v = np.zeros((300,),dtype=np.float32)sentences_vectors.append(sentence_v)
print(f"第一句话的句子向量为:{sentences_vectors[0]}")"""
根据句子向量,计算句子相似度矩阵:每两句话之间的句子向量矩的余弦相似度
1> 创建N*N的零矩阵
2> 调用第三方库,计算句子之间的余弦相似度,填入N*N矩阵中"""fw = open(r"E:AI_LIUprojectsNLPNLP_COREchapter_5Sim_Mat.txt","w")
sim_mat = np.zeros((len(clean_sentences),len(clean_sentences)))
for i in range(len(clean_sentences)):for j in range(len(clean_sentences)):if i != j:  # 同一句子相似度为1,无需计算相似度,在矩阵中默认为零sim_mat[i][j] = cosine_similarity(sentences_vectors[i].reshape(1,300), sentences_vectors[j].reshape(1,300))# X : ndarray or sparse array, shape: (n_samples_X, n_features)# 输入cosine_similarity(X,Y)的X和Y为二维数组# sentences_vevtors句子向量矩阵中,每个句子都是一维数组,需要通过reshape转为二维数组fw.write(clean_sentences[i]+"n"+clean_sentences[j]+"n相似度为:"+str(sim_mat[i][j]))fw.write("nn")print(f"句子相似度矩阵为:n{sim_mat}")
print(f"句子{clean_sentences[0]}n和n{clean_sentences[1]}")
print(f"相似度为:{sim_mat[0][1]}")"""
调用第三方库将句子相似度矩阵生成图结构,以句子为节点,相似度为边的分数(权重)
最后用pagerank得到句子排名"""nx_graph = nx.from_numpy_array(sim_mat)
scores = nx.pagerank(nx_graph)  # 通过Pagerank计算每个句子的得分
ranked_sentences = sorted(([scores[i],s] for i,s in enumerate(sentences)),reverse=True) # enumerate()将一维数组sentences的索引和元素遍历一遍,通过索引将句子和pagerank得分绑定for i in range(10):print(ranked_sentences[i])

读取文本节点_TextRank抽取型文本摘要相关推荐

  1. js中text方法是啥意识_JavaScript | 文本节点Text常用方法

    文本节点就是指向文本的节点,网页上看到的文字内容都属于文本节点. 特征 文本节点由Text类型表示,包含的是纯文本内容,但文本节点是对象类型. 内容 console.log(box.firstChil ...

  2. js向html中指定位置追加文本,JavaScript中如何添加文本节点?

    在javascript中提供了很多操作DOM文档的方法,当然也包括创建一个节点,下面我们来看一下JavaScript如何创建一个创建一个文本节点(text). JavaScript中添加文本节点的方法 ...

  3. tinyxml 读取文本节点_在Windows下使用TinyXML-2读取UTF-8编码包含中文字符的XML文件...

    TinyXML-2 是一个用 C++ 开发的小巧.高效的 XML 解析工具,它在 GitHub 网站上的链接为: https://github.com/leethomason/tinyxml2 .它的 ...

  4. 基于TextRank的抽取式文本摘要(英文)

    基于TextRank的抽取式文本摘要(英文) 前言 备注 Talk is cheap, show me the code. 前言 在GitHub上写笔记要经常查看很麻烦,在此记录一些整合的各种代码.能 ...

  5. tinyxml 读取文本节点_TinyXml 读写XML文件

    使用Tinyxml创建和读取XML文件的优点:1,可在Windows和Linux中使用:2,方便易学,易用,可在http://sourceforge.net/projects/tinyxml/获取源代 ...

  6. 详解预训练模型、信息抽取、文本生成、知识图谱、对话系统技术

    我们正处在信息爆炸的时代.面对每天铺天盖地的网络资源和论文.很多时候我们面临的问题并不是缺资源,而是找准资源并高效学习.其次,即便网络上的资源非常多,学习是需要成本的,而且越有深度的内容越难找到好的学 ...

  7. 关于NLP相关技术全部在这里:预训练模型、信息抽取、文本生成、知识图谱、对话系统...

    我们正处在信息爆炸的时代.面对每天铺天盖地的网络资源和论文.很多时候我们面临的问题并不是缺资源,而是找准资源并高效学习.其次,即便网络上的资源非常多,学习是需要成本的,而且越有深度的内容越难找到好的学 ...

  8. Python数据预处理——格式转换及抽取数据文本信息

    课程地址:https://www.imooc.com/learn/1105 1. 数据预处理简介 1.1 什么是数据预处理 数据预处理简单来说就是:将原始数据装进一个预处理的黑匣子之后,产生出高质量数 ...

  9. 初探JavaScript(一)——也谈元素节点、属性节点、文本节点

    Javascript大行其道的时候,怎么能少了我来凑凑热闹^_^ 基本上自己对于js的知识储备很少,先前有用过JQuery实现一些简单功能,要论起JS的前世今生,来龙去脉,我就一小白.抱起一本< ...

最新文章

  1. BZOJ 2144 跳跳棋(神仙建模题,倍增 LCA,二分)【BZOJ修复工程】
  2. python 有效的字母异位词
  3. 改小matlab的绘图大小、字号、线宽
  4. Java EE 7公共草案已发布。 我需要Java EE Light Profile!
  5. 1、什么是Spring框架,Spring框架有哪些主要模块
  6. Available Packages检索框里显示为nothing to show的解决办法
  7. dhcp协议_记录一次DHCP协议的学习过程
  8. python 爬取了租房数据
  9. 芯片级维修一台指示灯全不亮的小米路由器PRO
  10. 刷题记录(1)_HDU-1001→1010
  11. Js 摄氏度和华氏度的转换
  12. 招聘时最看重应聘者的什么特质?
  13. Nginx自签名证书的配置
  14. 陀螺传感器的原始数据
  15. 数据库常见的安全问题有哪些?
  16. 怎么使用大疆无人机建模?
  17. Y05 - 024、数据的应用①:四则运算、运算优先级
  18. React组件通信-非父子组件间的通信
  19. MyEclipse7.02注册码
  20. 自制2.4G全向天线的制作方法

热门文章

  1. android os跑电量咋关,android 优化耗电量
  2. APP价格标签页设计灵感!多款案例选择!
  3. 电商促销海报PSD分层模板|创意合成,这样的设计越来越吃香!
  4. 设计干货素材|使用纹理背景的技巧
  5. 保姆级My SQL-5.7.19安装教程
  6. java制作一个简单的画板_【Java】Thymeleaf一个简单示例
  7. 跨平台异步IO库 libuv 源代码接口详解
  8. The X protocol C-language Binding (XCB) is a replacement for Xlib
  9. PHP MySQL Functions (PDO_MYSQL)
  10. goland sql 脚本运行_Flink 1.9 实战:使用 SQL 读取 Kafka 并写入 MySQL