【问题标题】:Dutch (or German) compound words in search functions (in PHP)搜索功能中的荷兰语(或德语)复合词(在 PHP 中)
【发布时间】:2023-02-08 06:55:59
【问题描述】:

一段时间以来,我一直在构建搜索功能,因为我正在构建一个烹饪博客。

在荷兰语(类似于德语)中,可以将尽可能多的复合词加在一起创建一个新词。当我想要包含在复合词中包含相关单数词的搜索结果时,这让我很头疼。这有点像反向 Scunthorpe 问题,我实际上想在其他词中包含某些词,但只是有时。

例如,荷兰语中的 rice 是里士满.糙米是zilvervliesrijst香兰饭是班丹瑞斯特.如果我想让这两个出现在搜索结果中,我必须搜索单词是否存在里面一个词,而不是他们是否是这个词。

但是,这会立即导致较小的单词出现问题,这些单词可能会意外地存在于其他单词中。例如,鸡蛋这个词是,而韭菜是prei.洋葱是用户界面,而抱子甘蓝是斯普鲁特杰斯.您可以看到,接受与搜索字符串匹配的字符串的子部分可能会导致重大问题。

我最初尝试对包含搜索字符串的单词的百分比进行评分,但这也会导致问题prei是 50%, 尽管zilvervliesrijst仅约25%里士满.这也使得使用编辑距离来解决这个问题变得非常不切实际。

我目前的解决方案如下:我有一个 SQL 表的成分列表,用于根据成分列表自动计算每个食谱的价格和卡路里总量,我用它来将所有相关的同义词添加到名称列.基本上,zilvervliesrijst被列为zilvervliesrijst|莱斯特.我还使用它来添加一个术语的复数和单数版本,这样我就不必测试它们了。

但是,这不包括成分列表以外的任何地方的任何复合词。诸如职称、菜系、烹饪设备、饮食偏好等等,仍然存在这个问题。

我的问题是,在计算机科学领域是否有一种非图书馆式的方法来解决这个问题?还是每次我想添加新食谱时,我都注定要包括每一个可能的可搜索复合词及其单数成分?我只是希望情况并非如此,因为这将大大增加每个额外的库条目所需的处理时间。

【问题讨论】:

  • 我认为你正在寻找的东西通常被称为“词干”——将一个词减少到它的“词干”或“引理”。这是一个难题——自然语言很复杂,充满了例外和矛盾,所以简单的规则很快就会失效。您最好寻找一个现有的全文搜索包,它针对您感兴趣的语言内置了此功能;这些通常作为一种特殊的索引内置到数据存储中。
  • 嗯,真可惜。问题是有些食谱相对独特,因此大多数标题词可能不会出现在其中。像巧克力焦糖蛋糕这样的东西会变成 chocoladekarameltaart,它太具体了,不能放在这样的图书馆里。不过,这可能是最好的方法。但我肯定会研究词干提取,也许该理论中有一些技巧至少可以帮助我一点点。谢谢! :)
  • 您不需要该工具知道单词“chocoladekarameltaart”,只需在分析时将“chocolade”、“karamel”和“taart”视为可能的成分即可。我不知道这些工具究竟是如何工作的,但如果针对荷兰语优化的全文搜索未能将它们识别为组件,我会感到非常惊讶。
  • 没错,但有些术语在荷兰语词典中不存在。例如,柠檬蛋白派仍然经常被命名为柠檬蛋白酥皮艺术。问题是,这最终可能不得不成为算法方法和基于异常的方法之间的平衡。
  • 工具已经是那种妥协。是的,他们可能遗漏了一些术语,但他们可能有办法将这些术语添加到词典中并让它们与算法交互。我真的不认为这是你想要自己构建的东西,除了纯粹作为一种学习练习;你想“站在巨人的肩膀上”,他们已经在这个问题上花费了数周时间。

标签: php search levenshtein-distance lexical-analysis stemming


【解决方案1】:

相信你可以在不使用库的情况下做到这一点是不现实的,也可能是字典(可能作为库的一部分捆绑在一起)。

实际上有两个有点正交的问题:

  • 将复合词拆分成它们的组成部分。
  • 识别简单(非复合)词的词干。 (例如,删除复数标记和词形变化。)这通常被称为“词干提取”,但这并不是最好的策略;您还会发现相当尴尬的术语"lemmatization"

这两项任务在我所知道的所有语言中都存在歧义。 (德国的例子,取自Arxiv paper describing the German-language morphological analyser DEMorphy"Rohrohrzucker",意思是“生蔗糖”——roh Rohr Zucker——但同样可以分成罗尔·奥尔·祖克,管耳糖。)

如何在合理的时间内(使用大量 CPU 处理能力)完成这些任务的基本概述是:

  1. 使用 ngram 分析找出合理的分词点。
  2. 对每个候选组成词进行词形还原以获得合理的 POS(词性)标记。
  3. 使用训练有素的机器学习模型(或类似形式的模型)拒绝无意义(或至少极不可能)的划分。
  4. 在每一步,检查字典中可能的极端情况(极端情况)。

    当然,这只是一个粗略的轮廓。

    我能够毫不费力地找到一些最近关于如何使用荷兰语单词进行此操作的讨论。我什至没有资格讨论这些论文的有效性,所以我会让你自己去搜索。但我可以告诉你两件事:

    • 正在解决这个问题,但不一定要生产免费提供的产品。

    • 如果您选择自己解决它,您最终会在该项目上投入大量时间,尽管您可能会发现它很有趣。如果你真的成功了,你最终会得到一个有用的产品和一篇论文的开始(如果你有学术抱负,可能会有用)。

    不管你选择怎么做,你最好只为每个新食谱做一次。分析输入的每个食谱的内容,以构建一个搜索词列表,您可以将其与食谱一起存储在数据库中。您可能还想拆分和词形化搜索查询,但这些通常足够短,CPU 时间是合理的。即便如此,请考虑缓存分析以节省常见查询的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多