GPT辅助学习-TF-IDF刨根问底

GPT辅助学习-TF-IDF刨根问底

TF-IDF的含义

TF-IDF表示词和文档的关联性,这个值越高,表示文档和词的关联性越大

TF-IDF其实包含两个部分,分别是TF(词项频率),IDF(逆文档频率)

TF表示:某个词在单个文档中出现的频率

如果简单的认为,某个词在一个文档中出现的概率越高,这个词和这篇文档的关联性越大,容易出现一个典型问题

这个典型问题就是一些比较通用或者常见的词,在很多文档中频繁出现,它区分文档关联度的作用应该是更低的,这个时候应该更少的参考这个词检索出来的相关文档,其检索出来的文档的重要性也应该被降低。

所以要评估一个词是不是在很多文档中频繁出现,最直接的计算方法应该是:

M = 包含这个词的文档数 / 总文档数

M表示的是这个词的区分度,这个值越大,区分度越小,这个值越小,区分度越大。 而 1 / M的值则有相反的含义,这个值越大,区分度越大,这个值越小,区分度越小。

1 / M可能是一个非常大的值,外面加上一个log来让整数值小一些,于是就变成了log(1 / M),再加上1来避免整数值为0。最后这个就是IDF

现在我们把IDF的完整公式写出来:

IDF = log(总文档数 / 包含这个词的文档数) + 1

词的IDF越大,区分度越大,词的IDF越小,区分度越小。

最后将词和文章的相关性 * 词的区分度得到的就是一个综合考虑了词的总体分布特性和词在特定文章中的分布特性的结果了。

贴一下公式

计算TF

TF(t,d)=ff(t,d)(td)f(t,d){TF}(t,d)=\frac{f_f(t,d)}{\sum_(t' \in d) f_(t', d)}

其中f(t,d)f(t,d)是词tt在文档dd中出现的次数,分母是文档d中所有词出现次数之和

计算IDF

IDF(t,D)=log(Nnt)+1{IDF}(t, D) = \log \left(\frac{N}{n_t}\right) + 1

其中NN是文档总数,ntn_t是包含词tt的文档总数,DD是整个文档集

实际案例

  • doc1: “Java and Spring Framework are essential for backend development.”
    • 总词汇出现之和:9
  • doc2: “Spring are popular Java frameworks.”
    • 总词汇出现之和:5
  • doc3: “The importance of Java in modern web applications.”
    • 总词汇出现之和:8

查询内容:“Java Spring”

目标:找到最相关的一个。 结果:找到doc2

计算TF

词汇:Spring

  • doc1: 1 / 9 = 0.11
  • doc2: 1 / 5 = 0.2
  • doc3: 0 / 8 = 0

词汇:Java

  • doc1: 1 / 9 = 0.11
  • doc2: 1 / 5 = 0.2
  • doc3: 1 / 8 = 0.125

计算IDF

词汇Spring的IDF为,log(3 / 2) + 1 = 1.405

词汇Java的IDF为,log(3 / 3) + 1 = 1

Spring的文档区分度更高

计算TF-IDF

词汇:Spring

  • doc1: 0.11 * 1.405 = 0.1525
  • doc2: 0.2 * 1.405 = 0.281
  • doc3: 0 * 1.405 = 0

词汇:Java

  • doc1: 0.11 * 1 = 0.11
  • doc2: 0.2 * 1 = 0.2
  • doc3: 0.125 * 1 = 0.125

每个词汇的TF-IDF相加

  • doc1: 0.1525 + 0.11 = 0.2625
  • doc2: 0.2 + 0.281 = 0.481
  • doc3: 0 + 0.125 = 0.125

doc2的结果最高