2010-02-09 108 views
6

我正在使用Python 3.1,但如果需要可以降级。Python - 字母频率计数和转换

我有一个ASCII文件,其中包含用其中一种语言编写的短故事,其中的字母表可以用上和下ASCII表示。我想:

1)检测的编码,以我的能力,得到某种信心指标的(会根据文件的长度发生变化,右)

2)自动整个翻译?使用一些免费的在线服务或图书馆的东西。

附加问题:如果文本是用2个或更多字节表示一个字母并且字节顺序标记不能帮助我的语言编写的呢?

最后,我该如何处理标点和misc等字符,如空格?它会比一些字母发生得更频繁,对吧?标点符号和人物有时可能会混在一起 - 可能有逗号的两种表示,看起来像“a”的两种表示等等,这一事实如何?我已阅读。请帮助我至少一些这些项目。

谢谢!

P.S.这不是一项家庭作业,但它是为了自我教育的目的。我更喜欢使用开放源代码和可读的字母频率库,而不是那种封闭,高效的,但可以很好地完成工作的函数库。

回答

2

本质上有来实现所描述的应用程序的三个主要任务:

  • 1a)中识别输入文本
  • 1b的字符编码)确定输入的文本
  • 2)获取的内容。通过其中一种在线服务的文本翻译文本'API

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

一旦字符编码已知,如您所建议的那样,您可以通过计算文本的字符频率轮廓并将其与已知频率进行匹配来解决1b)。虽然简单,但这种方法通常提供了一个体面的精确度比率,尽管在较短的文本以及遵循特定模式的文本上可能较弱;例如法文文本中对米制系统中的单位的许多参考将具有字母M,K和C的异常高比例。

一种互补且非常相似的方法,使用双克(两个字母的序列)和三元组(三个字母)以及相应的各种语言的频率分布参考表。

其他语言检测方法涉及标记文本,即考虑文本内的文字。 NLP资源包括各种语言中使用最多的词汇表。这些词通常是文章,所有格形容词,副词等。

语言检测的另一种解决方案是依靠在线翻译服务为我们解决这个问题。重要的是为翻译服务提供文本,并将其编码为可理解的字符,如果语言可能是多余的话。

最后,尽可能多的实际NLP应用程序,您可能决定实施多个解决方案。通过使用策略设计模式,可以按特定顺序应用多个过滤器/分类器/步骤,并根据情况在不同点退出该逻辑。例如,如果一个简单的字符/双字母频率匹配文本与英文(偏差很小),那么可以停止在那里。否则,如果猜测的语言是法语或德语,执行另一个测试,等等,等等

1

如果你有一个ASCII文件,那么我可以100%自信地告诉你它是用ASCII编码的。除此之外,请尝试chardet。但是知道编码并不足以确定它所处的语言。

至于多字节编码,处理它的唯一可靠方法是希望它具有拉丁字母表中的字符并查找哪一个对具有NULL。除非你知道更好(Shift-JIS,GB2312等),否则视其为UTF-8。

哦,和UTF-8。 UTF-8,UTF-8,UTF-8。我不认为我可以强调这一点。如果我没有... UTF-8。

+0

谢谢。请详细说明第二段。我想我的编码知识并不像我想的那么深。 – 2010-02-09 23:45:14

+2

有人说UTF-8?! – jathanism 2010-02-10 00:11:05

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}) 
+0

Metallika,哈哈。嗯,是的,我可以计算一种我称之为“天真”的频率,但是我怎样才能将这种分布与一些已知的频率进行比较? – 2010-02-09 23:55:09

1

我提供一些有条件的答案,但是你的问题是有点含糊和不一致。请编辑您的问题以提供以下问题的答案。

(1)你说文件是ASCII文件但你想检测一个编码?咦?是不是答案“ascii”?如果您确实需要检测编码,请使用chardet

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

(3)你在谈论一个“字母频率库”......你打算用这个库来做什么?如果猜测语言,看起来使用单个字母的频率并不能帮助区分使用相同(或几乎相同)字符集的语言;需要使用三个字母组(“trigrams”)的频率。

(4)您对标点符号和空格的问题取决于您的目的(我们还不确定)。如果目的是语言检测,那么想法是将文本标准化;例如用单个空格替换所有不是(字母或撇号)的运行,然后删除任何前导/尾随空格,而不是添加1个前导空格和1个尾部空格 - 通过将单词bigrams的开始/结束视为卦来获得更高的精度。请注意,像所有文本处理一样,您应立即将输入解码为unicode,然后使用unicode进行处理。