【发布时间】: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