【问题标题】:What algorithms can group characters into words?哪些算法可以将字符组合成单词?
【发布时间】:2017-07-04 00:02:57
【问题描述】:

我有一些糟糕的 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++ 编程,哪些库提供算法的实现?

谢谢。

【问题讨论】:

  • 使用一些 nltk 语料库并检查组合可能会有所帮助。不确定你最终会得到确切的结果。如果单词是大单词的一部分,这种贪婪的方法可能会失败。然而,没有办法确定性地选择大词或部分词。我猜这可能是一个起点。
  • 我感受到了您使用 OCR 的痛苦。您是否考虑过使用动态规划算法?最终的想法是让程序决定如何分组,并且这些决定可能必须以递归方式检查,每次迭代都会检查英语词典中的一个单词,以验证它是否是一个有效的单词。

标签: algorithm nlp


【解决方案1】:

最小的方法:

  1. 在您的输入中,删除任何单个字母单词之前的空格。以某种方式标记作为其中一部分创建的最终单词(例如,在它们前面加上一个不在输入中的符号)。
  2. 获取英语单词词典,按从长到短排序。
  3. 对于输入中的每个标记词,找到最长的匹配项并将其拆分为一个词。重复原始“单词”中剩余的字符,直到没有任何剩余。 (在没有匹配的情况下,别管它。)

更复杂的、矫枉过正的方法:

在没有空格的情况下拆分单词是一个现实世界的问题,在中文和日文等常用不带空格的语言中。我对日语很熟悉,所以我主要参考一下。

典型的方法使用字典和序列模型。该模型被训练来学习标签之间的转换属性——词性标注,结合字典,用于计算不同潜在位置拆分单词的相对可能性。然后使用(例如)维特比算法求解整个句子最可能的拆分序列。

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


一个示例案例,其中更复杂的方法可行,而简单的方法则不行:

  • 输入:Playforthefunofit
  • 简单输出:Play forth efunofitforthfor 长)
  • 复杂的输出:Play for the fun of itforth efunofit 是低频 - 即不自然的 - 过渡,而 for the 不是)

您可以通过将常见的短词序列作为单元添加到您的字典中,在某种程度上使用简单的方法解决此问题。例如,将forthe 添加为字典词,并在后处理步骤中对其进行拆分。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2021-12-03
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多