拼写检查器的语言建模

数据挖掘 神经网络 lstm rnn 模型选择 语言模型
2022-02-25 17:02:55

我正在研究拼写检查器,我想创建一个拼写检查器,我对使用哪个模型感到困惑

  1. 字级建模
  2. 角色级建模

另外,我更喜欢神经网络而不是 Peter Norvig 或 N-gram/K-gram 或任何其他“Vanilla”算法,以便网络捕获上下文

示例:输入:我已申请信用卡 输出:我已申请信用卡

我已经完成了使用字符级 BLSTM 与噪声制造者/错误模型和注意机制但对结果不满意的模型。https://towardsdatascience.com/creating-a-spell-checker-with-tensorflow-d35b23939f60

我读过的一篇文章是使用 OpenNMT,但结果是灾难性的。https://medium.com/scribd-data-science-engineering/neural-spelling-corrections-and-the-importance-of-accuracy-977c0063d20f

1个回答

从单词级别开始的简单方法:

给定一个短语credit cart,您想将其更正为credit card获取所有拼写正确的单词(假设现在在您的字典中找到的任何内容都正确拼写,即使语法不正确)并使用您最喜欢的嵌入将它们嵌入到向量中,或者更好的是,在与您相关的语料库中微调该嵌入。

接下来,对于所有拼写错误的单词,根据编辑距离生成少量候选词。然后根据与正确拼写集合的嵌入平均值的距离从该集合中选择获胜者。

这当然不是最佳的,但将是一个开始的框架。

一种从单词级别开始的方法(序列建模):

获取您最喜欢的词级序列模型,在您选择的语料库上对其进行微调。

然后,您一次处理要检查一个单词的文档,如果单词拼写错误,则根据之前的上下文预测下一个单词。您应该剥离最后一层以查看概率,然后选择最有可能的单词中的前 N ​​个。

然后根据与实际下一个词的编辑距离对预测的下一个词进行评分,然后选择它。

最后的笔记

对于这两种方案,您肯定需要做一些工程工作,并且可能需要根据单词的相关性或可能性等进行加权。

最后,我怀疑真正的最佳方法是拥有大量拼写错误和后续更正的语料库(MS 或 Google 会从他们的文档软件使用数据库中获得)。有了这么多数据,您可能只需要查找最常见的拼写错误并替换它,而无需 ML。或者至少缩小了另一种简单评分技术的“正确”替换候选集。

否则,您可以尝试使用字符级模型来执行与我的第二个示例类似的操作,一次向前移动一个字符,对于那些拼写错误的单词,生成每个字符的概率分布。基于此,您可以巧妙地尝试找出穿过您可能的字符分布的最佳“路径”,并再次对结果候选者进行评分,与附近单词的某种嵌入距离。从而为您提供最有可能替换拼写错误的单词的字符组合。这不是一个很好的解决方案,因为您没有考虑后面的单词,但也许使用双向模型您可以做到这一点。

无论如何,希望这个漫长的漫步有点帮助!请记住,许多针对实际用例的深度学习只是工程!