nlp学习笔记:TF-idf
文章目录
一、TF-IDF算法介绍
TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
1.TF:词频(Term Frequency)
**词频(TF)**表示词条(关键字)在文本中出现的频率。
这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。
公式:
T
F
w
=
在某一类中词条
w
出现的次数
该类中所有的词条的数目
TF_{w}= \frac{在某一类中词条w出现的次数}{该类中所有的词条的数目}
TFw=该类中所有的词条的数目在某一类中词条w出现的次数
2.IDF是逆向文件频率(Inverse Document Frequency)
逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。
公式:
i
d
f
i
=
l
o
g
∣
D
∣
∣
{
j
:
t
i
∈
d
j
}
∣
idf_{i}=log\frac{|D|}{|\{j:t_{i}∈d_{j}\}|}
idfi=log∣{j:ti∈dj}∣∣D∣
其中,|D| 是语料库中的文件总数。 |{j:ti∈dj}| 表示包含词语 ti 的文件数目(即 ni,j≠0 的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|
即: I D E = l o g ( ∗ 词料库的文章总数 包含词条 w 的文档数 + 1 ) IDE=log(\frac{*词料库的文章总数}{包含词条w的文档数+1}) IDE=log(包含词条w的文档数+1∗词料库的文章总数)
3.TF-IDF=TF * IDF
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
二.parlai中tfidf的应用
首先Parlai中,tfidf的公式略微做了调整,但整体思想没有变:
例如我们输入“吴京战狼”,分词出来[‘吴京战’, ‘吴京战 狼’, ‘狼’]对应于字典表的[14377170, 710209, 3602699](这三个值是字符串的hash值,主要目的是为了查找提速,正常查表On,hash访问index是O1),在吴京战狼这个短语下计算出其tfidf值,array([10.30023117, 4.11863973, 10.88753343])
这个tfidf值通过spvec返回,和之前用数据和做好的doc_mat相乘,doc_mat是提前做好的tfidf矩阵(词组*文章的表格),行是2-gram词的hash,列是文章
吴京战狼tfidf矩阵(1hash)所有文章矩阵(hash文章数)
两个矩阵相乘得到一个 1文章数 的矩阵,表示了战狼吴京在所有文章上的得分
相乘这一步就是用[10.30023117, 4.11863973, 10.88753343]对字典表对应词的行加权,然后求和
parlai不一样的地方是对字典表做了一个提速,传统的tfidf表是 n_words*n_docs,parlai的是n_hash_buckets(words)*n_docs,节省查表时间,其他都一样
查找句子query,
Step1 分词query
总结
开放domain的QA常见的2-step工作机制,第一步是做document的召回,第二步是在有限的document集合中做machine reading,然后获取答案。
传统的召回机制使用的是sparse-vector召回,tf-idf或者BM25,这都是经典的方法。
而DPR利用dual-encoder的框架,利用bert的预训练模型进行相关工作,获得了更好的成绩。
这个工作,是base在当下bert的成就以及MIPS算法等一些基础算法的成功上的,因为dense vector为了保证准确性,需要大量数据的训练,而计算又非常的耗时,所以多种因素催生了DPR。