基于TextRank算法的文本摘要(处理英文)(附Python代码)

24 篇文章 0 订阅
3 篇文章 0 订阅

资料

数据集

知识补充

将英文文章按照句子拆分

英文的用这个nltk.tokenizesent_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))

在这里插入图片描述

将已经训练好的GloVe词向量转为字典

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个句子,即为摘要
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值