如何比较短语的相似性?

时间:2008-09-16 09:04:45

标签: algorithm full-text-search

输入问题时,stackoverflow会向您显示一个其认为可能涵盖同一主题的问题列表。我在其他网站或其他程序中也看到了类似的功能(例如帮助文件系统),但我自己从未编写过类似的东西。现在我很想知道会使用什么样的算法。

我想到的第一种方法是将短语分成单词并查找包含这些单词的短语。在你这样做之前,你可能想要丢掉无关紧要的词(比如'the','a','do'等),然后你会想要对结果进行排名。

嘿,等等 - 让我们为网页做这件事,然后我们可以有一个... watchamacallit ... - 一个“搜索引擎”,然后我们可以卖广告,然后......

不,说真的,解决这个问题的常用方法是什么?

4 个答案:

答案 0 :(得分:12)

一种方法是所谓的词袋模型。

正如您所猜测的,首先计算文本中出现的单词次数(通常称为NLP-lingo中的文档)。然后你扔掉所谓的停用词,比如“the”,“a”,“or”等等。

你留下了单词和字数。这样做一段时间后,您会得到一整套出现在文档中的单词。然后,您可以为这些单词创建索引: “aardvark”是1,“apple”是2,...,“z-index”是70092.

现在你可以拿出你的文字袋并将它们变成矢量。例如,如果您的文档包含两个针对aardvark的引用而没有其他内容,则它将如下所示:

[2 0 0 ... 70k zeroes ... 0].

在此之后,您可以使用a dot product计算两个向量之间的“角度”。角度越小,文件越近。

这是一个简单的版本,还有其他更先进的技术。可以Wikipedia be with you

答案 1 :(得分:3)

@Hanno你应该尝试Levenshtein距离算法。给定输入字符串 s 并且字符串 t 的列表针对 t 中的每个字符串 u 进行迭代并返回一个Levenshtein距离最小的那个。

http://en.wikipedia.org/wiki/Levenshtein_distance

请参阅http://www.javalobby.org/java/forums/t15908.html

中的Java实现示例

答案 2 :(得分:3)

增加词袋的想法:

有几种方法你也可以注意n-gram,两个或更多单词的字符串保持有序。你可能想要这样做,因为搜索“空间复杂性”不仅仅是搜索具有“空间”和“复杂性”的东西,因为这个短语的含义不仅仅是其各部分的总和;也就是说,如果你得到一个谈论外太空和宇宙复杂性的结果,这可能不是搜索“空间复杂性”的真正含义。

这里自然语言处理的一个关键思想是mutual information,它允许你(通过算法)判断一个短语是否真的是一个特定的短语(如“空间复杂性”)或只是巧合地相邻。在数学上,主要思想是概率性地询问这些单词是否比单独使用它们的频率更频繁地出现在彼此旁边。如果您在搜索查询中(或在编制索引时)看到具有较高互信息分数的短语,则可以通过尝试按顺序保留这些单词来获得更好的结果。

答案 3 :(得分:2)

从我(相当小)的经验开发全文搜索引擎:我会查找包含查询中的一些单词的问题(在您的情况下,查询是您的问题)。 当然,噪音词应该被忽略,我们可能想检查查询'强'字,如'ASP.Net',以缩小搜索范围。 http://en.wikipedia.org/wiki/Index_(search_engine)#Inverted_indices'>倒置索引通常用于查找我们感兴趣的单词的问题。

在使用查询中的单词查找问题后,我们可能想要计算我们在问题中感兴趣的单词之间的距离,因此“短语相似性”文本的问题排名高于“讨论相似性的问题”,您会听到以下短语... '文字。