赞
踩
英文的用这个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个句子,即为摘要
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。