我正在开发一个适用于 OCR 输出的非英语拼写校正系统。我使用非常大的词典来检查拼写错误并提供建议。
大多数拼写错误是因为字母的形式相似。示例ـجـ
,ـچـ
,ـحـ
,ـخـ
或غ
,ع
,I
和等。
拼写检查系统为我们要检查的单词提供了一些建议。例如,如果我们输入 l
,它会建议这些词:
-
u
-
v
-
y
-
voga
由于 volga
的长度是 4,那么我们将只保留 4 个字母的建议。现在因为 OCR 引擎可以将 boga
检测为 yoga
(因为它们的形式相似),我们将选择 toga
作为 voga
作为 OCR 输出的最佳建议。
在我们的语言中,这种选择非常有效。比如我们输入 v
,会提示这些词:
-
y
-
yoga
-
voga
-
مدپر
Based on our sets (in this example: مدارا
, مدار
, مدیر
and مراد
, ـبـ
, ـپـ
and ـیـ
, ز
and ر
, ژ
, ذ
) and word's length, د
would be best option for مـ
.
我通常在 PHP 脚本语言中实现此功能的方式是将建议的单词保持相同的长度,然后通过替换所有集合来创建拼写错误单词的所有可能组合(例如 فـ
、 قـ
、 مدیر
然后是 مدپر
、 مدپر
, فدپر
等等),然后在建议列表中搜索相同的词。但是这种实现方法真的很慢(特别是在大上下文中)并且几乎没有用。
在 PHP 中实现这种功能的最佳方法或算法是什么?
更新:
生成建议列表的引擎经过优化,通常会在建议列表中包含正确的单词。问题是我的系统必须在没有任何人工智能的情况下选择其中一个建议作为正确的词。所以我认为这种方法在我的语言中很好,因为有很多字母具有相似形式的集合,这就是为什么 OCR 引擎通常会错误地检测到单词。但如果有更好的方法,欢迎大家提出。
最佳答案
我仍然认为这个问题太宽泛了,不能在这里问。在我看来你仍然不知道如何去做,所以你不应该要求 PHP 解决方案。在我看来,这个问题首先是关于算法解决方案的,而不是关于编程或实现的。我确信存在许多不同的解决方案,并且由于我们几年前在该领域进行了科学研究,因此我将提出一个解决方案,让您了解如何做到这一点。
假设您有一个无效的“OCR 词”,并且您想从有效词词典中选择最有效的词来替换它。
从标准建议算法开始。这样你就得到了几个候选词。
现在计算这些词与 OCR 词的“距离”。
使用具有最小计算距离的候选对象。
现在的问题是如何计算两个单词的距离。您可以从 Hamming distance 开始- 但是这个经典算法对你的情况来说不够好,它不会比你从第 1 步中得到的更多,所以你需要做一些更适合你的东西。简单地说,您想为相似的符号/字母提供一些奖励。我们使用模糊自动机来解决 DNA 分析的相同情况。在这里写完整的算法太长了,请看our paper如果您需要更多信息。 (链接转到 researchgate 存储库。)
您也可以完全跳过第 1 步,为具有相似性的相似词创建一个全局搜索系统,这在我们的论文中也有描述。我会投票支持这种全局性方法。
关于php - PHP中基于一组具有相似形式的字母的拼写校正改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38947374/