我有一个产品名称列表,中混合了英文字母和数字以及存储在我数据库中的中文字符。
有一个名为products
的表格,其中包含name_en
,name_zh
字段等。
E.g。
AB 10"机翼
Peter Norvig有一个fantastic algorithm for spell check,但它只适用于英语。
我想知道是否有一种方法可以为包含中文字符的一个较窄的术语列表做类似的事情?
E.g。
等错误拼写A10机翼
AB 10鸡翼
AB 10鸡一
AB 10木几翼
所有人都会提示AB 10"机翼
作为正确的拼写
我该怎么做?
答案 0 :(得分:2)
你有比Norvig更复杂的问题:
您案例中的错误拼写(至少在您的示例中)主要是由pinyin输入法引起的。同样打字“jiyi”(英文:飞机机翼)可能导致不同的中文短语:
机翼
鸡翼
鸡一
几翼
同样用中文将长句分成具有语义含义的小标记,你需要做segmentation。例如:
飞机模型零件 -> Before segmentation
飞机-模型-零件 After segmentation you got three phrases separated by '-'.
你可能可以从错误拼写列表开始进行实验。我想你可以从你的用户日志中收集一堆。使用您的示例一次取出一个拼写错误:
AB 10鸡翼
首先将其分解为代币:
A-B-10-鸡翼
(这里你可能需要一个中文分词算法来实现鸡翼应该一起对待)。
然后你应该尝试使用编辑距离的想法在你的产品数据库中找到它最近的邻居。请注意:
您也可以尝试以不同的方式解决问题,从正确的产品名称开始。将每个产品名称视为文档,并从中预构建lucene索引。然后,对于每个用户查询,查询匹配问题将转换为搜索问题,在该问题中,我们向搜索引擎发出查询,以便在我们的数据库中查找最匹配的文档。在这种情况下,我相信Lucene可能会处理分段(如果没有,您需要扩展其功能以满足您自己的需要)并为您进行标记化。