我有一个类似的问题,询问什么语言最适合这项任务,而Perl就是答案.但我仍然很好奇如何解决这个问题.
我想给这个程序一个大文本文件,里面装满了从小说,报纸,网页上摘取的德文文本样本.我想要一个文本文件中所有单词的频率列表,按最常见的单词排序.我需要列出3000个最常见的德语单词.
如果这只是一个ASCII问题,那么这对我来说就是孩子的游戏.在整个早上读完Unicode之后,我真的很惊讶雷区是什么.
怎么在C中完成?
我有一个朋友在Python中放了一些东西,但他仍然是初学者,他的代码在1.4 MB文本文件上花了大约30分钟.
这取决于编码.最简单的是UTF-8,您可以在其中简单地将字符串存储在char*数组中.令人惊讶的是,构建频率列表将使用几乎相同的代码完成,就像ASCII文本一样.这是一种UTF-8魔术,但这就是为什么这种编码如此强大!
在这种情况下,您应该记住一些事情:
Unicode提供比ASCII更多的白色字符.您需要一个列表来了解单词的分隔位置.令人高兴的是,维基百科有一个.
Unicode并不总是毫不含糊.有些情况下,不同的序列产生相同的字符.通常使用组合字符:例如,德语Ä可以表示为:
U+00C4- 单个字母ÄU+0041 U+0308- 拉丁字母A和分音符(变音符号).令人高兴的是,在德语中只有七个非英语字符:ÄäÖöÜüß.您需要检查他们的替代变体的外观(例如,在第4页和第5页,您应该找到所有德语字符及其替代形式).
当然,要解决这两个问题,您还需要了解所有结果如何用UTF-8表示.这在RFC 3629第3页中有所描述.
如果是其他编码(或其他语言),我建议不要自己处理,而是使用一些现有的库.如果您使用的是Linux(或大多数其他Unices),您可以使用iconvfunction(man 3 iconv)将文本转换为UTF-8,并按照我之前的描述进行操作.
其他选择是使用一些已经处理各种Unicode变体的库.最强大的可能是ICU - 用于Unicode的国际组件,请查看他们的手册以了解如何使用它执行任务.