我使用的是Python 3.1,但如果需要,我可以降级。
我有一个ASCII文件,其中包含一种用其中一种语言编写的短篇小说,其中的字母表可用上下ASCII表示。我希望:
1)尽我所能检测编码,获得某种置信度量标准(根据文件的长度而变化,对吗?)
2)使用一些免费在线服务或图书馆自动翻译整个内容。
附加问题:如果文本是用一个代表一个字母需要2个或更多字节的语言编写的,并且字节顺序标记不能帮助我?
最后,我如何处理标点符号和空格等misc字符?它会比一些字母更频繁地出现,对吧?标点符号和字符有时可以混合这一事实怎么样?可能有两个逗号表示,两个表示看起来像“a”等等?
是的,我看过the article by Joel Spolsky on Unicode。请至少帮助我一些这些项目。
谢谢!
P.S。这不是作业,而是出于自学目的。我更喜欢使用开源和可读的字母频率库,而不是封闭,高效的字母频率库,但是可以很好地完成工作。
答案 0 :(得分:2)
如果你有一个ASCII文件,那么我可以100%自信地告诉你它是用ASCII编码的。除此之外,试试chardet
。但是知道编码并不一定足以确定它所使用的语言。
对于多字节编码,处理它的唯一可靠方法是希望它具有拉丁字母表中的字符,并查找该对中的哪一半具有NULL。除非你知道更好(Shift-JIS,GB2312等),否则将其视为UTF-8。
哦,还有UTF-8。 UTF-8,UTF-8,UTF-8。我认为我不能强调这一点。如果我没有...... UTF-8。
答案 1 :(得分:2)
实际上,实现所描述的应用程序有三个主要任务:
对于1a,您可能需要查看decodeh.py,除了脚本本身之外,它还提供了许多有关字符集和编码的非常有用的资源。其他答案中提到的 CharDet 似乎也值得考虑。
如果已知字符编码,您可以通过计算文本的字符频率配置文件并将其与已知频率进行匹配来解决1b)。虽然简单,但这种方法通常提供了不错的精确度,尽管在较短的文本上以及在遵循特定模式的文本上可能较弱;例如,法语文本中有许多对公制系统中单位的引用,其字母M,K和C的比例会非常高。
一种互补且非常相似的方法,使用双字母(两个字母的序列)和三字母(三个字母)以及各种语言的频率分布参考表。
其他语言检测方法涉及对文本进行标记,即考虑文本中的单词。 NLP资源包括具有各种语言中最常用单词的表。这些词通常是文章,所有格形容词,副词等。
语言检测的另一种解决方案是依靠在线翻译服务为我们解决这个问题。重要的是为翻译服务提供其理解的字符编码的文本,只要语言可能是多余的。
最后,尽可能多的实用NLP应用程序,您可能决定实施多种解决方案。通过使用策略设计模式,可以按特定顺序应用多个过滤器/分类器/步骤,并根据情况在不同点退出该逻辑。例如,如果一个简单的字符/双字母组合频率将文本与英语匹配(偏差很小),那么就可以停在那里。否则,如果猜测的语言是法语或德语,则执行另一项测试等等。
答案 2 :(得分: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})
答案 3 :(得分:1)
我提供了一些有条件的答案,但你的问题有点含糊不清。请编辑您的问题,以便在下面提供我的问题的答案。
(1)您说该文件是ASCII但您想检测编码?咦?不是答案“ascii”??如果您确实需要检测编码,请使用chardet
(2)自动翻译什么?编码?语言?如果是语言,你知道输入语言是什么,或者你也想知道它是什么?要检测语言,请尝试guess-language ...请注意,需要进行调整才能更好地检测日语。请参阅注意日语问题的this SO topic,并强调对于任何语言猜测器,您需要从文本中删除所有HTML / XML / Javascript / etc噪声,否则会严重偏向于仅使用ASCII的语言英语(或加泰罗尼亚语!)。
(3)你在谈论一个“字母频率库”......你打算用这个库来做什么?如果语言猜测,使用单个字母的频率似乎没有太大帮助区分使用相同(或几乎相同)字符集的语言;一个人需要使用三个字母组的频率(“三元组”)。
(4)关于标点符号和空格的问题:取决于你的目的(我们还不确定)。如果目的是语言检测,那么想法是将文本标准化;例如用一个空格替换not(字母或撇号)的所有运行,然后删除任何前导/尾随空格,而不是添加1个前导和1个尾随空格 - 通过将单词bigrams的开头/结尾视为三元组来获得更高的精度。请注意,通常在所有文本处理中,您应立即将输入解码为unicode,然后使用unicode。