如何对混有英文字母的汉字进行 Norvig 拼写检查?
How to do Norvig spell check for chinese characters mixed with english letters?
我的数据库里有一个英文字母数字和汉字混合写的产品名称列表。
有一个名为 products
的 table,其中包含字段 name_en
、name_zh
。
例如
AB 10"机翼
Peter Norvig 有一个 fantastic algorithm for spell check 但它只适用于英语。
我想知道是否有办法对包含汉字的狭义术语列表做类似的事情?
例如拼写错误如
A10机翼
AB 10鸡翼
AB 10鸡一
AB 10木几翼
全部会提示AB 10"机翼
为正确拼写
我该怎么做?
你的问题比 Norvig 的复杂得多:
中文输入法
您的案例中的拼写错误(至少在您的示例中)主要是由 pinyin 输入法引起的。一次相同的“jiyi”(英语:airplane wings)可能会导致不同的中文短语:
机翼
鸡翼
鸡一
几翼
中文分词
同样在中文中,要将一个长句子分解成具有语义意义的小标记,您需要做 segmentation。例如:
飞机模型零件 -> Before segmentation
飞机-模型-零件 After segmentation you got three phrases separated by '-'.
令牌级别的工作
您或许可以从一系列拼写错误开始进行试验。我猜你可以从你的用户日志中收集到一堆。使用您的示例,一次排除一个拼写错误:
AB 10鸡翼
首先将其分解为令牌:
A-B-10-鸡翼
(这里可能需要一个中文分词算法来实现鸡翼应该一起处理)
那么你应该尝试使用编辑距离的想法在你的产品数据库中找到它最近的邻居。注意:
- 您一次 remove/edit/replace 不是一个字符,而是一次 remove/edit/replace 一个标记。
- 当edit/replace时,我们应该将候选者限制为原始标记的近邻。例如鸡翼->机翼,几翼,机一
构建 Lucene 索引
您也可以尝试以不同的方式解决问题,从正确的产品名称开始。将每个产品名称视为一个文档,并从中预构建 lucene 索引。然后对于每个用户查询,查询匹配问题被转换为搜索问题,我们向搜索引擎发出查询以在我们的数据库中找到最匹配的文档。在这种情况下,我相信 Lucene 可能会为您处理分段(如果没有,您需要扩展其功能以满足您自己的需要)和标记化。
我的数据库里有一个英文字母数字和汉字混合写的产品名称列表。
有一个名为 products
的 table,其中包含字段 name_en
、name_zh
。
例如
AB 10"机翼
Peter Norvig 有一个 fantastic algorithm for spell check 但它只适用于英语。
我想知道是否有办法对包含汉字的狭义术语列表做类似的事情?
例如拼写错误如
A10机翼
AB 10鸡翼
AB 10鸡一
AB 10木几翼
全部会提示AB 10"机翼
为正确拼写
我该怎么做?
你的问题比 Norvig 的复杂得多:
中文输入法
您的案例中的拼写错误(至少在您的示例中)主要是由 pinyin 输入法引起的。一次相同的“jiyi”(英语:airplane wings)可能会导致不同的中文短语:
机翼
鸡翼
鸡一
几翼
中文分词
同样在中文中,要将一个长句子分解成具有语义意义的小标记,您需要做 segmentation。例如:
飞机模型零件 -> Before segmentation
飞机-模型-零件 After segmentation you got three phrases separated by '-'.
令牌级别的工作
您或许可以从一系列拼写错误开始进行试验。我猜你可以从你的用户日志中收集到一堆。使用您的示例,一次排除一个拼写错误:
AB 10鸡翼
首先将其分解为令牌:
A-B-10-鸡翼
(这里可能需要一个中文分词算法来实现鸡翼应该一起处理)
那么你应该尝试使用编辑距离的想法在你的产品数据库中找到它最近的邻居。注意:
- 您一次 remove/edit/replace 不是一个字符,而是一次 remove/edit/replace 一个标记。
- 当edit/replace时,我们应该将候选者限制为原始标记的近邻。例如鸡翼->机翼,几翼,机一
构建 Lucene 索引
您也可以尝试以不同的方式解决问题,从正确的产品名称开始。将每个产品名称视为一个文档,并从中预构建 lucene 索引。然后对于每个用户查询,查询匹配问题被转换为搜索问题,我们向搜索引擎发出查询以在我们的数据库中找到最匹配的文档。在这种情况下,我相信 Lucene 可能会为您处理分段(如果没有,您需要扩展其功能以满足您自己的需要)和标记化。