YAZONG 我的开源

(数据结构)第十一讲-散列查找(11.5 应用实例:词频统计)

  , ,
0 评论0 浏览

11.5 文件中单词词频统计

比如研究红楼梦,统计其中的用词,来说明作者的一些特点,甚至当时的社会现象。

image.png

在编译中,在一个字符序列中切分出单词,叫做词法分析。

把切出来的单词做统计,第一次碰到的单词,词频是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