12

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

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

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

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

4

4 回答 4

12

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

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

你只剩下字数和字数了。这样做一段时间,您将获得出现在文档中的一组全面的单词。然后,您可以为这些单词创建一个索引:“aardvark”是 1,“apple”是 2,...,“z-index”是 70092。

现在你可以把你的词袋变成向量了。例如,如果您的文档包含两个对土豚的引用,而没有其他内容,它将如下所示:

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

在此之后,您可以用点积计算两个向量之间的“角度” 。角度越小,文件越接近。

这是一个简单的版本,还有其他更高级的技术。愿维基百科与你同在

于 2008-09-16T09:18:01.147 回答
3

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

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

请参阅http://www.javalobby.org/java/forums/t15908.html中的 Java 实现示例

于 2008-09-16T10:11:25.700 回答
3

为了增强词袋的想法:

您还可以通过多种方式关注 n-gram,即按顺序排列的两个或多个单词的字符串。您可能想要这样做,因为搜索“空间复杂性”不仅仅是搜索其中包含“空间”和“复杂性”的事物,因为这个短语的含义不仅仅是其各部分的总和;也就是说,如果你得到一个谈论外层空间和宇宙复杂性的结果,这可能不是搜索“空间复杂性”的真正含义。

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

于 2008-09-16T13:08:38.300 回答
2

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

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

于 2008-09-16T09:26:40.253 回答