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