1. 基本概念
TF-IDF(Term Frequency - Inverse Document Frequency)表示“词频-逆文本频率”。词频(TF,Term Frequency )表示给定词语在文件或语料中出现的频率(归一化以屏蔽长短文件的差异);逆文本频率(IDF,Inverse Document Frequency)是一个词语重要性的度量。
(1)Term Frequency
当以“人工智能的应用”为关键词进行网页搜索,根据直觉,“人工智能”、“的”、“应用”这三个词出现次数较多的网页相关性也较高。
但由于篇幅较长的网页一般包含较多的关键词,为屏蔽文本篇幅的差异,根据网页长度对关键词的次数进行归一化,就是词频(Term-Frequency)。
此时,度量网页相关性可以直接将关键词的词频相加,假设N 个关键词的词频分别为T F 1 , TF2 , . . . , T F N ,该网页的相关性为:
比如,某个网页的词共1000个,“人工智能”、“的”和“应用”分别出现3次,30次,10次,它们的词频分别为0.003,0.03,0.01,该网页与“人工智能的应用”相关性为
但是“人工智能”是一个很专业的词,“应用”是一个很普通的词,“的”是一个停止词(Stop Word),但在计算相关行性时候“的”贡献却是最多的,而“人工智能”贡献却最少。因此还需要给每个词赋予相应的权重进行修正,以满足以下设定:
一个词与主题相关性越大,权重越大,反正权重越小。
停止词权重为0。即忽略“的”、“得”、“地”、“是”、“也”这些词。
(2) Inverse Document Frequency
可见如果一个关键词只在少量文本中出现,当它一旦出现时,就很容易锁定该文本的主题,反之亦然;即一个关键词x 在N 个文本中出现,当N 越大时,x 的权重就越小,反之亦然。
上述理念通过定义逆文本频率(IDF,Inverse Document Frequency)实现:
其中,N 代表语料库中文本的总数,而N ( x )代表语料库中包含词x xx的文本总数。
当某个生僻词未在语料库中出现过,N ( x )=0, 需要进行如下平滑处理:
IDF反应了一个词在所有文本中出现频率的逆,如果一个词在较少文本中出现,它的IDF值应该高,如“人工智能”这样的专业名词;如果一个词在较多文本中出现,它的IDF值应该低,比如“应用”这样词。极端的情况下,如果一个词在所有(或大多数)文本中都出现,那么它的IDF值应该为0,比如“的”这样的停止词。
上述例子中,假设所有文本语料数量N = 109,“人工智能”出现次105,“应用”出现次108,“的”在所有网页中都出现,则
此时,相关性可以用TF-IDF度量,假设N 个关键词的词频分别为,该网页与关键词的相T F 1 , TF 2 , . . . , T F N 关性为:
上述例子中,“人工智能”的TF-IDF为0.04,“应用”的TF-IDF为0.03,而“的”TF-IDF为0,则该网页与“人工智能的应用”的相关性为0.07,其中“人工智能”贡献了一半以上的相关性。
2. 代码实现
使用sklearn.feature_extraction.text中的TfidfVectorizer类实现,支持传入停止词。
from sklearn.feature_extraction.text import TfidfVectorizer corpus=["I come to China to travel", "This is a car polupar in China", "I love tea and Apple ", "The work is to write some papers in science"] tfidfVec = TfidfVectorizer() tfidf = tfidfVec.fit_transform(corpus) print("\n词频矩阵(TF-IDF):") print(tfidf) print("\n词袋模型(TF-IDF):") print(tfidf.toarray())
输出如下: