11.5 文件中单词词频统计
比如研究红楼梦,统计其中的用词,来说明作者的一些特点,甚至当时的社会现象。
在编译中,在一个字符序列中切分出单词,叫做词法分析。
把切出来的单词做统计,第一次碰到的单词,词频是1,第二次碰到再加1。
这就涉及到一个对单词的管理,单词是否出现时的操作问题,这也是一个动态查找的过程。
散列表是进行快速查找和插入单词的好办法。
源码
#include<stdio.h>
#include<math.h>
/*
散列查找-词频统计
*/
int main(void){
/* 散列表的估计大小 */
int TableSize = 10000;
int wordcount = 0, length;
HashTable H;
ElementType word;
FILE *fp;
/* 要被统计词频的文件名 */
char document[30] = "HarryPotter.txt";
/* 建立散列表 */
H = InitializeTable(TableSize);
if((fp = fopen(document, "r")) == NULL){
FatalError("无法打开文件!\n");
}
while(!feof(fp)){
/* 从文件中当前的字符位置去读取一个单词,读到分隔符停止. */
length = GetAWord(fp, word);
/* 只考虑适当长度的单词 */
if(length > 3){
/*统计文件中单词总数*/
wordcount++;
/*
插入哈希表
单词不在,词频+1,单词存在,词频再加1.
*/
InsertAndCount(word, H);
}
}
fclose(fp);
printf("该文档共出现 %d 个有效单词,", wordcount);
/*
显示词频前10%的所有单词.
参数:H散列表,
10.0/100词频10%之前.
此函数做的四件事(前提是构造一个100大小的数组):
(1)统计最大词频;
(2)用一组数统计从1到最大词频的单词数;
(3)计算前10%的词频应该是多少;
(4)输出前10%的词频的单词;
*/
Show(H, 10.0/100);
/* 销毁散列表 */
DestroyTable(H);
return 0;
}
标题:(数据结构)第十一讲-散列查找(11.5 应用实例:词频统计)
作者:yazong
地址:https://blog.llyweb.com/articles/2023/10/22/1697986690814.html