一、算法简介
TextRank算法是一种基于图的排序算法,用于为文本生成关键字和摘要。该算法的基本思想来源于谷歌的PageRank算法,通过将文本分割成若干组成单元(单词、句子)并建立图模型,利用投票机制对文本中的重要成分进行排序,仅利用单篇文档本身的信息即可实现关键词提取、文摘。
二、算法运用
- 摘要生成:TextRank算法可以根据给定文本生成摘要,通过对文本进行分词、构建词图和传播权重等步骤,提取出文本中的重要信息,生成简洁明了的摘要。
- 关键词提取:通过分析文本中词汇的共现关系和权重,TextRank算法可以提取出文本中的关键词或短语,有助于对文本进行分类、索引和主题分析。
- 文本分类:TextRank算法也可以用于文本分类任务,通过对文本进行分词和权重计算,提取出文本的特征,并根据特征对文本进行分类。
- 信息抽取:TextRank算法可以用于从大量文本中抽取关键信息,例如从新闻报道中提取事件、时间、地点等关键要素。
- 社交媒体分析:在社交媒体分析中,TextRank算法可以用于分析用户发布的文本内容,提取出话题、趋势和关键人物等信息。
- 跨语言应用:TextRank算法也可以应用于跨语言场景,例如机器翻译和跨语言信息检索等任务
三、算法步骤
TextRank算法的计算公式是利用局部词汇之间关系(共现窗口)对后续关键词进行排序,直接从文本本身抽取。其基本步骤如下:
- 把给定的文本T按照完整句子进行分割。
- 对于每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词。
- 构建候选关键词图G = (V,E),其中V为节点集,由上一步生成的候选关键词组成,然后采用共现关系(co-occurrence)构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词。
- 根据公式迭代传播各节点的权重,直至收敛。
- 对节点权重进行倒序排序,从而得到最重要的T个单词,作为候选关键词。
- 由上一步得到最重要的T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词
四、算法实现代码
import jieba
from collections import defaultdict
def textrank(text, top_k=10):
words = list(jieba.cut(text))
graph = defaultdict(set)
for i in range(len(words)):
for j in range(i+1, len(words)):
if j == i + 1:
graph[words[i]].add(words[j])
graph[words[j]].add(words[i])
weights = defaultdict(float)
for node in graph:
weights[node] = 1.0
for _ in range(10):
new_weights = defaultdict(float)
for node in graph:
for neighbor in graph[node]:
new_weights[node] += weights[neighbor] / len(graph[neighbor])
weights = new_weights
ranked_words = sorted(weights.items(), key=lambda x: x[1], reverse=True)
print("Keywords:")
for word, weight in ranked_words[:top_k]:
print(f"{word}: {weight}")
text = "这是一个关于TextRank算法的示例文本,我们将使用这段文本来提取关键词。"
textrank(text)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/adff29247a17d6545c0046acbf4272be.png)
五、算法优缺点
TextRank算法的优点:
- 无监督方式,无需构造数据集训练。
- 算法原理简单且部署简单。
- 继承了PageRank的思想,效果相对较好,相对于TF-IDF方法,可以更充分的利用文本元素之间的关系。
TextRank算法的缺点:
- 结果受分词、文本清洗影响较大,即对于某些停用词的保留与否,直接影响最终结果。
- 虽然与TF-IDF比,不止利用了词频,但是仍然受高频词的影响,因此,需要结合词性和词频进行筛选,以达到更好效果,但词性标注显然又是一个问题。