2006年4月9日

文本文件的计数问题

好一段时间没有写一些关于编写程序的blog了。今天我们来谈谈文本文件中的一个特殊问题--字符计数。

参加过ACE中文评测竞赛的都知道,ACE的语料是UTF-8编码的,其中的原文文件中包含一些英文的标签和大段的中文字符。标注结果文件中有一种数值表示的是词语在原文文件中的绝对位置。基本的计算方法是删除原文文件中的标签内部的内容后从头到尾计数,每个汉字和每个英文字符都算一个字符。

比如下面的文件:
-------------------------------------


CBS20001006.1000.0074

NEWS STORY

10/06/2000 10:01:14.24







继续播报详细的新闻内容。 行政院长张俊雄今天在立法院参加跨
党派大陆台商权益促进会成立大会时表示,他的理念是以合 作代
替对抗,因为过去对抗、对立的政治文化让人们付出很多的代价。
他也希望对敏感的大陆政 策能够找到共同点,两岸能够建构正常
、和平的关系。请听记者宫能惠的报导。


-------------------------------------
其中的计数就是从文件头开始,数到的字符的个数就是当前的位置计数。

这个小任务里面存在一个很大的问题就是在计算位置的时候汉字和英文字符占的字节数不一样,每个英文占一个字节,而汉字占三个字节。我们在参加ACE2004的时候,处理方法是将UTF-8编码转换尾gb2312编码,然后查看每个字节的16进制编码,出现负数的就是汉字的开头,否则就是英文字符。当时的这个位置计数程序虽然也能够完成任务,但是现在想来比较麻烦。

今天在用python来解决这个问题的时候,经过多次的实验,我终于找到了一种非常方便的计数方法。这里和大家分享一下。

try:
fileContent = codecs.open( resultFile, encoding = 'utf-8' ).read()
except IOError:
print >> sys.stderr, 'File could not be opened'
sys.exit(1)

上面得到fileCOntent后设置断点就能发现,fileContent中英文字符内容不便,汉字采用的是\x开头的编码,也就是每个汉字一个\x开头的字符。这种情况下的常见的字符串中的查找(find,index),截取子串(fileContent[a:b])在fileContent下面就是正确的答案了。这样得到的字符串不论是计数还是查找后得到的位置都是绝对准确的。
这里面的关键计数就是codecs的使用,这个包具有强大的功能,能够很好的解决汉字编码的问题。当然,在使用之前不要忘了import codecs一下。

哈哈,祝你使用codecs愉快,嘿嘿,像俺一样愉快哦!

没有评论: