8

给定几个单词的输入,我想要一个实用程序,它可以返回一组不同的相关术语、短语或概念。需要注意的是,它需要有一个大的术语图,否则该功能不会很有用。

例如,提交“棒球”将返回

["shortstop", "Babe Ruth", "foul ball", "steroids", ... ]

Google Sets是我能找到的此类功能的最佳示例,但我无法使用它,因为它们没有公共 API(而且我不会违反他们的 TOS)。此外,单个单词输入不会获得非常多样化的结果。我正在寻找一个切线的解决方案。

我尝试过的最接近的方法是使用WikiPedia 的 API来搜索类别和反向链接,但没有办法直接按"相关性""流行度"对这些结果进行排序。没有它,建议列表就会很庞大,而且到处都是,这不是立即有用的,而且很难减少。

使用 A Thesaurus 也可以最低限度地工作,但这会遗漏任何专有名词或切线相关的术语(如上面列出的任何结果)。


我很乐意重用一个开放服务,如果存在的话,但我还没有找到足够的东西。

我正在寻找一种方法来实现这一点,要么在内部使用大量起始集,要么重用提供此功能的免费服务。

有解决办法吗? 提前谢谢!


更新: 感谢您提供令人难以置信的密集和信息丰富的答案。我将在 6 到 12 个月内选择一个成功的答案,届时我希望能理解你们所有人的建议 =)

4

3 回答 3

10

您可能对WordNet感兴趣。理解 API 需要一点语言知识,但基本上该系统是英语单词之间基于含义的链接的数据库,这或多或少是您正在搜索的内容。如果您愿意,我相信我可以挖掘更多信息。

于 2009-02-21T02:00:16.530 回答
8

Peter Norvig(Google 的研究主管)在Facebook 技术谈话中谈到了他们在 Google 是如何做到这一点的(特别提到了 Google Sets) 。这个想法是一个相对简单的算法在一个巨大的数据集(例如整个网络)上比一个复杂的算法在一个小数据集上要好得多。

您可以将Google 的 n-gram 集合作为起点。你会开始看到哪些概念被组合在一起。Norvig 暗示谷歌内部有多达 7-grams 用于谷歌翻译之类的东西。

如果你更有野心,你可以下载你想要的语言的所有维基百科文章,并创建你自己的 n-gram 数据库。

如果你只有一个词,问题就更复杂了;查看这篇最近的论文,了解有关词义消歧的更多详细信息。

这不是一个简单的问题,但正如您提到的那样很有用。最后,我想你会发现一个真正成功的实现会有一个相对简单的算法和大量的数据。

于 2009-02-21T16:07:49.957 回答
5

请看以下两篇论文:

  • 聚类搜索引擎的用户查询 [pdf]
  • 通过聚类关键字进行主题检测 [pdf]
  • 这是我尝试进行非常简化的解释:

    如果我们有一个过去用户查询的数据库,我们可以定义两个查询之间的相似度函数。例如:共同的单词数。现在对于我们数据库中的每个查询,我们计算它与其他查询的相似度,并记住 k 个最相似的查询。这些中不重叠的单词可以作为“相关术语”返回。

    我们还可以对包含用户可能正在搜索的信息的文档数据库采用这种方法。我们可以将两个搜索词之间的相似度定义为包含两者的文档数除以包含其中任何一个的文档数。为了决定测试哪些术语,我们可以扫描文档并丢弃太常见的单词(“and”、“the”等)或太晦涩的单词。

    如果我们的数据允许,那么我们可以查看哪些查询导致用户选择哪些结果,而不是按内容比较文档。例如,如果我们有数据显示搜索“Celtics”和“Lakers”的用户最终都点击了 espn.com,那么我们可以调用这些相关术语。

    如果您从头开始,没有关于过去用户查询的数据,那么您可以尝试使用 Wikipedia 或Bag of Words数据集作为文档数据库。如果您正在寻找用户搜索词和结果的数据库,并且您喜欢冒险,那么您可以查看 AOL 搜索数据。

    于 2009-02-21T15:09:42.263 回答