问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

解析TF-IDF模型公式、应用、优缺点及实战

创作时间:
作者:
@小白创作中心

解析TF-IDF模型公式、应用、优缺点及实战

引用
CSDN
1.
https://blog.csdn.net/weixin_71246590/article/details/144272669

TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和文本挖掘中广泛使用的统计方法,用于评估一个词对一个文档或语料库中的重要程度。本文将详细介绍TF-IDF模型的基本概念、计算方法、应用场景及其优缺点,并通过Python代码演示如何使用gensim库实现TF-IDF模型。

一、TF(Term Frequency)——词频

词频(Term Frequency,简称TF)是指某个词在文档中出现的次数。它衡量了一个词在某一篇文档中的重要性。TF的计算公式如下:

$$
TF(t) = \frac{\text{词} t \text{在文档中出现的次数}}{\text{文档的总词数}}
$$

例如,假设文档 $d$ 有100个词,其中词 $t$ 出现了5次,那么TF就是:

$$
TF(t) = \frac{5}{100} = 0.05
$$

TF的直观意义:TF越高,说明该词在文档中出现的频率越高,可能是某一篇文档的一个重要关键词。

二、IDF(Inverse Document Frequency)——逆文档频率

逆文档频率(IDF)是用来衡量某个词在所有文档中的普遍程度。常见的词(如“的”、“是”等)出现在大多数文档中,它们的IDF值会较低。IDF的计算公式如下:

$$
IDF(t) = \log \frac{N}{DF(t)}
$$

其中:

  • $N$ 是文档的数量,就是有几篇文档。
  • $DF(t)$ 是包含词 $t$ 的文档数量(Document Frequency)。

IDF的直观意义:对于词 $t$ 来说,包含词 $t$ 的文档数量越多,IDF越低,说明该词在大多数文档中都出现,因此它们对区分文档的能力较弱。反之,IDF越高的词在所有文档中出现频率低,说明它是具有区分度的关键词。

三、TF-IDF计算

碎碎念:如果一个词它在某篇文章中的词频很高(TF很高),它在别的文章又不怎么出现(IDF很高),这两个因素综合考虑的话,越能说明该词的区分度。

TF-IDF模型结合了TF和IDF两个因素,用来评估词语在文档中的重要性。它的计算公式是:

$$
TF-IDF(t) = TF(t) \times IDF(t)
$$

  • TF-IDF的直观意义
  • 如果一个词在某篇文档中频繁出现(TF高),同时这个词在其他文档中出现较少(IDF高),那么这个词对该文档的意义较大,TF-IDF值也会较高。
  • 如果一个词在文档中出现频繁,但在所有文档中也很常见(IDF低),则它的TF-IDF值较低。

四、TF-IDF的应用及其优缺点

TF-IDF在自然语言处理(NLP)和信息检索中有广泛应用,以下是几种常见的应用

  • 关键词提取:通过计算每个词的TF-IDF值,挑选出那些TF-IDF值高的词作为文档的关键词。
  • 文本分类:使用TF-IDF作为文本的特征,结合机器学习算法(如SVM、Naive Bayes等)对文档进行分类。
  • 信息检索:搜索引擎通过计算查询词和文档中词的TF-IDF值,返回与查询最相关的文档。

优缺点:

  • 优点
  • 计算简单,易于实现。
  • 可以有效地提取文本中的关键信息,避免了常见词的干扰。
  • 可以处理大规模文本数据,且具有较好的效果。
  • 缺点
  • 无法考虑词序和上下文信息,忽略了词与词之间的关系。
  • 对于一些多义词或语境依赖较强的词,TF-IDF的效果较差。
  • 假设词频和文档频率是完全独立的,可能不完全符合真实语境中的情况。

五、调包实战

下面通过Python代码演示如何使用gensim库实现TF-IDF模型:

from gensim.corpora import Dictionary
from gensim.models import TfidfModel

# 1. 定义 text2Matrix 函数
def text2Matrix(wordList):
    # 创建词典
    dictionary = Dictionary(wordList)
    # 创建词袋表示:每篇文档为一个词频向量
    corpus = [dictionary.doc2bow(text) for text in wordList]
    # 使用词袋表示创建TF-IDF模型
    tfidf_model = TfidfModel(corpus)
    # 应用TF-IDF模型转换词袋表示为TF-IDF表示
    corpus_tfidf = tfidf_model[corpus]
    return dictionary, corpus, corpus_tfidf

# 2. 测试数据:每篇文档是一个由词组成的列表
wordList = [
    ['apple', 'banana', 'apple'],
    ['banana', 'cherry', 'apple'],
    ['apple', 'cherry', 'cherry', 'banana'],
]

# 3. 调用 text2Matrix 函数
dictionary, corpus, corpus_tfidf = text2Matrix(wordList)

# 4. 输出词典内容
print("词典内容:")
for word_id, word in dictionary.items():
    print(f"{word_id}: {word}")

# 5. 输出词袋表示(原始词频表示)
print("\n词袋表示(Corpus):")
for doc in corpus:
    print(doc)

# 6. 输出TF-IDF表示
print("\nTF-IDF表示(Corpus_tfidf):")
for doc in corpus_tfidf:
    print(doc)

词典内容:
这是一个包含所有文档中出现的独立词汇的集合,通常是去重后的所有词。

词袋模型忽略了词语在文档中的顺序,甚至忽略了语法,只关注以下两点:

  • 文档中出现了哪些词。
  • 每个词在文档中出现了多少次。

TF-IDF表示:
[ ]表示在第1篇文档中,所有的词汇的TF-IDF值都是零。
[(2, 1.0)] 表示在第2/3篇文档中,'cherry' 是一个重要的词,且其TF-IDF值为1.0。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号