2017-07-04 22 views
5

我有一些糟糕的OCR软件生成的文本。什么算法可以将字符分组为单词?

输出包含单词和空格分隔字符的混合,应该将其分组为单词。例如,

Expr e s s i o n Syntax 
S u m m a r y o f T e r minology 

应该已经

Expression Syntax 
Summary of Terminology 

什么算法可以组字符成词?

如果我用Python,C#,Java,C或C++编程,那么哪些库提供算法的实现?

谢谢。

+0

使用一些nltk语料库并检查组合可能会有所帮助。不知道你最终会得到确切的结果。这种贪婪的做法可能会失败,因为这些词是大词汇的一部分。然而,没有办法确定性地选择大的或部分的单词。这可能是我猜测的一个起点。 – arunk2

+0

我觉得你使用OCR的痛苦。你有没有使用动态编程算法?最终的想法是让程序做出如何分组的决定,并且可能必须以递归方式检查这些决定,每次迭代检查英语字典中的单词以验证它是否是有效的单词。 – Miket25

回答

4

最小的方法:

  1. 在你输入之前,任何单个字母的单词删除空格。标记最终单词作为其中的一部分(例如,在它们前面加一个不在输入中的符号)。
  2. 获取英文单词词典,排序最长到最短。
  3. 对于输入中的每个标记词,找到最长匹配并将其作为单词分解。重复原始“单词”中遗留的字符,直到没有任何遗漏。 (在没有比赛的情况下,就让它独自一人。)

更复杂,矫枉过正的办法:

不带空格分割词的问题是语言的现实世界的问题共同编写没有空格,如中文和日文。我对日文很熟悉,所以我会主要谈谈这一点。

典型的方法使用字典和序列模型。该模型经过训练可以学习标签之间的过渡特性 - 词性标注部分与字典结合,用于计算不同潜在地点分割单词的相对可能性。然后,使用(例如)维特比算法解决整个句子的最可能分裂序列。

如果您只是在清理OCR数据,那么创建这样的系统几乎肯定是矫枉过正的,但如果您感兴趣,可能值得深入研究。


的样品情况下更复杂的方法将工作和简单的一不会:

  • 输入:Playforthefunofit
  • 简单输出:Play forth efunofitforth长于for
  • 成熟的输出:Play for the fun of itforth efunofit是一个低频 - 也就是非自然 - 转换,而for the不是)

您可以通过简单方法在一定程度上解决问题,方法是将常见的短字序列作为单位添加到字典中。例如,将forthe添加为字典单词,并在后处理步骤中将其拆分。

希望有所帮助 - 祝你好运!

相关问题