用Python和C语言写了一个统计汉字字频的小程序,作为笔记,以供借鉴。
先上Python版本:
#python 3.4.3
#功能:统计文本中的字频
with open('test.txt', mode='r', encoding='utf-8') as inFile:
dict={} # 创建一个空字典
for char in inFile.read():
if '啊'< char <'齄':
if char in dict:
dict[char]+=1
else:
dict.setdefault(char, 1) # 字符不在字典中,则创建键为char,值为1的键值对
with open('HzFreq.txt', mode='w', encoding='utf-8') as outFile:
for char, freq in dict.items():
s = '{0}\t{1}\n'.format(char, freq)
outFile.write(s)
再看C语言版本:
/*
功能:统计文本文件中的字频
*/
#include <stdio.h>
#define HzNum 6768
int main(void)
{
int i, c1, c2, j, k, t;
unsigned hzfreq[HzNum] = {0};
char inname[20];
printf("请输入源文件名,包含扩展名:");
gets(inname);
FILE *in;
if ((in = fopen(inname, "rb")) == NULL)
{
printf("文件打开失败!\n");
return 0;
}
while (!feof(in))
{
c1 = getc(in);
if (c1 < 128) // 过滤单字节字符,如\t,\n,英文空格等
continue;
c2 = getc(in);
if (c1 < 176) // 过滤非汉字,因为这些非汉字也占两个字节,所以要放在c2=getc(in)此行之后
continue;
i = (c1-176) * 94 + (c2 - 161); /* 计算机内码中基本汉字有94(行)*94(列),行起始数字为176,
列起始数字为161,因此定位到某一个汉字需用:(c1-176)*94 + (c2 -161) 来计算。*/
if (i>0 && i<=HzNum) // 加入数字在0到6768之间
hzfreq[i]++; // 对应汉字的计数器+1
}
FILE *out;
printf("\n请输入目标文件名,包含扩展名:");
char outname[20];
gets(outname);
if ((out = fopen(outname, "wb")) == NULL)
{
printf("打开失败!\n");
return 0;
}
for (i=0; i<HzNum; i++)
{
if (hzfreq[i]>0) // 加入汉字出现频数大于0
{
c1 = i / 94 + 176; // 还原汉字的行号
c2 = i % 94 + 161; // 还原汉字的列号
fprintf(out, "%c%c\t%d\n", c1, c2, hzfreq[i]); // 按照“汉字:频数”的格式输出到文本中
}
}
fclose(out);
fclose(in);
system("pause");
return 0;
}
比较
- C语言能让人更深入地理解字频是如何计算出来的,相对地,比较繁琐。
- Python则显得简便许多,也因此降低了使用门槛。
总结
处理文本的话,python果然很强大。