文本相似性算法

2022-09-02 10:33:45

我正在做一个Java项目,我必须制作一个文本相似性程序。我希望它采用2个文本文档,然后将它们相互比较并获得它的相似性。它们彼此之间的相似程度。

稍后,我将放置一个已经数据库,该数据库可以找到单词的同义词并浏览文本,以查看其中一个文本文档编写者是否只是在文本完全相同的情况下将单词更改为其他同义词。向上或向下移动paragrafs也是如此。是的,就像这是一个抄袭程序...

我想听听你们会推荐什么样的算法。

我通过观察这里和其他地方发现了Levenstein和Cosine的相似性。他们俩似乎都被提到了很多。汉明距离是我的老师告诉我的另一个。

我有一些与这些问题相关的问题,因为我并没有真正得到维基百科。有人可以向我解释这些事情吗?

Levenstein:这个算法通过 sub 进行更改,添加并消除单词,看看它与文本文档中另一个单词的接近程度。但是,如何将其用于整个文本文件?我可以看到它如何用于一个单词,但不能用于一个句子或从一个到另一个的整个文本文档。

余弦:它是通过测量两个向量之间角度的余弦来测量它们之间的相似性。我不明白的是,两个文本如何变成2个向量,以及其中的单词/句子呢?

汉明:这个距离似乎比莱文斯坦更好,但它只是在相等的弦上。当2个文档甚至其中的句子不是两个长度相等的字符串时,为什么这很重要?

维基百科应该有意义,但事实并非如此。我很抱歉,如果这些问题听起来太愚蠢了,但它让我垂下心头,我认为这里有人很容易解释它,所以即使是这个领域的新手也可以得到它。

感谢您抽出宝贵时间接受采访。


答案 1

Levenstein:从理论上讲,你可以用它来制作一个完整的文本文件,但它真的不是很适合这个任务。它实际上是针对单个单词或(最多)一个短语。

Cosine:你首先简单地计算每个文档中的唯一单词。完成此操作后,一个问题的答案将涵盖计算。

我从来没有为此目的使用过汉明距离,所以我不能说太多。

我会将TFIDF(术语频率*倒置文档频率)添加到列表中。它与余弦距离非常相似,但1)倾向于在较短的文档上做得更好,2)更好地考虑整个语料库中非常常见的单词,而不仅仅是碰巧在两个特定文档中常见的单词。

最后要注意的是:要使其中任何一个产生有用的结果,在尝试计算相似度之前,您几乎需要筛选出停止词(尽管如果跳过这个,TFIDF似乎比其他的更好)。至少在我的经验中,对单词进行去词干(删除后缀)也非常有帮助。当我完成它时,我使用了Porter的词干分析器算法。

出于您的目的,您可能希望使用我称之为倒置同义词库的内容,它允许您查找一个单词,并且对于每个单词,用一个规范单词代替该含义。我在一个项目上尝试了这个,并没有发现它像预期的那样有用,但听起来对于你的项目来说,它可能会更有用。


答案 2

比较两个文档之间相似性的基本思想是信息检索中的一个主题,就是提取一些指纹,并根据指纹判断它们是否共享一些信息。

只是一些提示,Winnowing:用于文档指纹识别的本地算法可能是一个选择,也是您问题的一个良好起点。