机器学习-TextRank算法学习

一、算法简介

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))  
      
    # 过滤停用词(可选步骤,需要提供停用词列表)  
    # stopwords = set(['的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一个', '上', '到', '也'])  
    # words = [word for word in words if word not in stopwords]  
      
    # 构建词图  
    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)  
      
    # 输出前top_k个关键词  
    print("Keywords:")  
    for word, weight in ranked_words[:top_k]:  
        print(f"{word}: {weight}")  
  
# 示例文本  
text = "这是一个关于TextRank算法的示例文本,我们将使用这段文本来提取关键词。"  
  
# 调用TextRank函数并输出结果  
textrank(text)

在这里插入图片描述

五、算法优缺点

TextRank算法的优点:
  • 无监督方式,无需构造数据集训练。
  • 算法原理简单且部署简单。
  • 继承了PageRank的思想,效果相对较好,相对于TF-IDF方法,可以更充分的利用文本元素之间的关系。
TextRank算法的缺点:
  • 结果受分词、文本清洗影响较大,即对于某些停用词的保留与否,直接影响最终结果。
  • 虽然与TF-IDF比,不止利用了词频,但是仍然受高频词的影响,因此,需要结合词性和词频进行筛选,以达到更好效果,但词性标注显然又是一个问题。
  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值