TF-IDF
-
TF-IDF是一种统计方法,用来评估一个字词在一个资料库中的重要程度(关键词提取),常用于资讯检索与文本挖掘中。
其中,TF是表示词频(Term Frequency),IDF表示逆文档频率(Inverse Document Frequency)。分别计算TF和IDF的值,然后将二者相乘即得到TF-IDF的值。
-
TF词频
词频即一个词在文本中出现的次数,一个词在文本中大量出现,则它通常比较重要(停用词除外)。
停用词:这些停用词一般可以使得句子更通顺,它们在文本中必不可少且中大量存在。所以在统计词频时,首先需要将停用词去掉,保留文本中有实际含义的词。
词频计算公式:
考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化:
-
IDF逆文档频率
若一个词存在于大量文档中,那么这个词是某篇文章关键词的概率就很低,因为无法展示文章的特点。极端情况是,每篇文档都存在这个词,那么这个词就不具有代表性,IDF就可以用来量化这种概率。逆文档频率计算公式:
其中,对数的真数中,分母加1是为了防止所有文档都不包含该词。 -
TF-IDF
TF-IDF计算公式:
可以发现,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。一个词的TF-IDF值越高,则它越有可能是关键词。 -
gensim中的TF-IDF
安装gensim:pip install gensim
import gensim corpus = [ 'this is the first document', 'this is the second second document', 'and the third one', 'is this the first document' ] word_list = [] for i in range(len(corpus)): word_list.append(corpus[i].split(' ')) word_list
运行结果:
# 赋给语料库中每个词(不重复的词)一个整数id dictionary = gensim.corpora.Dictionary(word_list) new_corpus = [dictionary.doc2bow(text) for text in word_list] new_corpus
运行结果:元组中第一个元素是词语在词典中对应的id,第二个元素是词语在本文档(这里是指一行)中出现的次数,且是乱序
#查看语料库中每个词对应的id print(dictionary.token2id)
运行结果:
# 训练模型并保存 tfidf = gensim.models.TfidfModel(new_corpus) tfidf.save('gensim_tfidf.tfidf') # 载入模型 tfidf = gensim.models.TfidfModel.load('gensim_tfidf.tfidf') # 使用这个训练好的模型得到单词的tfidf值 tfidf_vec = [] for i in range(len(corpus)): string = corpus[i] string_bow = dictionary.doc2bow(string.lower().split()) string_tfidf = tfidf[string_bow] tfidf_vec.append(string_tfidf) tfidf_vec
运行结果:我们发现这向量的维数和我们语料单词的个数不一致
# 测试gensim计算方法 string = 'the i first second name' string_bow = dictionary.doc2bow(string.lower().split()) string_tfidf = tfidf[string_bow] print(string_tfidf) #运行结果:[(1, 0.4472135954999579), (5, 0.8944271909999159)]
gensim的TF-IDF小结:
- gensim有自动去除停用词的功能,比如the
- gensim会自动去除单个字母,比如 i
- gensim会去除没有被训练到的词,比如name => 所以通过gensim并不能计算每个单词的tfidf值
-
sklearn中的TF-IDF算法
其中语料使用gensim那个例子的
点互信息、互信息
-
点互信息PMI(Pointwise Mutual Information)
点互信息用来衡量两个事物之间的相关性。PMI的定义如下:
在概率论中,如果x跟y不相关,则 P(x,y) = P(x)P(y)。二者相关性越大,则 P(x,y) 就相比于 P(x)P(y) 越大。在y出现的情况下x出现的条件概率 p(x|y) 除以x本身出现的概率 p(x) ,自然就表示x跟y的相关程度。log是单调递增函数,而且 log 1 = 0 ,则表明P(x,y) = P(x)P(y),此时相关性为0。 -
互信息MI(Mutual Information)
互信息是信息论里一种有用的信息度量,它可以看成是一个随机变量中包含的关于另一个随机变量的信息量,或者说是一个随机变量由于已知另一个随机变量而减少的不肯定性。公式如下:
互信息其实就是对X和Y的所有可能的取值情况的点互信息PMI的加权和。 -
NLP中的应用
互信息值越高, 表明 X 和 Y 相关性越高, 则 X 和 Y 组成短语的可能性越大; 反之, 互信息值越低,X 和Y之间相关性越低, 则X 和Y之间存在短语边界的可能性越大。公式中的X和Y指的是两个相邻的单词,P值是它的出现概率。