如何构建“相关问题”引擎?

时间:2010-02-02 08:24:16

标签: php mysql lamp recommendation-engine

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

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

有哪些方法可以构建此类功能? 我知道我应该以某种方式评估问题并将其与常见问题中的问题进行比较,但这种比较如何运作?是否提取了关键字,如果是,如何?

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

谢谢!

5 个答案:

答案 0 :(得分:4)

如果您想从头开始构建这样的东西,您可以使用TF / IDF:Term Frequency / Inverse document frequency。这意味着,为了极大地简化它,您会在查询中找到整个语料库中不常见的单词并找到包含这些单词的文档。

换句话说,如果有人在其中输入带有“我想买大象”字样的查询,那么在查询中的单词中,单词“elephant”可能是您语料库中最不常见的单词。 “买”可能是下一个。因此,您将文档(在您的情况下,以前的查询中)排列为包含“elephant”一词的多少,然后将它们包含在“buy”中。单词“I”,“to”和“an”可能在一个停止列表中,所以你完全忽略它们。您按每个文档(先前的查询,在您的情况下)对有多少匹配的单词进行排名(根据逆文档频率加权 - 即非常常单词的高权重)并显示前几位。

我已经过度简化了,你需要阅读这篇文章才能做到正确,但以简单的方式实现起来并不是非常复杂。维基百科页面可能是一个很好的起点:

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

答案 1 :(得分:3)

我不知道Stack Overflow是如何工作的,但我猜它会使用标签来查找相关问题。例如,在这个问题上,前几个相关问题都有标记recommendation-engine。我猜想稀有标签上的匹配比普通标签上的匹配更多。

您可能还想查看term frequency–inverse document frequency

答案 2 :(得分:1)

鉴于您正在使用LAMP堆栈,那么您应该能够充分利用MySQL's Fulltext search functions。我认为这对TF-IDF主体起作用,并且应该可以很容易地创建你想要的“相关问题”。

答案 3 :(得分:1)

有一本很棒的O'Reilly书 - Programming Collective Intelligence - 涵盖了小组发现,推荐和其他类似主题。从内存中可以看到Perl中的示例,但我发现它很容易理解来自PHP背景,并且在几个小时内构建了类似于您所追求的内容。

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

处有一个关键字提取器webservice

答案 4 :(得分:0)

您可以使用拼写检查,其中语料库是现有常见问题条目的标题/文字:

How do you implement a "Did you mean"?