我的数据库中存储了一系列产品名称,这些名称由英文字符、数字和中文字符混合组成。
有一个名为products
的表,其中包含name_en
和name_zh
等字段。
例如:
AB 10"机翼
Peter Norvig有一个出色的拼写检查算法,但它仅适用于英文。
我想知道是否有办法对包含中文字符的特定术语列表进行类似的操作?
例如,拼写错误如:
A10机翼AB 10鸡翼AB 10鸡一AB 10木几翼
所有这些都会提示AB 10"机翼
为正确的拼写
我该如何实现这一点?
回答:
你面临的问题比Norvig的要复杂得多:
中文输入法
在你的例子中(至少在你的示例中),拼写错误主要是由拼音输入法引起的。同样的“jiyi”(英文:飞机翅膀)输入可能会导致不同的中文短语:
机翼 鸡翼 鸡一 几翼
中文分词
此外,在中文中,要将长句子分解成具有语义意义的小标记,你需要进行分词。例如:
飞机模型零件 -> 分词前飞机-模型-零件 分词后你得到了三个由'-'分隔的短语。
在标记级别上工作
你可能可以从一系列拼写错误开始进行实验。我猜你可以从用户日志中收集一批这样的错误。每次取出一个拼写错误,使用你的例子:
AB 10鸡翼
首先将其分解成标记:
A-B-10-鸡翼
(在这里,你可能需要一个中文分词算法来识别鸡翼应该被视为一个整体)。
然后,你应该尝试使用编辑距离的概念在你的产品数据库中找到其最近的邻居。请注意:
- 你不是一次移除/编辑/替换一个字符,而是一次移除/编辑/替换一个标记。
- 在编辑/替换时,我们应该将候选者限制为原始标记的近邻。例如,鸡翼 -> 机翼,几翼,机一
构建Lucene索引
你还可以尝试从正确的产品名称开始,以不同的方式解决这个问题。将每个产品名称视为一个文档,并从中预构建Lucene索引。然后,对于每个用户查询,查询匹配问题就转化为一个搜索问题,我们向搜索引擎发出查询,以在我们的数据库中找到最匹配的文档。在这种情况下,我相信Lucene可能会处理分词(如果没有,你需要扩展其功能以满足自己的需求)和标记化工作。