2010-02-02 61 views
6

我们其中一个较大的网站有一个部分,用户可以向网站所有者发送问题,由其员工亲自评估。 当相同的问题经常弹出时,他们可以将这个特定的问题添加到常见问题。如何构建“相关问题”引擎?

为了防止他们每天收到几十个类似的问题,我们希望提供一个类似于本站“相关问题”的特性(堆栈溢出)。

有什么方法来建立这种功能? 我知道我应该以某种方式评估问题并将其与常见问题中的问题进行比较,但该比较如何工作?关键字是否被提取?如果是,如何?

值得一提的是这个网站是建立在LAMP堆栈上的,因此这些都是可用的技术。

谢谢!

+0

的可能重复的关键字提取web服务[#1的相关问题(http://stackoverflow.com/questions/393505/stackoverflows-related-questions) – 2014-03-30 19:42:48

回答

3

我不知道Stack Overflow是如何工作的,但我猜想它使用标签来查找相关问题。例如,在这个问题上,前几个相关问题都有标签recommendation-engine。我猜想稀有标签上的匹配计数比普通标签上的匹配多。你可能也想看看term frequency–inverse document frequency

+2

而且路口的大概尺寸在各组标签之间。 – jensgram 2010-02-02 08:29:45

4

如果你想自己从头开始构建这样的事情,你会使用称为TF/IDF:术语频率/逆文档频率。这意味着,为了简化它,您可以在查询中找到整个语料库中不常见的单词,并查找包含这些单词的文档。换句话说,如果有人用“我要买一头大象”的话输入查询,那么查询中的单词“大象”可能是您的语料库中最不常用的单词。 “买”可能是下一个。因此,您对文档(在您的案例中,以前的查询)进行排名,它们包含“大象”一词的含义以及它们包含“购买”一词的含义。 “我”,“到”和“一个”这些词可能在停止列表中,因此您完全忽略它们。您可以对每个文档(在您的案例中为先前的查询)进行排名,其中包含多少匹配词(根据逆文档频率进行加权 - 即非常见词的权重较高)并显示前几位。

我已经过分简化了,您需要阅读此文才能正确使用它,但是以简单的方式实现它确实不是非常复杂。维基百科的页面可能是一个良好的开端:

http://en.wikipedia.org/wiki/Tf%E2%80%93idf

1

鉴于你在一个LAMP堆栈的工作,那么你就应该能够使MySQL's Fulltext search functions很好的利用。我相信TF-IDF校长的工作,并且可以很容易地创建你想要的“相关问题”。

1

有一本很棒的O'Reilly书 - Programming Collective Intelligence - 涵盖了小组发现,推荐和其他类似主题。从内存来看,这些例子都是用Perl编写的,但是我发现很容易理解来自PHP的背景,并且在几个小时内就已经构建了类似于您所追求的内容。

雅虎在http://developer.yahoo.com/search/content/V1/termExtraction.html

+0

我在O'reilly的* P.C.I *预览中看到的示例是Python。 – isomorphismes 2011-03-14 05:20:42