汉字字频统计程序(Python版+C语言版)

用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) // 加入数字在06768之间
            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果然很强大。

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值