当前位置:   article > 正文

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

textrank实现英文文本摘要

资料

数据集

知识补充

将英文文章按照句子拆分

英文的用这个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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

将已经训练好的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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

余弦相似度

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)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
查看:余弦相似度

最终

# 手把手 | 基于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个句子,即为摘要
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/461288
推荐阅读
相关标签
  

闽ICP备14008679号