Python - 字母频率计数和翻译

7

我正在使用Python 3.1,但如果需要的话我可以降级。

我有一个ASCII文件,其中包含用一种语言编写的短篇小说,该语言的字母表可以用大写和/或小写ASCII表示。 我希望:

1)尽我所能检测编码,获得某种置信度指标(取决于文件长度,对吗?)

2)使用一些免费在线服务或库自动翻译整个内容。

附加问题:如果文本是用需要2个或更多字节才能表示一个字母的语言编写的,并且字节顺序标记无法帮助我怎么办?

最后,我如何处理标点符号和杂项字符,例如空格? 它们会比某些字母更频繁地出现,对吧? 那么标点符号和字符混合的事实怎么办 - 可能会有两个逗号的表示,两个看起来像“a”的表示等等?

是的,我已经阅读了 Joel Spolsky关于Unicode的文章。请至少帮我解决其中一些问题。

谢谢!

P.S. 这不是一项作业,而是出于自我教育的目的。我更喜欢使用开源且易读的字母频率库,而不是关闭的、高效但能够很好完成任务的库。

4个回答

3

实现所述应用程序基本上有三个主要任务:

  • 1a) 确定输入文本的字符编码
  • 1b) 确定输入文本的语言
  • 2) 通过其中一个在线服务的API获取翻译后的文本

对于1a,您可以查看decodeh.py,除了脚本本身外,它还提供了许多关于字符集和编码的非常有用的资源。其他答案中提到的CharDet似乎也值得考虑。

一旦确定了字符编码,如您所建议的,您可以通过计算文本的字符频率分布并将其与已知频率匹配来解决1b)。虽然简单,但这种方法通常提供了相当不错的精度比例,尽管可能在较短的文本和遵循特定模式的文本上效果较差;例如,一篇法语文本中涉及许多公制单位的引用将具有异常高的字母M、K和C的比例。

一种互补且非常相似的方法是使用二元组(两个字母的序列)和三元组(三个字母的序列),以及各种语言中相应的频率分布表。
其他语言检测方法涉及将文本标记化,即考虑文本中的单词。自然语言处理资源包括各种语言中最常用的单词表。这些单词通常是冠词、所有格形容词、副词等。
解决语言检测的另一种选择是依赖在线翻译服务来为我们解决这个问题。重要的是提供该服务所理解的字符编码的文本,提供语言可能是多余的。
最后,像许多实际的自然语言处理应用程序一样,您可以决定实现多个解决方案。通过使用策略设计模式,可以按特定顺序应用多个过滤器/分类器/步骤,并根据情况在不同点退出此逻辑。例如,如果简单的字符/二元组频率匹配英文文本(有小偏差),则可以停止。否则,如果猜测的语言是法语或德语,则执行另一个测试,等等。

2

字符频率是非常直接的

我注意到您正在使用Python3.1,因此这更容易

>>> from collections import Counter
>>> Counter("Μεταλλικα")
Counter({'α': 2, 'λ': 2, 'τ': 1, 'ε': 1, 'ι': 1, 'κ': 1, 'Μ': 1})

对于较旧版本的Python:

>>> from collections import defaultdict
>>> letter_freq=defaultdict(int)
>>> unistring = "Μεταλλικα"
>>> for uc in unistring: letter_freq[uc]+=1
... 
>>> letter_freq
defaultdict(<class 'int'>, {'τ': 1, 'α': 2, 'ε': 1, 'ι': 1, 'λ': 2, 'κ': 1, 'Μ': 1})

Metallika,哈哈。好的,我可以计算所谓的“朴素”频率,但是我该如何将该分布与一些已知的分布进行比较呢? - Hamish Grubijan

2
如果您有一个ASCII文件,我可以百分之百确定它是以ASCII编码。除此之外,可以尝试使用chardet。但知道编码并不能确定所使用的语言。
至于多字节编码,唯一可靠的方法是希望其中包含拉丁字母,并查找哪一半是NULL。否则将其视为UTF-8,除非您知道更好的编码(Shift-JIS、GB2312等)。
哦,还有UTF-8。UTF-8,UTF-8,UTF-8。我不认为我能强调得够了。以防我还没有说过... UTF-8。

谢谢。请详细说明第二段。我想我的编码知识没有我想象的那么深入。 - Hamish Grubijan

1

我已经提供了一些有条件的答案,但是你的问题有点含糊不清和不一致。请编辑你的问题,回答下面我的问题。

(1) 你说文件是ASCII格式,但你想检测编码?嗯?难道不是答案是“ascii”吗?如果你真的需要检测编码,请使用chardet

(2) 自动翻译什么?编码?语言?如果是语言,你知道输入语言是什么还是也要检测?要检测语言,请尝试guess-language...注意,它需要进行调整以更好地检测日语。请参见this SO topic,其中指出了日语问题,并强调对于任何语言猜测器,你需要从文本中删除所有HTML/XML/Javascript等噪声,否则结果会严重偏向只有ASCII的语言,如英语(或加泰罗尼亚语!)。

(3)您在谈论“字母频率库”...您将使用此库来做什么?如果是语言猜测,似乎使用单个字母的频率并不能很好地区分使用相同(或几乎相同)字符集的语言;需要使用三个字母组(“三元组”)的频率。
(4)关于标点符号和空格的问题:这取决于您的目的(我们还不确定)。如果目的是语言检测,则想法是标准化文本;例如,用单个空格替换所有不是(字母或撇号)的运行,然后删除任何前导/尾随空格,然后添加1个前导和1个尾随空格——通过将单词的开头/结尾二元组视为三元组,可以获得更高的精度。请注意,在所有文本处理中,您应立即将输入解码为Unicode,并在此之后使用Unicode进行操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接