代码之家  ›  专栏  ›  技术社区  ›  lprsd

堆栈溢出相关问题算法

  •  26
  • lprsd  · 技术社区  · 16 年前

    在输入标题后出现的相关问题,以及在查看问题时位于右侧栏中的相关问题似乎表明了非常恰当的问题。

    Spolsky在一次谈话中说:“堆栈溢出只进行SQL搜索,不使用特殊的算法。”

    在这种情况下,有什么算法可以给出很好的答案呢? 在这种情况下,如何进行数据库搜索?使标题可搜索,搜索关键字或搜索标签和那些投票最多的问题?

    7 回复  |  直到 7 年前
        1
  •  8
  •   workmad3    16 年前

    相关问题侧边栏将建立在每个问题的标签上(可能通过基于标签重叠对其进行排名,因此共有5个标签,共有4个标签等)。

    其余部分将建立在启发式和适合自然语言处理的算法之上。这些通常在通用语言中不是很好,但是一旦词汇减少到一个技术领域(如编程),它们中的大多数就非常好了。

        2
  •  18
  •   Nick Fortescue    16 年前

    如果你听 Stack Overflow podcast 32 (不幸的是,成绩单没有太多内容)你可以听到杰夫·阿特伍德说了一点他是如何做到的。

    似乎算法是这样的:

    • 接受这个问题
    • 删除英语中最常用的单词(从他从谷歌获得的列表中)
    • 向SQL Server 2008全文搜索引擎提交全文搜索

    有关全文搜索的详细信息,请参见: http://msdn.microsoft.com/en-us/library/ms142571.aspx

    这可能已经过时了-他们说要转向更好/更快的全文搜索,例如 Lucene 我隐约记得杰夫在播客中说这已经完成了。

        3
  •  6
  •   aleemb    16 年前

    看一看波特,他想 stemming 算法,如果你想进入“相关”的算法。

    例如,英语词干分析器, 应识别字符串“cats”(和 可能是“像猫一样”、“像猫一样”等)。 基于根目录“cat”,以及 “stemmer”、“stemming”、“stemmed”作为 基于“茎”。一种阻塞算法 减少“钓鱼”、“钓鱼”等词, “fish”和“fisher”的词根, “鱼”。

    处理完一个文档并对其进行词干处理后,可以按计数对词干单词进行索引,然后与其他文档进行比较。这是解决这个问题最基本的方法。

    也要注意忽略 stop words 如“the”、“an”、“of”等。

        5
  •  1
  •   lothar    16 年前

    我不知道它是如何实现的,但我的预感是它们使用了 approximate string matching .

        6
  •  0
  •   bayer    16 年前

    这样的问题可以通过在词干上做一个“词袋”来解决。这基本上是一个字数向量。这些词经过预处理(词干化),并根据它们在句子中出现的概率进行加权(“the”的概率高于“probability”,因此应减去其权重)。然后,您可以将这袋单词视为欧几里得空间中的向量或概率密度的样本。

    您可以将算法应用于最近邻搜索或语义散列。后者似乎是sota(见 http://www.cs.toronto.edu/~rsalakhu/papers/semantic_final.pdf )

        7
  •  -1
  •   Hemanshu Bhojak    16 年前

    使用SQL Server的全文搜索功能。