如何使用 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 表会导致垃圾字符和不可读的文本