TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本挖掘技术,用于评估一个词语在一组文档中的重要性。它广泛应用于信息检索和文本挖掘中,尤其是在搜索引擎和推荐系统中。
组成部分
TF-IDF 由两个部分组成:
TF(Term Frequency):表示某个词在文档中出现的频率。通常用该词在文档中出现的次数除以文档中的总词数来计算。
IDF(Inverse Document Frequency):衡量某个词对整个语料库的重要性。一个词在越少的文档中出现,它的 IDF 值就越高。
其中 ∣D∣|D|∣D∣ 是文档总数, ∣d∈D:t∈d∣|d \in D: t \in d|∣d∈D:t∈d∣ 是包含词 ttt 的文档数量。
TF-IDF的作用
-
信息检索:TF-IDF 被广泛应用于搜索引擎中,用于评估文档与用户查询的相关性。相关性越高,文档的 TF-IDF 值越大。
-
特征提取:在文本分类和聚类中,TF-IDF 可以作为特征向量,帮助机器学习模型理解文本内容。
-
关键词提取:TF-IDF 可以用于自动提取文本中的关键词,帮助用户快速了解文档主题。
下面用一个简单例子说明TF-IDF 分析词语的重要性
import jieba
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformerarr = ['第一天我参观了美术馆','第二天我参观了博物馆','第三天我参观了动物园', ]arr = [' '.join(jieba.lcut(i)) for i in arr] # 分词
print(arr)
# 返回结果:
# ['第一天 我 参观 了 美术馆', '第二天 我 参观 了 博物馆', '第三天 我 参观 了 动物园']vectorizer = CountVectorizer()
X = vectorizer.fit_transform(arr)
word = vectorizer.get_feature_names_out()
df = pd.DataFrame(X.toarray(), columns=word)
print(df)
# 返回结果:
# 动物园 博物馆 参观 第一天 第三天 第二天 美术馆
# 0 0 1 1 0 0 1
# 0 1 1 0 0 1 0
# 1 0 1 0 1 0 0transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weight = tfidf.toarray()
for i in range(len(weight)): # 访问每一句print("第{}句:".format(i))for j in range(len(word)): # 访问每个词if weight[i][j] > 0.05: # 只显示重要关键字print(word[j], round(weight[i][j], 2)) # 保留两位小数
# 返回结果
# 第0句:美术馆 0.65 参观 0.39 第一天 0.65
# 第1句:博物馆 0.65 参观 0.39 第二天 0.65
# 第2句:动物园 0.65 参观 0.39 第三天 0.65
中文分词
arr = [' '.join(jieba.lcut(i)) for i in arr] # 分词
print(arr)
- 使用
jieba.lcut
对每句话进行分词,并用空格连接分词结果。 - 输出的结果为:
['第一天 我 参观 了 美术馆', '第二天 我 参观 了 博物馆', '第三天 我 参观 了 动物园']
词频矩阵
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(arr)
word = vectorizer.get_feature_names_out()
df = pd.DataFrame(X.toarray(), columns=word)
print(df)
- 使用
CountVectorizer
将分词后的文本转换为词频矩阵X
。 get_feature_names_out()
获取所有的特征(词)。- 将词频矩阵转换为 Pandas DataFrame,以便于查看。
- 输出的结果显示每个句子中每个词的出现次数。
计算 TF-IDF 值
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weight = tfidf.toarray()
- 使用
TfidfTransformer
将词频矩阵转换为 TF-IDF 矩阵weight
。
输出重要关键词
for i in range(len(weight)): # 访问每一句print("第{}句:".format(i))for j in range(len(word)): # 访问每个词if weight[i][j] > 0.05: # 只显示重要关键字print(word[j], round(weight[i][j], 2)) # 保留两位小数
通过这种方式,可以分析文本数据中每个词的重要性,常用于信息检索和文本挖掘任务。
下面使用 Yet Another Chinese News Dataset 进行文本挖掘
它包含新闻的标题+内容+图片+url,包含简体中文和繁体中文
~140k条信息
修改数据集的输入
import pandas as pd
import jieba
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer# 读取数据集
data = pd.read_csv('news_collection.csv') # 替换为实际的文件路径
# 假设数据集中有一列名为 'content',存储新闻内容
news_contents = data['desc'].tolist()# 分词
news_contents_segmented = [' '.join(jieba.lcut(str(content))) for content in news_contents]# 词频矩阵
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(news_contents_segmented)
word_list = vectorizer.get_feature_names_out()# 创建词频 DataFrame
df = pd.DataFrame(X.toarray(), columns=word_list)
print("词频矩阵:")
print(df)# 计算 TF-IDF 值
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weight = tfidf.toarray()# 输出每条新闻中重要的关键词
print("\nTF-IDF 重要关键词:")
for i in range(len(weight)):print("第{}条新闻:".format(i + 1))for j in range(len(word_list)):if weight[i][j] > 0.05: # 只显示重要关键字print(word_list[j], round(weight[i][j], 2))
输出这样词频
一段 0.1
不論 0.11
他們 0.07
保育 0.11
優游 0.18
公尺 0.1
共舞 0.16
反應 0.1
反而 0.1
可能 0.06
周遭 0.13
夏威夷 0.25
大白 0.15
尖叫 0.15
就算 0.11
巧遇 0.14
巨型 0.13
影像 0.11
最大 0.08
本月 0.19
水下 0.14
活動時 0.12
海洋 0.2
珍貴 0.13
留下 0.1
當下 0.12
當地 0.09
研究者 0.14
第一 0.08
美國 0.05
聽到 0.12
著離 0.17
在获取每个词的重要性(TF-IDF 值)后,你可以进行多种后续分析和处理。
生成词云是一个比较直观的应用方式