java中Tf Idf的任何教程或代码

我正在寻找一个可以计算tf-idf计算的简单java类。 我想对2个文件进行相似性测试。 我找到了很多使用tf-idf类的BIG API。 我不想使用大的jar文件,只是为了做我的简单测试。 请帮忙 ! 或者至少如果有人可以告诉我如何找到TF? 和以色列国防军? 我会计算结果:)或者如果你能告诉我一些很好的java教程。 请不要告诉我看谷歌,我已经做了3天,找不到任何东西:(也请不要把我推荐给Lucene 🙁

术语频率是术语在特定文档中出现次数的平方根。

逆文档频率是(文档总数(文档总数除以包含术语的文档数))加上一个术语出现零次的情况 – 如果是,显然不要尝试除以零。

如果从该答案中不清楚,每个文档每个术语有一个TF,每个术语有一个IDF。

然后TF-IDF(期限,文件)= TF(期限,文件)* IDF(期限)

最后,使用向量空间模型比较文档,其中每个术语是一个新维度,指向该维度的向量部分的“长度”是TF-IDF计算。 每个文档都是一个向量,因此计算两个向量,然后计算它们之间的距离。

因此,要在Java中执行此操作,使用FileReader或其他内容一次一行地读取文件,并在空格或您要使用的任何其他分隔符上拆分 – 每个单词都是一个术语。 计算每个术语在每个文件中出现的次数,以及每个术语出现的文件数。然后,您拥有完成上述计算所需的一切。

因为我没有别的事可做,所以我查找了矢量距离公式。 干得好:

D=sqrt((x2-x1)^2+(y2-y1)^2+...+(n2-n1)^2) 

为此,x1是文档1中术语x的TF-IDF。

编辑:回答您关于如何计算文档中单词的问题:

  1. 使用读取器逐行读取文件,如new BufferedReader(new FileReader(filename)) – 您可以在while循环中调用BufferedReader.readLine() ,每次都检查null。
  2. 对于每一行,调用line.split("\\s") – 它将在空格上分割你的行并给你一个包含所有单词的数组。
  3. 对于每个单词,将1添加到当前文档的单词计数中。 这可以使用HashMap完成。

现在,在为每个文档计算D之后,您将得到X值,其中X是文档数。 将所有文档相互比较只是进行X ^ 2比较 – 这不应该花费10,000特别长。 请记住,如果两个文档的D值之间的差值的绝对值较低,则它们会更相似。 因此,您可以计算每对文档的Ds之间的差异,并将其存储在优先级队列或其他一些排序结构中,以便最相似的文档冒泡到顶部。 合理?

agazerboy, Sujit Pal的博客文章详细描述了计算TF和IDF。 WRTvalidation结果,我建议你从一个小的语料库(比如说100个文件)开始,这样你就可以很容易地看到你是否正确。 对于10000个文档,使用Lucene开始看起来像一个非常理性的选择。

虽然您特别要求不要推荐Lucene,但请允许我指出您的确切类别。 您要查找的类是DefaultSimilarity 。 它有一个非常简单的API来计算TF和IDF。 在这里查看java代码。 或者您可以按照DefaultSimilarity文档中的指定实现自己。

  TF = sqrt(freq) 

  IDF = log(numDocs/(docFreq+1)) + 1. 

log和sqrt函数用于抑制实际值。 使用原始值可能会显着地扭曲结果。