文本处理 统计单词个数和出现频度 c语言
时间: 2023-10-23 20:20:05 浏览: 117
英文文本单词词频统计(C++实现)
5星 · 资源好评率100%
可以使用哈希表(Hash Table)来实现统计单词个数和出现频度。
具体步骤如下:
1. 读入文本文件,逐个字符读取并将其转换为小写字母,以便统计单词出现频度时不区分大小写。
2. 对于每个单词,先判断它是否已经在哈希表中存在,如果不存在,则将其加入哈希表中,并将它的出现次数设为1,如果已经存在,则将它的出现次数加1。
3. 统计完所有单词的出现频度后,可以遍历哈希表,输出单词及其出现频度。
以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_WORD_LENGTH 50
#define HASH_TABLE_SIZE 1000
// 定义哈希表节点结构体
typedef struct hash_node {
char word[MAX_WORD_LENGTH];
int count;
struct hash_node* next;
} HashNode;
// 定义哈希表结构体
typedef struct hash_table {
HashNode* nodes[HASH_TABLE_SIZE];
} HashTable;
// 哈希函数
int hash(char* word) {
int hash_value = 0;
int i;
for (i = 0; word[i] != '\0'; ++i) {
hash_value = (hash_value * 31 + tolower(word[i])) % HASH_TABLE_SIZE;
}
return hash_value;
}
// 插入哈希表
void insert_hash_table(HashTable* table, char* word) {
int index = hash(word);
HashNode* node = table->nodes[index];
while (node != NULL) {
if (strcmp(node->word, word) == 0) {
node->count++;
return;
}
node = node->next;
}
node = (HashNode*)malloc(sizeof(HashNode));
strcpy(node->word, word);
node->count = 1;
node->next = table->nodes[index];
table->nodes[index] = node;
}
// 打印哈希表
void print_hash_table(HashTable* table) {
int i;
for (i = 0; i < HASH_TABLE_SIZE; ++i) {
HashNode* node = table->nodes[i];
while (node != NULL) {
printf("%s: %d\n", node->word, node->count);
node = node->next;
}
}
}
int main() {
FILE* fp = fopen("input.txt", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
HashTable table;
memset(&table, 0, sizeof(table));
char word[MAX_WORD_LENGTH];
int i = 0, c;
while ((c = fgetc(fp)) != EOF) {
if (isalpha(c)) {
word[i++] = tolower(c);
} else if (i > 0) {
word[i] = '\0';
insert_hash_table(&table, word);
i = 0;
}
}
if (i > 0) {
word[i] = '\0';
insert_hash_table(&table, word);
}
fclose(fp);
print_hash_table(&table);
return 0;
}
```
在实际使用中,可以根据需要对哈希表的大小进行调整,以便提高效率。
阅读全文