【问题标题】:How to build a 'related questions' engine?如何构建“相关问题”引擎?
【发布时间】:2011-01-12 01:33:50
【问题描述】:

我们的一个较大的网站有一个部分,用户可以在其中向网站所有者发送问题,并由其员工进行个人评估。 当经常弹出相同的问题时,他们可以将此特定问题添加到常见问题解答中。

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

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

值得一提的是,该网站是基于 LAMP 堆栈构建的,因此这些是可用的技术。

谢谢!

【问题讨论】:

标签: php mysql lamp recommendation-engine


【解决方案1】:

如果您想自己从头开始构建类似的东西,您可以使用称为 TF/IDF 的东西:词频/逆文档频率。这意味着,为了大大简化它,您可以在查询中找到在整个语料库中不常见的单词,并找到包含这些单词的文档。

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

我已经过分简化了,您需要仔细阅读以使其正确,但以简单的方式实现它真的不是很复杂。维基百科页面可能是一个不错的起点:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 还有可能是标签集之间的交集大小。
    【解决方案3】:

    鉴于您在 LAMP 堆栈中工作,那么您应该能够充分利用 MySQL's Fulltext search functions。我相信这适用于 TF-IDF 原则,并且应该可以很容易地创建您想要的“相关问题”。

    【讨论】:

      【解决方案4】:

      有一本很棒的 O'Reilly 书籍 - Programming Collective Intelligence - 涵盖了小组发现、推荐和其他类似主题。根据记忆,示例是用 Perl 编写的,但我发现来自 PHP 背景很容易理解,并且在几个小时内就构建了类似于您所追求的东西。

      雅虎在http://developer.yahoo.com/search/content/V1/termExtraction.html有一个关键字提取器网络服务

      【讨论】:

      • 我在 O'reilly 的 P.C.I. 预览中查看的示例使用 Python。
      【解决方案5】:

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

      How do you implement a "Did you mean"?

      【讨论】:

        猜你喜欢
        • 2011-11-11
        • 2015-10-28
        • 2011-01-13
        • 2018-06-19
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        相关资源
        最近更新 更多