英文的用这个nltk.tokenize
的sent_tokenize
,中文不知道,测试着没有效果
from nltk.tokenize import sent_tokenize
sentences = []
# 读取article_text这一行的数据
str = '现在我们有两种选择,一个是总结单个文章,一个是对所有文章进行内容摘要。为了实现我们的目的,我们继续后者。'
str2 = '现在我们有两种选择.一个是总结单个文章.一个是对所有文章进行内容摘要.为了实现我们的目的,我们继续后者.'
str1 = "Maria Sharapova has basically no friends as tennis players on the WTA Tour. The Russian player has no problems in openly speaking about it and in a recent interview she said: 'I don't really hide any feelings too much.'"
print(sent_tokenize(str1))
word_embeddings = {}
f = open('glove.6B.100d.txt',encoding='utf-8')
# 按行读取
for line in f:
# 按照空格进行分割
values = line.split()
# values 数组的第一个位置是当前的英语单词
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
word_embeddings[word] = coefs
f.close()
print(len(word_embeddings))
from sklearn.metrics.pairwise import cosine_similarity
a = [[1, 3, 2,5,6,7], [2, 2, 1,3,4,3],[2,2,2,2,2,2]]
b = cosine_similarity(a)
print(b)
from sklearn.metrics.pairwise import cosine_similarity
a = [[1, 3, 2,5,6,7], [2, 2, 1,3,4,3]]
b = cosine_similarity(a)
print(b)
# 手把手 | 基于TextRank算法的文本摘要(附Python代码)
# http://blog.itpub.net/31562039/viewspace-2286669/
# 1、导入所需的库
import numpy as np
import pandas as pd
import nltk
# 是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。
import networkx as nx
# 下载一次就行了,
# nltk.download('punkt')
# 下载停用词,下载一次就行
# nltk.download('stopwords')
# 加载进来
from nltk.corpus import stopwords
import re
# 将用余弦相似度计算两个句子之间的相似度
from sklearn.metrics.pairwise import cosine_similarity
# 2、读入数据
df = pd.read_csv(r"D:\python\text-summary\基于TextRank的抽取式文本摘要(中文)\english\tennis_articles_v4.csv")
# 3、检查数据
# print(df.head())
# print(df['article_text'][0])
# 4、sent_tokenize:把英文文本分割成句子
from nltk.tokenize import sent_tokenize
# sentences是一个二维数组
sentences = []
# 读取article_text这一行的数据
for s in df['article_text']:
sentences.append(sent_tokenize(s))
sentences = [y for x in sentences for y in x]
# print(sentences)
# print(sentences[:5])
# 5、下载GloVe词向量,提取词向量,准备词向量字典
# glove.6B.100d.txt为已经训练好的词向量
word_embeddings = {}
f = open('glove.6B.100d.txt',encoding='utf-8')
# 按行读取
for line in f:
# 按照空格进行分割
values = line.split()
# values 数组的第一个位置是当前的英语单词
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
word_embeddings[word] = coefs
f.close()
# print(len(word_embeddings))
# 6.文本预处理
# 文本清洗,去除标点、数字、特殊符号、统一小写
# [^a-zA-Z]是去匹配目标字符串中非a—z也非A—Z的字符,并替换为空格
# clean_sentences被清洗以后的句子组成的数组
clean_sentences = pd.Series(sentences).str.replace('[^a-zA-Z]', ' ')
# 大写变小写
clean_sentences = [s.lower() for s in clean_sentences]
# 加载停用词
stop_words = stopwords.words('english')
# 定义移除停用词函数
def remove_stopwords(str):
# 遍历数组中的每个元素,如果这个元素不在停用词列表,则加入事先准备的字符串中
sen = ' '.join([i for i in str if i not in stop_words])
return sen
# 在句子中移除停用词
# 挨个遍历clean_sentences数组中的句子,将每个句子按照空格转为数组,将数组扔进remove_stopwords
# 去除停用词
clean_sentences = [remove_stopwords(r.split()) for r in clean_sentences]
# 7、句子特征向量
# 现在,来为我们的句子生成特征向量。我们首先获取每个句子的所有组成词的向量(从GloVe词向量
# 文件中获取,每个向量大小为100个元素),
# 然后取这些向量的平均值,得出这个句子的合并向量为这个句子的特征向量。
# 所有句子的词向量表示
sentences_vectors = []
for i in clean_sentences:
# 如果句子长度不为0
if len(i) != 0:
# 将句子i按照空格进行分词,得到所有词组成的数组
# 遍历数组中的每个词,在word_embeddings这个词典中寻找这个词对应的词向量
# 例如:word_embeddings.get('the', np.zeros((100,))) 意思为,在word_embeddings中寻找
# the的词向量,如果不存在,则用长度为100的一维数组(值全部为0)来代替
# [word_embeddings.get(w,np.zeros((100,))) for w in i.split()]:这个是将句子所有词的词向量组成二维数组
# sum([word_embeddings.get(w,np.zeros((100,))) for w in i.split()]) :将二维数组中每个一维数组相同位置的值进行求和
# 求和之后对应的位置在除以6,这样得到整个句子的词向量表示
v = sum([word_embeddings.get(w,np.zeros((100,))) for w in i.split()])/(len(i.split())+1e-2)
else:
v = np.zeros((100,))
sentences_vectors.append(v)
# 8、相似矩阵准备
# 下一步是找出句子之间的相似性,我们将使用余弦相似性来解决这个问题。
# 让我们为这个任务创建一个空的相似度矩阵,并用句子的余弦相似度填充它。
# 首先定义一个n乘n的零矩阵,然后用句子间的余弦相似度填充矩阵,这里n是句子的总数。
similarity_matrix = np.zeros((len(clean_sentences),len(clean_sentences)))
# print(sentences_vectors)
# print(similarity_matrix)
# 用余弦相似度初始化相似度矩阵(全零矩阵)
for i in range(len(clean_sentences)):
for j in range(len(clean_sentences)):
# 这里的if用于排序自己与自己计算相似度
if i != j:
# 遍历sentences_vectors的句子向量,例如第一行与第二行计算相似度,第一行与第三行计算相似度等等,然后存入
# similarity_matrix中的指定位置
# reshape(1,-1)将n*n的矩阵变为n*1的
similarity_matrix[i][j] = cosine_similarity(
sentences_vectors[i].reshape(1,-1),sentences_vectors[j].reshape(1,-1)
)
print(similarity_matrix)
# 9. 应用PageRank算法
# 在进行下一步之前,我们先将相似性矩阵sim_mat转换为图结构。这个图的节点为句子,边用句子之间的相似性分数表示。
# 在这个图上,我们将应用PageRank算法来得到句子排名。
nx_graph = nx.from_numpy_array(similarity_matrix)
scores = nx.pagerank(nx_graph)
# 10. 摘要提取
# 遍历sentences数组,i是当前的位置角标,s是当前的句子
# scores[i]:从scores中取出第i个位置的分数与当前句子组成一对
# 将所有的分数,句子信息组成的list赋值给ranked_sentences
# sorted:并排序,reverse=True降序
ranked_sentences = sorted(
((scores[i],s) for i,s in enumerate(sentences)),reverse=True
)
# 排序
for i in range(10):
print(ranked_sentences[i][1])
# 打印得分最高的前10个句子,即为摘要