机器学习面试:tfidf&BM25的理解与应用

TFIDF的应用

分析某个元素在整体中的重要性,元素可以是类目,单词等

tf是指单词在文章这种出现的频率(term frequency)
idf是指包含单词的文档出现的频率(doc frequency)

TFIDF的理解

给你一篇文章,该如何确定文章中哪些词是关键的呢?一个直接的想法是

  1. 对整篇文章进行分词,统计每个词出现的次数
  2. 按照次数进行排序,出现次数越多的词重要性越高
import jieba
from collections import Counter
doc="""
"""
words = jieba.cut(doc)
tf = Counter(words)
tf = tf.most_common()
print(tf)

这样做会有两个小问题

  1. 不同文章的词数的是不同的,为了方便不同文章之间进行对比,需要对词频进行归一化
  2. 出现最多的词是一些停用词,我们在实际应用中需要将这些词给过滤掉。

第一点非常好理解,直接进行归一化即可
TF ( w ) = count ( w ) ∑ i count ( w i ) \text{TF}(w)=\frac{\text{count}(w)}{\sum_i \text{count}(w_i)} TF(w)=icount(wi)count(w)

针对第二点,有一种更好的解决办法叫做IDF(逆文档频率)。如果一个词在各个文档中都有出现,那么这个词的重要性权重就要降低。
IDF ( w ) = log ⁡ ( N n + 1 ) + 1 \text{IDF}(w)=\log(\frac{N}{n+1})+1 IDF(w)=log(n+1N)+1

其中,N是语料中文档的总数,n是出现词 w w w的文档个数,分母之所以加1是为了避免分母为零。
举个很简单的例子,比如在看《仙逆》这个小说的时候,出现最多的词【王林】,每篇文章中都会出现很多次王林,《大道争锋》中出现出现最多的是【大道】。在每篇文章中出现的次数都很多,重要性很高,但是每篇都出现这个词的时候,我们就会觉得不怎么重要了。

例如下面这段语料中,每一段都会出现【王林】这个词,那么我问你,你觉得王林是这篇文章的关键词吗?如果单看这段语料肯定没有问题,但是当你看完整本小说的时候,你会发现,卧槽,每篇文章都有很多王林,主人公的名字反而不是多么重要了,这段语料的核心词很可能是仙人。

《第二章 仙人》马车飞快的在小路上驰骋,【王林】的身子随着地面的坑洼起伏晃动,他抱着怀里的包裹,内心跌宕,带着父母对他的期望,离开了居住十五年的山村。
此地距离县城有不短的路程,【王林】渐渐睡下,也不知过了多久,他被人轻轻推动,睁开眼睛一看,四叔面带微笑的望着他,打趣道:“铁柱,第一次离开家门,有什么感想啊。”
【王林】察觉到马车已经停下,憨笑道:“没啥感想,就是有些害怕,不知道能不能被仙人收入

你可能感兴趣的:(nlp,机器学习面试,机器学习,tf-idf,人工智能)