一、TF-IDF算法介绍
- TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。词语的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
- TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为这个词或者短语具有很好的类别区分能力,适合用来分类。
- TF(Term Frequency,词频)
- 词频(TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)
- 计算公式如下:
- IDF(Inverse Document Frequency,逆文档频率)
- 逆文档频率(IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少,IDF越大,则说明词条t具有很好的类别区分能力。
- 计算公式如下:
- +1是为了避免包含该词的文档数为0的时候,分子为0的情况发生
- TF-IDF的计算公式
二、举例说明
-
假设有一篇名为《中国的蜜蜂养殖》文章,假定该文长度为1000个词,“中国”、“蜜蜂”、养殖"各出现20次,则这三个词的"词频”(TF)都为0.02。
-
然后,搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数(语料库的文档总数)。包含"中国"的网页共有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张
-
则通过计算公式可以得到它们的逆文档频率(IDF)和TF-IDF如下:
\ 包含该词的文档数(亿) IDF TF TF-IDF 中国 62.3 0.603 0.02 0.0121 蜜蜂 0.484 2.713 0.02 0.0543 养殖 0.973 2.410 0.02 0.0482
三、示例:代码实现
-
TfidfVectorizer() 是 sklearn 库中用于将文本集合转换为 TF-IDF 特征矩阵的一个类。
-
TfidfVectorizer 类有许多参数,但以下是一些最常用的:
- input: 指定输入数据的格式,可以是 ‘filename’、‘file’ 或 ‘string’。默认为 ‘content’,这意味着输入应该是字符串列表或字符串的生成器。
- max_df: 指定词或短语的文档频率(DF)的上限。高于此值的词或短语将被忽略。这有助于去除一些太常见的词(如停用词)。
- min_df: 指定词或短语的文档频率(DF)的下限。低于此值的词或短语将被忽略。这有助于去除一些非常罕见的词。
- max_features: 指定要保留的词的最大数量(基于文档频率)。这有助于减少特征空间的维度。
- ngram_range: 一个元组 (min_n, max_n),用于指定不同 n 值对应的 n-grams 的范围。例如,(1, 1) 表示单词(unigrams),(1, 2) 表示单词和二元组(bigrams)。
- stop_words: 一个字符串列表,包含要忽略的停用词。可以是一个预定义的列表,如 - ‘english’,也可以是一个自定义的列表。
- lowercase: 布尔值,指定是否将所有文本转换为小写。默认为 True。
- use_idf: 布尔值,指定是否使用 IDF(逆文档频率)重新加权。默认为 True。
- smooth_idf: 布尔值,指定在计算 IDF 时是否应用平滑(添加 1 到文档频率,以避免除以零)。默认为 True。
-
主要方法
- fit(X, y=None): 计算词汇表的词汇IDF值。
- fit_transform(X, y=None): 拟合模型并转换 X。
- transform(X): 将 X 转换为 TF-IDF 特征矩阵。
- get_feature_names_out(): 返回词汇表中所有特征的名称
-
示例:
from sklearn.feature_extraction.text import TfidfVectorizer # 示例文本 """ corpus代表整个语料库,其中的每一句,代表一个文档 """ corpus = [ 'This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?', ] # 创建 TF-IDF 向量化器 vectorizer = TfidfVectorizer() # 拟合和转换数据 X = vectorizer.fit_transform(corpus) # 获取特征名称(词汇) feature_names = vectorizer.get_feature_names_out() # 将 TF-IDF 矩阵转换为 DataFrame,可以清楚的看出每个词汇的TF-IDF值 import pandas as pd df = pd.DataFrame(X.toarray(), columns=feature_names) print(df)
- 由于输出面板中看不全结果,我们可以在调试模式中打开我们想要查看的内容
- 我们可以查看这个语料库中一共有多少个特征词汇,注意这里每个词汇的前后顺序是根据26个英文字母的顺序进行排序的
- 通过上图中的结果,我们可以直观的看到每篇文档中每个特征词汇的TF-IDF值,并且可以选出每篇文档中TF-IDF值最高的,作为关键词汇
四、总结
- TF-IDF的优缺点
-
优点:
- 简单有效,易于实现。
- 可以在不同长度的文档上进行比较。
- 考虑了词语的普遍重要性(IDF)。
-
缺点:
- 没有考虑词语的语义信息,例如同义词和多义词。
- 对于小数据集可能效果不佳,因为IDF的计算依赖于大量的文档。
- 没有考虑词语的位置信息,如标题、段落等。
-
- 总的来说,TF-IDF是一种简单而强大的文本特征提取方法,在许多自然语言处理任务中都有广泛的应用。然而,对于需要更深入理解文本语义的任务,可能需要结合其他更复杂的自然语言处理技术。