Python关键词提取实战:TF-IDF与TextRank算法详解

白榆
白榆
发布时间:2026-10-12 | 2人浏览过
原创

本文详细介绍Python中两种主流的关键词提取技术:TF-IDF与TextRank。通过解析词频-逆文档频率原理及基于图排序的TextRank算法,结合jieba库实现代码示例,对比两者在提取民营企业、贷款等关键词时的权重差异,帮助开发者根据场景选择最优方案。

TF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种基于数值统计的文本分析方法。通过计算该指标,我们可以量化评估某个词汇在特定文档相对于整个数据集中的重要程度。

TF-IDF的概念

TF-IDF由两个核心部分构成:词频(TF)和逆文档频率(IDF)。首先解释词频,其含义直观,指代特定词汇在单篇文档或整个数据集中出现的频率。具体计算公式如下:

TF(t) = 词t在一篇文档中出现的次数 / 这篇文档的总词数

第二部分逆文档频率(IDF)用于修正词频的偏差,反映单词对文档的独特重要性。在单纯计算TF时,所有词汇被视为同等重要,导致高频出现但信息量低的词汇得分虚高。例如,某词出现100次可能不如出现较少但更具区分度的词有价值。因此,引入权重机制来衡量每个词的实际重要性,IDF的计算公式为:

IDF(t) = log10(文档的总篇数 / 包含词t的文档篇数)

综合上述两部分,TF-IDF的计算方法如下:

TF-IDF = TF * IDF = (词t在一篇文档中出现的次数 / 这篇文档的总词数) * log10(文档的总篇数 / 包含词t的文档篇数)

应用场景

TF-IDF算法适用于以下典型场景:

在文本数据分析中,利用TF-IDF可以精准提取最具代表性的关键词。

若正在开发文本摘要生成应用,TF-IDF是构建统计模型时至关重要的特征指标。

搜索引擎广泛采用TF-IDF权重变化来评估文档得分,并计算其与用户检索查询的相关性。

在文本分类任务中,TF-IDF常与词袋模型(BOW)结合使用以提升分类效果。

TextRank

TextRank是一种基于图的文本排序算法,其核心思想源自谷歌的PageRank算法。该方法将文本划分为若干单元(如单词或句子),构建图模型,并利用投票机制对文本中的重要成分进行排序。TextRank仅依赖单篇文档自身的内部信息即可实现关键词提取和文本摘要,无需像LDA或HMM等模型那样需要预先对多篇文档进行训练学习,因其简洁高效而得到广泛应用。

基于TextRank的关键词提取流程

关键词抽取旨在从给定文本中自动识别出若干有意义的词语或词组。TextRank算法通过分析局部词汇间的共现关系(共现窗口),对后续关键词进行排序,直接基于文本本身进行抽取。其主要步骤如下:

首先,将给定的文本T按照完整句子进行分割,即:

对每个句子执行分词和词性标注处理,并过滤停用词,仅保留指定词性的词汇(如名词、动词、形容词)。记保留后的候选关键词集合为,其中表示经过筛选后的候选关键词。

构建候选关键词图G = (V, E),其中V为节点集,由步骤(2)生成的候选关键词组成。接着采用共现关系(co-occurrence)构造任意两点之间的边,仅当两个节点对应的词汇在长度为K的窗口内共现时,两点间才存在边,K表示窗口大小,即最多允许共现K个单词。

根据前述图模型公式,迭代传播各节点的权重,直至系统收敛。

对节点权重进行倒序排序,从而提取出最重要的T个单词,作为最终的候选关键词。

Python实现代码示例:

# 导入库
import jieba.analyse # 导入关键字提取库
import pandas as pd # 导入pandas
import newspaper
# 读取文本数据
# 获取文章 银保监会出台新政为例
article = newspaper.Article('https://finance.sina.com.cn/money/bank/bank_hydt/2019-02-25/doc-ihsxncvf7656807.shtml', language='zh')
# 下载文章
article.download()
# 解析文章
article.parse()
# 对文章进行nlp处理
article.nlp()
# nlp处理后的文章拼接
string_data = "".join(article.keywords)
# 关键字提取
def get_key_words(string_data, how=''):
  # topK:提取的关键字数量,不指定则提取全部;
  # withWeight:设置为True指定输出词对应的IF-IDF权重
  if how == 'textrank':
    # 使用TextRank 算法
    tags_pairs = jieba.analyse.textrank(string_data, topK=5, withWeight=True) # 提取关键字标签
  else:
    # 使用TF-IDF 算法
    tags_pairs = jieba.analyse.extract_tags(string_data, topK=5, withWeight=True) # 提取关键字标签
  tags_list = [] # 空列表用来存储拆分后的三个值
  for i in tags_pairs: # 打印标签、分组和TF-IDF权重
    tags_list.append((i[0], i[1])) # 拆分三个字段值
  tags_pd = pd.DataFrame(tags_list, columns=['word', 'weight']) # 创建数据框
  return tags_pd

keywords = get_key_words(string_data)
print("#####################TF-IDF####################")
print(keywords)

keywords_tr = get_key_words(string_data, how='textrank')
print("#####################textrank####################")
print(keywords_tr)

运行结果如下:

#####################TF-IDF####################
  word  weight
0 民营企业 0.327466
1  贷款 0.112652
2  融资 0.089557
3 商业银行 0.084860
4  服务 0.072322
#####################textrank####################
  word  weight
0 民营企业 1.000000
1   要 0.553043
2  贷款 0.493173
3  融资 0.379846
4  服务 0.371273

以上关于Python数据分析中关键词提取方式的介绍即为核心内容,希望能为大家提供参考。欢迎大家继续支持本站获取更多技术资讯。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表