文本分析(非结构化数据挖掘)——特征词选择(基于TF-IDF权值)

TF-IDF是一种用于信息检索和文本挖掘的常用加权算法,用于评估一个词在文档或语料库中的重要程度。它结合了词频(TF)逆文档频率(IDF)两个指标,能够有效过滤掉常见词(如“的”、“是”等),同时突出对文档区分度高的关键词。

Get it :

  • TF-IDF 是什么:一种统计方法,衡量词在文档中的重要性。
  • 作用:TF-IDF主要用于关键词提取(也叫特征词提取)、文档相似度计算(将文档表示为 TF-IDF 向量,通过余弦相似度比较文档间的相似性)、文本分类与聚类
  • 适用场景:适合需要快速、可解释性强的文本分析任务。但对语义敏感的任务需结合深度学习方法。


一、TF(词频)

衡量一个词在当前文档文本中出现的频率,计算公式为:

或者:

意义:一个词在文档中出现的次数越多,可能越重要。

二、IDF(逆文档频率)

衡量一个词的普遍重要性,即它在整个IDF语料库中的罕见程度。计算公式为:

(加1是为了避免分母为0) 

扫描二维码关注公众号,回复: 17617336 查看本文章

IDF语料库:可以理解为一个txt文件,记录着每个词的IDF值。形如,

IDF
优惠 8.5
包邮 7.0
折扣 8.0

意义:如果一个词在多数文档中都出现(如“的”),其IDF值会很低,反之则高。

三、TF-IDF的计算

TF-IDF有很多表达式形式,以其中一种简单的形式为例:

将TF和IDF相乘,得到词 t 在文档 d中的权重:

说明:某些计算分析工具(如python的jieba库)内置有官方的IDF语料库,无需自定义,只需要查表(IDF语料库)即可快速得到当前词的IDF值,而当前词的TF值就基于当前文本(即你要进行文本分析的文本、段落等) 来计算。因此,可以很快计算出TF-IDF。

核心思想:一个词在当前文档中出现次数多(TF高),且在语料库中罕见(IDF高),则TF-IDF值高,代表重要性强。

四、基于Python中jieba库的TF-IDF实现

方法:jieba.analyse.extract_tags()

方法的参数

参数名 作用
topK 返回关键词的数量。
withWeight 是否返回关键词的权重值(True/False,默认 False)。
allowPOS 指定保留的词性(如 ['n', 'v', 'ns'] 表示只提取名词、动词、地名)。默认为None,即不限词性

说明

  • 内置 IDF 语料库:jieba 自带一个预计算的 IDF 词典(基于大规模中文语料统计),默认无需自定义。

  • 用户可覆盖(自定义语料库):通过 jieba.analyse.set_idf_path() 加载自定义 IDF 文件(适用于专业领域或特殊需求)。

:大多数情况下,我们处理通用文本时,我们只需要使用内置的语料库即可,即直接调用jieba.analyse.extract_tags(),而不需要自定义语料库。当然了,可以自己去网上找语料库,又或者自己训练语料库(不建议)。

代码示例(使用内置语料库): 

import jieba.analyse

text = '无声的博弈:现代医疗体系中的生命与伦理在这个被科技重塑的时代,医疗早已超越了简单的治病救人范畴,演变成一场关乎生命质量、资源分配与社会公平的复杂博弈。当基因编辑技术让我们能够"设计"婴儿,当人工智能比医生更早发现癌症征兆,医疗的边界正在被不断拓展,同时也带来了一系列深刻的伦理困境。现代医疗体系呈现出明显的技术悖论。一方面,质子治疗、机器人手术等尖端技术创造了无数生命奇迹;另一方面,过度医疗、天价药费又使许多家庭陷入经济困境。美国国立卫生研究院的数据显示,约40%的医疗检查属于不必要的过度医疗,这不仅浪费资源,还可能给患者带来额外风险。这种技术崇拜背后的商业逻辑,常常使医疗偏离了"以患者为中心"的初衷。更为严峻的是全球医疗资源的结构性失衡。世界卫生组织报告指出,占全球人口84%的发展中国家只享有11%的医疗支出。在非洲部分地区,一位医生需要照顾上万名患者;而在发达国家,医疗资源过剩导致的"防御性医疗"屡见不鲜。这种不平等不仅体现在地域之间,即使在同一个国家,城乡差距、医保覆盖差异也制造着不同的生命预期。医疗本质上是对生命的敬畏与守护。古希腊医生希波克拉底誓言中"不伤害"的原则,至今仍是医者的基本信条。在技术狂奔的时代,我们更需要回归这一原点:医疗不是冰冷的仪器数据,而是对生命尊严的捍卫;不是商业利润的来源,而是社会良知的体现。当我们在ICU外做生死抉择时,真正考验的不是医疗水平,而是一个社会的文明程度。医疗的未来,应当是人本主义的复归。这需要建立更公平的资源分配机制,发展精准而适度的诊疗技术,培养既有专业能力又具人文关怀的医疗人才。唯有如此,医疗才能真正成为守护人类健康的坚固堡垒,而非加剧社会分化的又一鸿沟。'

# TF-IDF算法
keywords = jieba.analyse.extract_tags(
    text, 
    topK=5,                   # 提取前5个关键词
    withWeight=True,          # 返回权重值
    allowPOS=('n', 'vn', 'v') # 只提取名词、动名词、动词
)

print("TF-IDF关键词提取:")
for word, weight in keywords:
    print(f"{word}: {weight:.2f}")

# 输出如下:
# TF-IDF关键词提取:
# 医疗: 0.70
# 生命: 0.22
# 技术: 0.14
# 资源分配: 0.13
# 患者: 0.11

如果需要自定义语料库,则

import jieba.analyse

# 加载自定义IDF
jieba.analyse.set_idf_path("myIDF.txt")

text = "春季大促,全场优惠,满300包邮!"
keywords = jieba.analyse.extract_tags(text, topK=3)

还有就是,在计算TF-IDF之前,可以先加载停用词(过滤掉一些没有用的词,比如‘一些’,‘一个’等):

  • 停用词较多时:
import jieba.analyse

# 加载自定义IDF
jieba.analyse.set_idf_path("myIDF.txt")

# 设置停用词文件路径(停用词过多时)
jieba.analyse.set_stop_words("stop_words.txt")

text = "春季大促,全场优惠,满300包邮!"
keywords = jieba.analyse.extract_tags(text, topK=3)
  • 停用词较少时:
# 停用词较少时
from jieba.analyse import TFIDF

# 自定义停用词列表
stop_words = ["的", "是", "在", "了", "呢"]

# 初始化TF-IDF分析器并设置停用词
tfidf = TFIDF(stop_words=stop_words)

text = "深度学习是人工智能的核心技术。"
keywords = tfidf.extract_tags(text, topK=5)
print(keywords)  # 输出:['深度学习', '人工智能', '核心', '技术']

# 文章如有错误,欢迎大家指正。我们下期再见