如何比较短语的相似性?
输入问题时,stackoverflow会为我们提供它认为可能涵盖同一主题的问题列表。我在其他站点或者其他程序中也看到过类似的功能(例如,帮助文件系统),但是我自己从未编程过类似的功能。现在,我很好奇要知道将使用哪种算法。
我想到的第一种方法是将短语分为单词,然后查找包含这些单词的短语。在执行此操作之前,我们可能希望丢弃无关紧要的单词(例如" the"," a"," does"等),然后对结果进行排名。
嘿,等等,让我们对网页进行处理,然后我们可以使用... watchamacallit ...一个"搜索引擎",然后我们可以出售广告,然后...
不,认真地说,解决此问题的常用方法是什么?
解决方案
回答
一种方法是所谓的词袋模型。
如我们所料,首先我们要计算单词在文本(在NLP-lingo中通常称为文档)中出现的次数。然后,我们抛出所谓的停用词,例如" the"," a"," or"等。
我们剩下单词和单词计数了。这样做一段时间,我们会在文档中看到一组完整的单词。然后,我们可以为这些词创建索引:
" aardvark"是1," apple"是2,...," z-index"是70092.
现在,我们可以拿起单词袋,将其变成向量。例如,如果文档包含两个关于土豚的引用,而没有其他内容,则它将看起来像这样:
[2 0 0 ... 70k zeroes ... 0].
之后,我们可以用点积计算两个向量之间的"角度"。角度越小,文档越近。
这是一个简单的版本,还有其他更高级的技术。愿维基百科与我们同在。
回答
根据我(开发小型文本搜索引擎)的经验(我的经验很少):我将查找包含一些查询词的问题(在情况下,查询就是问题)。
当然,应该忽略杂音词,我们可能要检查查询" ASP.Net"等"强"词以缩小搜索范围。
http://en.wikipedia.org/wiki/Index_(search_engine)#Inverted_indices'>倒排索引通常用于查找与我们感兴趣的单词有关的问题。
从查询中找到与单词相关的问题后,我们可能希望计算对问题感兴趣的单词之间的距离,因此带有"短语相似性"文本的问题比具有"讨论相似性的问题,我们会听到以下短语..."文本的问题排名更高。
回答
@Hanno,我们应该尝试Levenshtein距离算法。给定输入字符串s和字符串列表t,对t中的每个字符串u进行迭代,并返回具有最小Levenshtein距离的字符串。
http://en.wikipedia.org/wiki/Levenshtein_distance
请参阅http://www.javalobby.org/java/forums/t15908.html中的Java实现示例
回答
要扩大"言之有物"的想法,请执行以下操作:
我们还可以通过几种方法来注意n-gram,两个或者两个以上单词的字符串保持顺序。我们可能要这样做,因为搜索"空间复杂性"远不止是搜索其中包含"空间"和"复杂性"的事物,因为此短语的含义不仅仅是其各个部分的总和。也就是说,如果我们得到的结果涉及外层空间和宇宙的复杂性,那么这可能并不是寻找"空间复杂性"的真正含义。
这里自然语言处理的一个关键思想是相互信息,它使我们(从算法上)可以判断一个短语是否真的是一个特定的短语(例如"空间复杂性")或者只是巧合地相邻的单词。从数学上讲,主要思想是概率地询问这些单词是否比我们仅凭其频率所猜测的出现得更多。如果我们在搜索查询中(或者在编制索引时)看到具有较高互助信息得分的短语,则可以通过尝试使这些单词保持顺序来获得更好的结果。