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

时间:2009-12-25 02:48:00

标签: java search lucene text-analysis

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

3 个答案:

答案 0 :(得分:8)

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

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

如果答案不清楚,每个文件每个学期有一个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
  4. 来完成

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

答案 1 :(得分:0)

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

          TF = sqrt(freq)

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

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

答案 2 :(得分:0)

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