TF-IDF只是一种衡量token在文本中重要性的方法;这只是将文档转换为数字列表的一种非常常见的方法(术语向量,它提供了您获得余弦的角度的一个边缘)。
要计算余弦相似度,您需要两个文档向量;向量用索引表示每个唯一术语,该索引处的值是衡量该术语对文档和文档相似性一般概念的重要性的某种度量。
您可以简单地计算每个术语在文档中出现的次数(Term F requency),并将该整数结果用于向量中的术语得分,但结果不会很好。非常常见的术语(例如“is”、“and”和“the”)会导致许多文档看起来彼此相似。(这些特定示例可以通过使用停用词列表来处理,但其他不够通用而不能被视为停用词的常用术语会导致同样的问题。在 Stackoverflow 上,“问题”一词可能属于这一类。如果你在分析烹饪食谱时,您可能会遇到“鸡蛋”这个词的问题。)
TF- IDF通过考虑每个词项通常出现的频率(文档频率)来调整原始词条频率。逆文档频率通常是文档数量除以该术语出现的文档数量的对数(图片来自维基百科):
将“日志”视为有助于长期解决问题的细微差别——当它的论点增长时它会增长,所以如果这个词很罕见,IDF 会很高(很多文档除以很少的文档) ,如果这个词很常见,IDF 会很低(很多文档除以很多文档 ~= 1)。
假设您有 100 个食谱,除了一个以外都需要鸡蛋,现在您还有三个文档都包含“鸡蛋”一词,一个在第一个文档中,两次在第二个文档中,一次在第三个文档中。每个文档中“egg”的词频为 1 或 2,文档频率为 99(或者,如果计算新文档,可以说是 102。让我们坚持使用 99)。
'egg' 的 TF-IDF 是:
1 * log (100/99) = 0.01 # document 1
2 * log (100/99) = 0.02 # document 2
1 * log (100/99) = 0.01 # document 3
这些都是很小的数字。相比之下,让我们看看另一个只出现在 100 个食谱语料库中的 9 个中的词:“芝麻菜”。它在第一个文档中出现两次,在第二个文档中出现三次,并且在第三个文档中不出现。
“芝麻菜”的 TF-IDF 是:
1 * log (100/9) = 2.40 # document 1
2 * log (100/9) = 4.81 # document 2
0 * log (100/9) = 0 # document 3
'arugula'对于文档 2非常重要,至少与 'egg' 相比。谁在乎卵子出现了多少次?万物皆有蛋!这些术语向量比简单计数提供的信息要多得多,并且它们将导致文档 1 和 2 比使用简单术语计数时更接近(相对于文档 3)。在这种情况下,可能会出现相同的结果(嘿!我们这里只有两个术语),但差异会更小。
这里的要点是 TF-IDF 为文档中的术语生成更有用的度量,因此您不会关注真正常见的术语(停用词,'egg'),而忽略重要的术语('arugula' )。