如何对混合了英文和中文字符的文本进行Norvig拼写检查?

我的数据库中存储了一系列产品名称,这些名称由英文字符、数字和中文字符混合组成。

有一个名为products的表,其中包含name_enname_zh等字段。

例如:

AB 10"机翼

Peter Norvig有一个出色的拼写检查算法,但它仅适用于英文。

我想知道是否有办法对包含中文字符的特定术语列表进行类似的操作?

例如,拼写错误如:

A10机翼AB 10鸡翼AB 10鸡一AB 10木几翼

所有这些都会提示AB 10"机翼为正确的拼写

我该如何实现这一点?


回答:

你面临的问题比Norvig的要复杂得多:

中文输入法

在你的例子中(至少在你的示例中),拼写错误主要是由拼音输入法引起的。同样的“jiyi”(英文:飞机翅膀)输入可能会导致不同的中文短语:

 机翼 鸡翼 鸡一 几翼

中文分词

此外,在中文中,要将长句子分解成具有语义意义的小标记,你需要进行分词。例如:

飞机模型零件 ->  分词前飞机-模型-零件   分词后你得到了三个由'-'分隔的短语。

在标记级别上工作

你可能可以从一系列拼写错误开始进行实验。我猜你可以从用户日志中收集一批这样的错误。每次取出一个拼写错误,使用你的例子:

AB 10鸡翼

首先将其分解成标记:

A-B-10-鸡翼

(在这里,你可能需要一个中文分词算法来识别鸡翼应该被视为一个整体)。

然后,你应该尝试使用编辑距离的概念在你的产品数据库中找到其最近的邻居。请注意:

  • 你不是一次移除/编辑/替换一个字符,而是一次移除/编辑/替换一个标记。
  • 在编辑/替换时,我们应该将候选者限制为原始标记的近邻。例如,鸡翼 -> 机翼,几翼,机一

构建Lucene索引

你还可以尝试从正确的产品名称开始,以不同的方式解决这个问题。将每个产品名称视为一个文档,并从中预构建Lucene索引。然后,对于每个用户查询,查询匹配问题就转化为一个搜索问题,我们向搜索引擎发出查询,以在我们的数据库中找到最匹配的文档。在这种情况下,我相信Lucene可能会处理分词(如果没有,你需要扩展其功能以满足自己的需求)和标记化工作。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注