我正在寻找一个可以计算tf-idf计算的简单java类。我想对2个文件进行相似性测试。我找到了很多使用tf-idf类的BIG API。我不想使用大的jar文件,只是为了做我的简单测试。请帮忙 ! 或者至少如果有人可以告诉我如何找到TF?和以色列国防军?我会计算结果:) 要么 如果你能告诉我一些很好的java教程。 请不要告诉我看谷歌,我已经做了3天,找不到任何东西:( 请不要把我推荐给Lucene :(
答案 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。
编辑:回答您关于如何统计文档中的字词的问题:
new BufferedReader(new FileReader(filename))
- 你可以在while循环中调用BufferedReader.readLine()
,每次都检查null。line.split("\\s")
- 这将在空白处拆分您的行,并为您提供所有单词的数组。HashMap
。现在,在为每个文档计算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开始看起来是一个非常理性的选择。