如何实现基于同义词的上下文搜索?
How to realize a context search based on synomyns?
假设互联网用户搜索 "trouble with gmail".
我如何 return 带有 "problem|problems|issues|issue|trouble|troubles with gmail|googlemail|google mail" 的条目?
我不喜欢在不同关键字之间手动添加这些链接,所以 "issue <> problem <> trouble" 和 "gmail <> googlemail <> google mail"[= 之间的链接28=]完全未知。它们应该在自动化过程中找到。
解决问题的方法
我提供了一个 synonyms/thesaurus 平台,例如 thesaurus.com、synonym.com 等,或者使用同义词 database/api 并使用此用户生成的输入来进行我在第三个网站上的查询。
但这不会涵盖所有同义词,例如 "gmail"-example.
我还有哪些其他选择?也许是基于给定的数据和过去记录的搜索短语?
评论有点长
您要查找的内容在文本搜索领域称为 "thesaurus" 或 "synonyms" 列表。显然,在 MySQL 中有针对此类功能的提案。它尚未实施。 (Here 是 Stack Overflow 上的一个相关问题,尽管问题中的 link 似乎不起作用。)
解决方法是在将查询发送到数据库之前修改查询。即,将查询解析为单词,然后查找这些单词的所有同义词,并重构查询。这比布尔搜索(需要更仔细的重建)更适合自然语言搜索。
获取带有同义词的最终单词列表的伪代码类似于:
select @finalwords = concat_ws(' ', group_concat(synonyms separator ' ') )
from synonyms s
where find_in_set(s.baseword, @words) > 0;
如果相关系统是一个可公开访问的网站,一个 'out there' 选项是确保所有内容都可以被 Google 抓取,然后使用您自己的 Google 搜索站点,它应该为您提供同义词功能 'for free'。但是,结果中显然会有一些变幻莫测,并且在获得新创建内容的匹配结果方面会滞后,具体取决于爬虫访问站点的频率。可能不适合您的用例,但对于某些人来说,这可能就足够了。
看到你修改后的问题,用publicAPI怎么样?
http://www.programmableweb.com/category/reference/apis?category=20066&keyword=synonym
在我看来,您手上有两个问题:
Lemmatisation, which breaks words down into their lemma, sometimes called the headword or root word. This is more difficult than Stemming, as it doesn't just chop suffixes off of words, but tries to find a true root, e.g. "are" => "be". This is something that is often done programatically, although it appears to be a complex task. Here is an online example of text being lemmatized: http://lemmatise.ijs.si/Services
正在搜索同义词。这是一个非常复杂的问题。我听说过的一种方法是将词形还原引擎修改为 return 给定一组单词的多个词条,即 "problems" => "problem" 和 "issue" ,从而允许更灵活的结果集。然而,这意味着同义词条必须从别处提供给词条化引擎。我真的不知道您将如何以编程方式构建同义词列表。
因此,您可以考虑一种策略,即对要搜索的文本进行词形还原,然后将每个词条传递给您的同义词查找器(无论如何有效)以获得最终的词条列表以执行搜索。
我认为你已经为自己解决了一个非常大的问题。
你得想着忽略语言。
当您用两个词向婴儿展示同一事物时,他会明白这些词是同义词。他可能没有完全理解,但是当这个重复时,他就会学习。
您键入 "problem with gmail"。
两个选择:
- 您的搜索结果:您点击了一项。
系统在搜索 "google mail bug" 时识别出该项目已被点击过。这是一场比赛,我们称之为 "relative search".
- 您的搜索结果很差:
我们将在我们的历史记录中搜索匹配的搜索:
我们提议:"do you mean trouble with yahoo mail? yes/no"。你点不,那是一个"no match"。我们可能会提出其他建议,例如已知列表 "relative search" 或可能与我们历史中的全文搜索和编辑距离相关的列表。
当一个术语的得分足以被视为 "synonym" 时,您可以认为它是。算法可能是错误的,但实际上这取决于你真正的期望。
如果我搜索"sending a message is difficult with google"和"gmail issue",没有什么是同义词,但搜索相对相同。这对我来说比真正的同义词更重要。
如果您真的想获得同义词,我会在第二阶段比较 "relative searches" 中的单词并进行手动检查。
我认为 google 算法主要使用同义词来突出显示页面结果中的搜索词,而不是在使用相关搜索词的情况下进行实际搜索,已知情况除外,因为 "gmail" 和 "google mail" 不一样。
但是,如果您识别出 10 个 "gmail" 的相关搜索,其中都包含 "google mail",这将是猜测它们是同义词的一个很好的起点。
假设互联网用户搜索 "trouble with gmail".
我如何 return 带有 "problem|problems|issues|issue|trouble|troubles with gmail|googlemail|google mail" 的条目?
我不喜欢在不同关键字之间手动添加这些链接,所以 "issue <> problem <> trouble" 和 "gmail <> googlemail <> google mail"[= 之间的链接28=]完全未知。它们应该在自动化过程中找到。
解决问题的方法
我提供了一个 synonyms/thesaurus 平台,例如 thesaurus.com、synonym.com 等,或者使用同义词 database/api 并使用此用户生成的输入来进行我在第三个网站上的查询。
但这不会涵盖所有同义词,例如 "gmail"-example.
我还有哪些其他选择?也许是基于给定的数据和过去记录的搜索短语?
评论有点长
您要查找的内容在文本搜索领域称为 "thesaurus" 或 "synonyms" 列表。显然,在 MySQL 中有针对此类功能的提案。它尚未实施。 (Here 是 Stack Overflow 上的一个相关问题,尽管问题中的 link 似乎不起作用。)
解决方法是在将查询发送到数据库之前修改查询。即,将查询解析为单词,然后查找这些单词的所有同义词,并重构查询。这比布尔搜索(需要更仔细的重建)更适合自然语言搜索。
获取带有同义词的最终单词列表的伪代码类似于:
select @finalwords = concat_ws(' ', group_concat(synonyms separator ' ') )
from synonyms s
where find_in_set(s.baseword, @words) > 0;
如果相关系统是一个可公开访问的网站,一个 'out there' 选项是确保所有内容都可以被 Google 抓取,然后使用您自己的 Google 搜索站点,它应该为您提供同义词功能 'for free'。但是,结果中显然会有一些变幻莫测,并且在获得新创建内容的匹配结果方面会滞后,具体取决于爬虫访问站点的频率。可能不适合您的用例,但对于某些人来说,这可能就足够了。
看到你修改后的问题,用publicAPI怎么样?
http://www.programmableweb.com/category/reference/apis?category=20066&keyword=synonym
在我看来,您手上有两个问题:
Lemmatisation, which breaks words down into their lemma, sometimes called the headword or root word. This is more difficult than Stemming, as it doesn't just chop suffixes off of words, but tries to find a true root, e.g. "are" => "be". This is something that is often done programatically, although it appears to be a complex task. Here is an online example of text being lemmatized: http://lemmatise.ijs.si/Services
正在搜索同义词。这是一个非常复杂的问题。我听说过的一种方法是将词形还原引擎修改为 return 给定一组单词的多个词条,即 "problems" => "problem" 和 "issue" ,从而允许更灵活的结果集。然而,这意味着同义词条必须从别处提供给词条化引擎。我真的不知道您将如何以编程方式构建同义词列表。
因此,您可以考虑一种策略,即对要搜索的文本进行词形还原,然后将每个词条传递给您的同义词查找器(无论如何有效)以获得最终的词条列表以执行搜索。
我认为你已经为自己解决了一个非常大的问题。
你得想着忽略语言。
当您用两个词向婴儿展示同一事物时,他会明白这些词是同义词。他可能没有完全理解,但是当这个重复时,他就会学习。
您键入 "problem with gmail"。
两个选择:
- 您的搜索结果:您点击了一项。
系统在搜索 "google mail bug" 时识别出该项目已被点击过。这是一场比赛,我们称之为 "relative search".
- 您的搜索结果很差:
我们将在我们的历史记录中搜索匹配的搜索: 我们提议:"do you mean trouble with yahoo mail? yes/no"。你点不,那是一个"no match"。我们可能会提出其他建议,例如已知列表 "relative search" 或可能与我们历史中的全文搜索和编辑距离相关的列表。
当一个术语的得分足以被视为 "synonym" 时,您可以认为它是。算法可能是错误的,但实际上这取决于你真正的期望。
如果我搜索"sending a message is difficult with google"和"gmail issue",没有什么是同义词,但搜索相对相同。这对我来说比真正的同义词更重要。
如果您真的想获得同义词,我会在第二阶段比较 "relative searches" 中的单词并进行手动检查。
我认为 google 算法主要使用同义词来突出显示页面结果中的搜索词,而不是在使用相关搜索词的情况下进行实际搜索,已知情况除外,因为 "gmail" 和 "google mail" 不一样。
但是,如果您识别出 10 个 "gmail" 的相关搜索,其中都包含 "google mail",这将是猜测它们是同义词的一个很好的起点。