用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
#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;
i0) // 加入汉字出现频数大于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果然很强大。
推荐阅读
- 人工智能|hugginface-introduction 案例介绍
- 深度学习|论文阅读(《Deep Interest Evolution Network for Click-Through Rate Prediction》)
- nlp|Keras(十一)梯度带(GradientTape)的基本使用方法,与tf.keras结合使用
- NER|[论文阅读笔记01]Neural Architectures for Nested NER through Linearization
- 深度学习|2019年CS224N课程笔记-Lecture 17:Multitask Learning
- 深度学习|[深度学习] 一篇文章理解 word2vec
- 论文|预训练模型综述2020年三月《Pre-trained Models for Natural Language Processing: A Survey》
- NLP|NLP预训练模型综述
- NLP之文本表示——二值文本表示
- 隐马尔科夫HMM应用于中文分词