100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 基于TextRank算法的自动文摘

基于TextRank算法的自动文摘

时间:2024-05-17 14:31:47

相关推荐

基于TextRank算法的自动文摘

-------前言:随着互联网、社交媒体的迅速发展,各类新闻文章层出不穷,读者在面对海量新闻信息时,难以有效发现哪些是自己感兴趣的新闻内容。为了帮助读者快速了解新闻文章,并找到其感兴趣的新闻内容。让计算机“读懂文本”,通过为新闻文档生成简短摘要,帮助读者快速理解新闻内容。

目录

1. PageRank算法原理解析

2. TextRank算法原理解析

3. TextRank算法实现

此处代码实现更多是为了理解算法本身,因此本博客TextRank实现的文本向量表示也是简单的使用词袋表示,代码实现较粗糙。若有错误也请读者多多担待,随时指出。

1. PageRank算法原理解析

TextRank其基本思想来源于谷歌的 PageRank算法, PageRank,又称网页排名、谷歌左侧排名,是一种由搜索引擎根据网页之间相互的超链接计算的技术,Google用它来体现网页的相关性和重要性,在搜索引擎优化操作中是经常被用来评估网页优化的成效因素之一。

PageRank核心思想(投票机制):

a)数量:若一个网页被多个网页所推荐,那么这个网页很重要。

b)质量:假设B网页被推荐,则推荐B的网页网页质量越高,则将会给B网页更高的打分。 所以越重要的网页推荐网页B,则网页B越重要。

根据以上,PageRank首先赋值每个网页相同分数,通过迭代更新每个网页分数,直到 得分稳定或达到一定迭代次数。

推荐的意思:假设A网页有一个B网页的超链接,则说明A网页推荐了B网页;

基于数量与质量,可举一个例子,张三竞选班长,如下。

1.数量:若推荐张三当班长的人多,则说明张三能力强(等同于网页越重要)。

2.质量:若此处校长推荐张三当班长(校长算是个能力强的人吧,这里就不考虑走后门了^0^),则从侧面说明张三能力强。

在此给出PageRank核心公式:

见到它,可别直接被吓着了,现在我们只关心以下公式,在此先给出d和(1 - d)是什么意思。

d: 你在一个网页去点击此网页推荐的网页的概率。

1 - d: 就是你不去点击此网页推荐的网页的概率了呗,至于为什么要加上他,你可以简单理解为是为了防止一些特殊情况,特殊情况具体见此

PageRank浓缩精华公式:

这里我们是省略了 d 的,因此在此处在一个网页点击它推荐的网页的概率之和为1!!!。

具体怎么理解这些数学符号,如下:

对于如何更加深入理解 In(x) 与 L(k) , 我们还是使用竞选班长的例子,如下图:

​​

现在是不是已经深入理解了,那们我们将会列举真实网页例子了哈!!!

如图,我们假设现在有 4 个网页 ABCD

各网页的PR值如下图

是不是很懵逼 i = 1开始后的 PR值,别慌,如下图。

为了读者您方便看,我把公式和图这些都给您放一起了呢^o^

后面的计算岂不就是如上图一直这么循环下去,但是!!!我如果每次计算都傻乎乎的列一大堆公式,岂不是很不合理!!!那我们直接上点难度,来,矩阵运算!!!

主要难点就是理解概率转移矩阵 M,在此分析一下 A 网页。

A 网页:指向 B,C,因此在此网页点击 B 或者 C的概率均为 1/2,

为什么一列的概率和为 1 ,在前面已提过,此处浓缩精华公式是建立在概率 d 之上的!!!

基于上,我们的整个PageRank公式可理解为下方矩阵运算表达式

1. TextRank算法原理解析

TextRank 源于 PageRank,其核心原理极其相似,也是采用投票机制,较为不同的是PageRank采用概率转移矩阵更新PR值,且图结构为有向无权图;而TextRank将会采用相似度矩阵更新TR值,图结构为无向有权图。

TextRank核心思想:

a)概括性:若句子 A 与众多句子相似性均高,说明该句子能更多的替代全文大多数句子,概括全文大多数句子意思,那么这个句子很重要。

b)质量:有句子A,B,若句子 A 很重要且 B 与 A 有高相似度,则句子 B 很重要。

TextRank核心公式

老规矩,别被吓着了,来看看浓缩精华公式!!!

TextRank浓缩精华公式

深入理解数学符号

稍微简化

举个例子吧,见下图 ABCD四个句子,这里我假设了一些句子相似度。

因此可建立各个句子的相似度矩阵(其实也为该无向有权图的邻接矩阵)

那么如何进行计算呢?如下图:

基于此,你应该也理解了他大致的流程,那么这里是否也可以做一个矩阵的表达式呢?Sure,but 你需要对我们的相似度矩阵做一些变化,得到一个新的矩阵。

如何变化,我们仔细观察上面的公式推导,每一项的分母是否就是K 那一列的和,因此:

大家可在此对比两个矩阵

基于此,TextRank公式也理解的差不多了,那么他们的矩阵表达式如下:

3. TextRank算法实现

基于以上,我将用TextRank算法实现一个摘要分为 5 个步骤,如下:

给出今天我们要做的新闻文本:

欧亚经济委员会执委会一体化与宏观经济委员格拉济耶夫日前接受新华社记者采访时高度评价中国抗击新冠疫情工作,并表示期待欧亚经济联盟与中国加强抗疫合作,共同推动地区发展。格拉济耶夫说,中国依靠治理体系与全国人民协同努力,在抗疫工作上取得极大成效。中国采取的措施符合全球利益,格拉济耶夫认为,中国经济将会快速恢复,欧亚经济联盟许多企业与中国市场联系紧密!应与中国加强合作,采取协调措施降低此次疫情带来的消极影响。格拉济耶夫建议,面对疫情,欧亚经济联盟与中国扩大信息技术应用,推进商品清关程序自动化,更广泛地利用相关机制,为对外经济活动参与者建立绿色通道。谈及双方在医学卫生领域的合作时,格拉济耶夫说:“我们应从当前考验中汲取经验,在生物安全领域制定共同规划并联合开展生物工程研究”,格拉济耶夫还表示,俄罗斯与其他欧亚经济联盟国家金融市场更易受国际投机行为影响。欧亚经济联盟应借鉴中国的人民币国际化经验,加强与中国银行体系和金融市场对接。欧亚经济联盟成立于,成员国包括俄罗斯、哈萨克斯坦、白俄罗斯、吉尔吉斯斯坦和亚美尼亚。欧亚经济委员会执委会是欧亚经济联盟最高权力机构

给出原文:

text = '欧亚经济委员会执委会一体化与宏观经济委员格拉济耶夫日前接受新华社记者采访时高度评价中国抗击新冠疫情工作,并表示期待欧亚经济联盟与中国加强抗疫合作,共同推动地区发展。格拉济耶夫说,中国依靠治理体系与全国人民协同努力,在抗疫工作上取得极大成效。中国采取的措施符合全球利益,格拉济耶夫认为,中国经济将会快速恢复,欧亚经济联盟许多企业与中国市场联系紧密!应与中国加强合作,采取协调措施降低此次疫情带来的消极影响。格拉济耶夫建议,面对疫情,欧亚经济联盟与中国扩大信息技术应用,推进商品清关程序自动化,更广泛地利用相关机制,为对外经济活动参与者建立绿色通道。谈及双方在医学卫生领域的合作时,格拉济耶夫说:“我们应从当前考验中汲取经验,在生物安全领域制定共同规划并联合开展生物工程研究”,格拉济耶夫还表示,俄罗斯与其他欧亚经济联盟国家金融市场更易受国际投机行为影响。欧亚经济联盟应借鉴中国的人民币国际化经验,加强与中国银行体系和金融市场对接。欧亚经济联盟成立于,成员国包括俄罗斯、哈萨克斯坦、白俄罗斯、吉尔吉斯斯坦和亚美尼亚。欧亚经济委员会执委会是欧亚经济联盟最高权力机构'

1. 把原文分割成单个句子

import resentences = re.split(r'[。!?;:]', text)# 获取句子的个数count_sentences = len(sentences)print(f'经过第一步,原文已被分割成单个句子,共{count_sentences}句, 如下:\n')for i, s in enumerate(sentences):print(f'·第{i +1 }句: {s}。')

2. 为字词编号,以词袋表示将句子向量化

import jiebajieba.setLogLevel(jieba.logging.INFO)# 存储所有字/词 =======(sum(a, [])将二维列表转一维)all_words = sum([jieba.lcut(sen) for sen in sentences], [])# 去重并按all_words的顺序排序words = list(set(all_words))words.sort(key=all_words.index)# 建立一个 词:编号 的词典words_num = {w:num for num,w in enumerate(words)}N = len(words)print(f'\n不同字词个数:{N}\n')# 句子向量矩阵初始化,大小为 count_sentences * Dsentences_vectors = [[0 for j in range(N)] for i in range(count_sentences)]for i in range(count_sentences):for word in jieba.lcut(sentences[i]):sentences_vectors[i][words_num[word]] += 1print(f'==经过第②步,句子向量已生成,大小({count_sentences} * {N}), 如下:\n')for s_v in sentences_vectors:print(s_v)

真稀疏矩阵。。。。。。。

3.计算各句子向量的相似性并存放在矩阵中,即构建相似度矩阵

import numpy as npfrom sklearn.metrics.pairwise import cosine_similarityS = np.zeros((count_sentences, count_sentences))for i in range(count_sentences):for j in range(count_sentences):if i != j:S[i][j] = cosine_similarity(np.array(sentences_vectors[i]).reshape(1, -1),np.array(sentences_vectors[j]).reshape(1, -1))print(f'==经过第③步,句子相似度矩阵已生成,大小为{S.shape}, 如下:\n')for s_m in S:print(s_m)

4. 利用相似度矩阵求出矩阵M,迭代更新每个句子的TR值

d = 0.85#(1 - d)的系数那儿,在此处定义为 N * 1 的矩阵形式,这样后面才能加上d_array = np.array([(1 - d)/count_sentences for i in range(count_sentences)]).reshape(count_sentences, 1)# 初始化 TR 值矩阵 ,大小 (count_sentence * 1)V = np.array([[1 / count_sentences] for i in range(count_sentences)]).reshape(count_sentences, 1)# S 中每一列的和S_sum = [np.sum(s_m) for s_m in S.T]M = np.array([[S[i][j] / S_sum[j] for j in range(count_sentences)] for i in range(count_sentences)])for i in range(200):V = d_array + d * M.dot(V)scores = {i:s for i, s in enumerate(list(V))}print(f'==经过第④步,各句子的分数已生成,如下:\n')for i, s in scores.items():print(f'·句子{i + 1}, 分数值:{s}')

5. 选取一定数量的排名靠前的句子构成最后的摘要

rank_sentences = sorted([[i, s, scores[i]]for i,s in enumerate(sentences)], key=lambda x:x[2], reverse=True)count_digist = count_sentences // 3 if count_sentences // 3 > 0 else 1print(f'==经过第⑤步,抽取{count_digist}个句子作为摘要,如下:\n')for i in range(count_digist):print(f'·摘要{i + 1}:{rank_sentences[i][1]}', end='。\n')

大家可对比下原文和生成的摘要,就咱们这么糙的实现,确实一般般------

原文:欧亚经济委员会执委会一体化与宏观经济委员格拉济耶夫日前接受新华社记者采访时高度评价中国抗击新冠疫情工作,并表示期待欧亚经济联盟与中国加强抗疫合作,共同推动地区发展。格拉济耶夫说,中国依靠治理体系与全国人民协同努力,在抗疫工作上取得极大成效。中国采取的措施符合全球利益,格拉济耶夫认为,中国经济将会快速恢复,欧亚经济联盟许多企业与中国市场联系紧密!应与中国加强合作,采取协调措施降低此次疫情带来的消极影响。格拉济耶夫建议,面对疫情,欧亚经济联盟与中国扩大信息技术应用,推进商品清关程序自动化,更广泛地利用相关机制,为对外经济活动参与者建立绿色通道。谈及双方在医学卫生领域的合作时,格拉济耶夫说:“我们应从当前考验中汲取经验,在生物安全领域制定共同规划并联合开展生物工程研究”,格拉济耶夫还表示,俄罗斯与其他欧亚经济联盟国家金融市场更易受国际投机行为影响。欧亚经济联盟应借鉴中国的人民币国际化经验,加强与中国银行体系和金融市场对接。欧亚经济联盟成立于,成员国包括俄罗斯、哈萨克斯坦、白俄罗斯、吉尔吉斯斯坦和亚美尼亚。欧亚经济委员会执委会是欧亚经济联盟最高权力机构摘要:·摘要1:中国采取的措施符合全球利益,格拉济耶夫认为,中国经济将会快速恢复,欧亚经济联盟许多企业与中国市场联系紧密。·摘要2:欧亚经济委员会执委会一体化与宏观经济委员格拉济耶夫日前接受新华社记者采访时高度评价中国抗击新冠疫情工作,并表示期待欧亚经济联盟与中国加强抗疫合作,共同推动地区发展。·摘要3:格拉济耶夫建议,面对疫情,欧亚经济联盟与中国扩大信息技术应用,推进商品清关程序自动化,更广泛地利用相关机制,为对外经济活动参与者建立绿色通道。

完整代码

# coding:utf-8import reimport jiebaimport networkximport numpy as npfrom sklearn.metrics.pairwise import cosine_similarityjieba.setLogLevel(jieba.logging.INFO)text = '欧亚经济委员会执委会一体化与宏观经济委员格拉济耶夫日前接受新华社记者采访时高度评价中国抗击新冠疫情工作,并表示期待欧亚经济联盟与中国加强抗疫合作,共同推动地区发展。格拉济耶夫说,中国依靠治理体系与全国人民协同努力,在抗疫工作上取得极大成效。中国采取的措施符合全球利益,格拉济耶夫认为,中国经济将会快速恢复,欧亚经济联盟许多企业与中国市场联系紧密!应与中国加强合作,采取协调措施降低此次疫情带来的消极影响。格拉济耶夫建议,面对疫情,欧亚经济联盟与中国扩大信息技术应用,推进商品清关程序自动化,更广泛地利用相关机制,为对外经济活动参与者建立绿色通道。谈及双方在医学卫生领域的合作时,格拉济耶夫说:“我们应从当前考验中汲取经验,在生物安全领域制定共同规划并联合开展生物工程研究”,格拉济耶夫还表示,俄罗斯与其他欧亚经济联盟国家金融市场更易受国际投机行为影响。欧亚经济联盟应借鉴中国的人民币国际化经验,加强与中国银行体系和金融市场对接。欧亚经济联盟成立于,成员国包括俄罗斯、哈萨克斯坦、白俄罗斯、吉尔吉斯斯坦和亚美尼亚。欧亚经济委员会执委会是欧亚经济联盟最高权力机构'print(f'未经处理的原文如下:\n{text}')sentences = re.split(r'[。!?;:]', text)# 获取句子的个数count_sentences = len(sentences)print(f'经过第一步,原文已被分割成单个句子,共{count_sentences}句, 如下:\n')for i, s in enumerate(sentences):print(f'·第{i +1 }句: {s}。')all_words = sum([jieba.lcut(sen) for sen in sentences], [])words = list(set(all_words))words.sort(key=all_words.index)words_num = {w:num for num,w in enumerate(words)}N = len(words)print(f'\n不同字词个数:{N}\n')# 句子向量矩阵初始化,大小为 count_sentences * Dsentences_vectors = [[0 for j in range(N)] for i in range(count_sentences)]for i in range(count_sentences):for word in jieba.lcut(sentences[i]):sentences_vectors[i][words_num[word]] += 1print(f'==经过第②步,句子向量已生成,大小({count_sentences} * {N}), 如下:\n')for s_v in sentences_vectors:print(s_v)S = np.zeros((count_sentences, count_sentences))for i in range(count_sentences):for j in range(count_sentences):if i != j:S[i][j] = cosine_similarity(np.array(sentences_vectors[i]).reshape(1, -1),np.array(sentences_vectors[j]).reshape(1, -1))print(f'==经过第③步,句子相似度矩阵已生成,大小为{S.shape}, 如下:\n')for s_m in S:print(s_m)d = 0.85d_array = np.array([(1 - d)/count_sentences for i in range(count_sentences)]).reshape(count_sentences, 1)# 初始化 TR 值矩阵 ,大小 (count_sentence * 1)V = np.array([[1 / count_sentences] for i in range(count_sentences)]).reshape(count_sentences, 1)S_sum = [np.sum(s_m) for s_m in S.T]M = np.array([[S[i][j] / S_sum[j] for j in range(count_sentences)] for i in range(count_sentences)])for i in range(200):V = d_array + d * M.dot(V)scores = {i:s for i, s in enumerate(list(V))}print(f'==经过第④步,各句子的分数已生成,如下:\n')for i, s in scores.items():print(f'·句子{i + 1}, 分数值:{s}')rank_sentences = sorted([[i, s, scores[i]]for i,s in enumerate(sentences)], key=lambda x:x[2], reverse=True)count_digist = count_sentences // 3 if count_sentences // 3 > 0 else 1print(f'==经过第⑤步,抽取{count_digist}个句子作为摘要,如下:\n')for i in range(count_digist):print(f'·摘要{i + 1}:{rank_sentences[i][1]}', end='。\n')

咱就是说,这代码实现是真糙,连停用词都没去,就帮助下那些还没理解TextRank算法的同学吧!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。