TF-IDF是一种用于信息检索和文本挖掘的常用加权算法,用于评估一个词在文档或语料库中的重要程度。它结合了词频(TF)和逆文档频率(IDF)两个指标,能够有效过滤掉常见词(如“的”、“是”等),同时突出对文档区分度高的关键词。
Get it :
- TF-IDF 是什么:一种统计方法,衡量词在文档中的重要性。
- 作用:TF-IDF主要用于关键词提取(也叫特征词提取)、文档相似度计算(将文档表示为 TF-IDF 向量,通过余弦相似度比较文档间的相似性)、文本分类与聚类
-
适用场景:适合需要快速、可解释性强的文本分析任务。但对语义敏感的任务需结合深度学习方法。
一、TF(词频)
衡量一个词在当前文档或文本中出现的频率,计算公式为:
或者:
意义:一个词在文档中出现的次数越多,可能越重要。
二、IDF(逆文档频率)
衡量一个词的普遍重要性,即它在整个IDF语料库中的罕见程度。计算公式为:
(加1是为了避免分母为0)
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) # 输出:['深度学习', '人工智能', '核心', '技术']
# 文章如有错误,欢迎大家指正。我们下期再见