如何使用 NLTK 检查不可读的 OCRed 文本

Posted

技术标签:

【中文标题】如何使用 NLTK 检查不可读的 OCRed 文本【英文标题】:How to check for unreadable OCRed text with NLTK 【发布时间】:2014-06-09 03:27:31 【问题描述】:

我正在使用 NLTK 分析已被 OCRed 的语料库。我是 NLTK 的新手。大多数 OCR 都很好——但有时我会遇到明显是垃圾的线条。例如:oomfi ow Ba wmnondmam BE wBwHo<oBoBm. Bowman as: Ham: 8 ooww om $5

我想从我的分析中识别(并过滤掉)这些行。

NLP 从业者如何处理这种情况?例如:如果句子中 70% 的单词不在 wordnet 中,则丢弃。或者如果 NLTK 不能识别 80% 的词的词性,那么丢弃?什么算法适用于此?有没有“黄金标准”的方式来做到这一点?

【问题讨论】:

我认为没有。我会尝试 n-gram 频率和/或熵,这两者都是特定于语言的,以挑选出异常字符串,但误报率可能很高。 【参考方案1】:

使用 n-gram 可能是您的最佳选择。您可以使用 google n-grams,也可以使用 n-grams built into nltk。这个想法是创建一个语言模型并查看任何给定句子的概率。您可以定义一个概率阈值,所有分数低于它的句子都会被删除。任何合理的语言模型都会给例句打很低的分数。

如果您认为某些单词可能只是轻微损坏,您可以在使用 n-gram 进行测试之前尝试spelling correction。

编辑:这里是一些用于执行此操作的示例 nltk 代码:

import math
from nltk import NgramModel
from nltk.corpus import brown
from nltk.util import ngrams
from nltk.probability import LidstoneProbDist

n = 2
est = lambda fdist, bins: LidstoneProbDist(fdist, 0.2)
lm = NgramModel(n, brown.words(categories='news'), estimator=est)

def sentenceprob(sentence):
    bigrams = ngrams(sentence.split(), n)
    sentence = sentence.lower()
    tot = 0
    for grams in bigrams:
        score = lm.logprob(grams[-1], grams[:-1])
        tot += score
    return tot

sentence1 = "This is a standard English sentence"
sentence2 = "oomfi ow Ba wmnondmam BE wBwHo<oBoBm. Bowman as: Ham: 8 ooww om $5"

print sentenceprob(sentence1)
print sentenceprob(sentence2)

结果如下:

>>> python lmtest.py
  42.7436688972
  158.850086668

越低越好。 (当然,你可以玩参数)。

【讨论】:

你能解释一下如何使用 ngrams 构建语言模型。我只在非常高的层次上理解。 我编辑了原始答案以添加解释代码。

以上是关于如何使用 NLTK 检查不可读的 OCRed 文本的主要内容,如果未能解决你的问题,请参考以下文章

将古吉拉特语文本插入 MySQL 表会导致垃圾字符和不可读的文本

修复不可读的 ghostscript 字体

如何在必要的预处理后使用 nltk 文本分析库预测特定文本或文本组

如何使用 nltk 从大文本语料库中仅提取英文单词?

使用 Python 进行实时文本处理

如何标记 NLTK 中的字符串句子?