【问题标题】:Partial and Full Phrase Match部分和完整的短语匹配
【发布时间】:2016-09-11 22:24:11
【问题描述】:

假设我有一句话:“比起他的Lamborghini Gallardo,约翰更喜欢把他的宠物lamb放在他的Lamborghini Huracan中”和我有一本包含“兰博基尼”、“兰博基尼 Gallardo”和“兰博基尼 Huracan”的字典。提取粗体词,实现词组“Lamborghini Gallardo”和“Lamborghini Huracan”作为词组匹配,以及其他部分匹配“Lamborghini”和“lamb”的好方法是什么?优先选择词组匹配而不是单个关键字。

弹性搜索提供完全匹配、匹配短语和部分匹配。确切的术语显然在这里不起作用,也不匹配短语,因为在这种情况下整个句子都被视为短语。如果我在句子中只有感兴趣的关键字,我相信部分匹配是合适的。通过以前的 SO 线程,我发现 proximity for relevance 似乎相关,但不确定这是否是“最佳选择”,因为需要设置阈值。或者即使有比弹性搜索更简单/更好的选择(这似乎更适合全文搜索而不是简单的关键字匹配到数据库)?

【问题讨论】:

    标签: elasticsearch match keyword keyword-search


    【解决方案1】:

    听起来您想使用受控词汇(您的行业术语和短语字典)从文档中执行关键短语提取

    [上面的斜体字词可帮助您在 SO 和 Google 上找到相关答案]


    这一级别的分析将您带离搜索堆栈,进入自然语言处理堆栈。由于 NLP 往往是资源密集型的,它往往在离线时进行,或者在搜索应用程序的情况下,在索引时进行。

    要实现这一点,您需要:

    1. 关键词提取工具集成到您的搜索索引代码中,以生成每个文档的已识别关键词列表。
    2. 将这些关键短语作为shingles 索引到新的 Elasticsearch 字段中。
    3. 在查询时搜索的字段列表中包含这个组合关键字字段 - 很可能会提高分数。

    要获得帮助您进行受控关键词提取的快速取胜工具,请查看KEA(用 java 编写)。

    (您也可以自己编写,但如果您也希望提取不受控制的关键短语(不在字典中),训练有素的提取器会更好地为您服务。More tools here。)

    【讨论】:

    • 感谢您信息丰富的回复彼得。由于我的词汇表包含我想要匹配的关键字和短语(而不是文档),所以数据库不需要带状疱疹,不是吗?不过,我正在考虑反过来使用带状疱疹;从用户搜索词创建带状疱疹,然后对这些带状疱疹执行“正常”精确匹配查询以识别二元组或三元组,或者对最长匹配的带状疱疹使用部分匹配和提升分数(默认完成)。这样我还可以检查拼写错误以及识别关键短语。这有意义吗?
    • 正确。带状疱疹将帮助您在查询方面避免匹配关键字中的单个术语。您可能可以对短语查询执行类似的操作,但由于您无法控制搜索者输入的字词,因此带状疱疹可能会让您更接近您想要的位置。
    • 这种方式我希望带状疱疹能够启用二元/三元匹配,模糊过滤器将允许拼写错误,提升将提供最接近的匹配,并且同义词可以很好地匹配同义词。想知道这种方法在训练命名实体识别模型时是否更简单、更/同样有效......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多