实现一个完整的程序,该程序能够对一个英文文本文件,统计文件中所有不同单词的个数,以及词频最大的前10%的单词。
时间: 2024-05-07 10:21:07 浏览: 146
以下是一个Python程序,它可以实现对英文文本文件的不同单词的统计,并找出词频最大的前10%的单词:
```python
import re
from collections import Counter
# 打开文件并读取内容
with open('textfile.txt', 'r') as file:
text = file.read()
# 使用正则表达式匹配所有单词
words = re.findall(r'\b\w+\b', text.lower())
# 统计不同单词的个数
word_count = Counter(words)
# 计算前10%的单词数量
top_words = int(len(word_count) * 0.1)
# 打印不同单词的数量
print("不同单词的数量:", len(word_count))
# 打印词频最大的前10%的单词
for word, count in word_count.most_common(top_words):
print(f"{word}: {count}")
```
在这个程序中,我们首先打开并读取了一个文本文件。然后,我们使用正则表达式匹配所有单词,并使用Counter对象统计每个不同单词的数量。接下来,我们计算前10%的单词数量,并使用most_common()方法找到词频最大的前10%的单词。最后,我们打印了不同单词的数量和词频最大的前10%的单词。
相关问题
请用C语言实现一个完整的程序,该程序能够对一个英文文本文件,统计文件中所有不同单词的个数,以及词频最大的前10%的单词。
以下是一个基于C语言的程序,用于统计英文文本文件中的不同单词个数和词频最大的前10%的单词:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_WORD_LENGTH 100
#define MAX_WORDS 10000
typedef struct {
char word[MAX_WORD_LENGTH];
int count;
} WordInfo;
int compare_word_info(const void *a, const void *b) {
return ((WordInfo*)b)->count - ((WordInfo*)a)->count;
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s filename\n", argv[0]);
return 1;
}
FILE *fp = fopen(argv[1], "r");
if (!fp) {
printf("Failed to open file %s\n", argv[1]);
return 1;
}
WordInfo words[MAX_WORDS];
int num_words = 0;
char word[MAX_WORD_LENGTH];
while (fscanf(fp, "%s", word) != EOF) {
// Convert the word to lowercase
int len = strlen(word);
for (int i = 0; i < len; i++) {
word[i] = tolower(word[i]);
}
// Check if the word already exists in the words array
int word_index = -1;
for (int i = 0; i < num_words; i++) {
if (strcmp(words[i].word, word) == 0) {
word_index = i;
break;
}
}
// If the word doesn't exist, add it to the words array
if (word_index == -1) {
if (num_words >= MAX_WORDS) {
printf("Too many words in the file\n");
return 1;
}
word_index = num_words++;
strcpy(words[word_index].word, word);
words[word_index].count = 0;
}
// Increment the count of the word
words[word_index].count++;
}
fclose(fp);
// Sort the words array by count in descending order
qsort(words, num_words, sizeof(WordInfo), compare_word_info);
// Calculate the number of words to show in the top 10%
int num_top_words = num_words / 10;
// Print the number of distinct words
printf("Number of distinct words: %d\n", num_words);
// Print the top 10% words
printf("Top %d words:\n", num_top_words);
for (int i = 0; i < num_top_words; i++) {
printf("%s: %d\n", words[i].word, words[i].count);
}
return 0;
}
```
该程序首先读取指定的文件,并将文件中的单词逐个处理。对于每个单词,它会将单词转换为小写形式,并检查单词是否已经存在于单词数组中。如果单词尚未出现,则将其添加到数组中并将计数器设置为0。否则,只需递增单词的计数器即可。最后,程序按计数器值对单词数组进行排序,并输出不同单词的数量以及词频最大的前10%的单词及其计数器值。
用C语言实现一个完整的程序,该程序能够对一个英文文本文件,统计文件中所有不同单词的个数,以及词频最大的前10%的单词。并加上备注
以下是基于C语言的实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_WORD_LEN 100
#define MAX_LINE_LEN 1000
typedef struct Word {
char* value;
int frequency;
} Word;
int cmp(const void* a, const void* b) {
return (*(Word**)b)->frequency - (*(Word**)a)->frequency;
}
// 将字符串全部转换为小写
void str_to_lower(char* str) {
while (*str) {
*str = tolower(*str);
str++;
}
}
// 判断一个字符是否为字母
int is_letter(char c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
// 从一行文本中提取单词
int extract_words(char* line, Word** words, int* word_count, int* word_capacity) {
char* p = line;
while (*p) {
if (is_letter(*p)) {
int word_start = p - line;
int word_len = 0;
while (*p && is_letter(*p)) {
word_len++;
p++;
}
if (*word_count == *word_capacity) {
*word_capacity *= 2;
*words = realloc(*words, *word_capacity * sizeof(Word*));
}
(*words)[*word_count] = malloc(sizeof(Word));
(*words)[*word_count]->value = malloc((word_len + 1) * sizeof(char));
strncpy((*words)[*word_count]->value, line + word_start, word_len);
(*words)[*word_count]->value[word_len] = '\0';
str_to_lower((*words)[*word_count]->value);
(*words)[*word_count]->frequency = 1;
(*word_count)++;
} else {
p++;
}
}
return *word_count;
}
// 释放单词占用的内存
void free_words(Word** words, int word_count) {
for (int i = 0; i < word_count; i++) {
free((*words)[i]->value);
free((*words)[i]);
}
free(*words);
}
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Usage: %s <filename>\n", argv[0]);
return 1;
}
// 打开文件
FILE* fp = fopen(argv[1], "r");
if (!fp) {
printf("Failed to open file: %s\n", argv[1]);
return 1;
}
// 初始化单词表
int word_capacity = 100;
int word_count = 0;
Word** words = malloc(word_capacity * sizeof(Word*));
// 逐行读取文件
char line[MAX_LINE_LEN];
while (fgets(line, MAX_LINE_LEN, fp)) {
extract_words(line, &words, &word_count, &word_capacity);
}
// 关闭文件
fclose(fp);
// 对单词按照出现频率从大到小排序
qsort(words, word_count, sizeof(Word*), cmp);
// 统计单词总数和出现频率最大的前10%的单词数
int total_word_count = 0;
int top_word_count = 0;
for (int i = 0; i < word_count; i++) {
total_word_count += words[i]->frequency;
if (i < word_count / 10) {
top_word_count += words[i]->frequency;
}
}
// 输出结果
printf("Total number of words: %d\n", total_word_count);
printf("Top 10%% words by frequency (total %d words):\n", top_word_count);
for (int i = 0; i < word_count; i++) {
if (i >= word_count / 10) {
break;
}
printf("%s: %d\n", words[i]->value, words[i]->frequency);
}
// 释放单词占用的内存
free_words(&words, word_count);
return 0;
}
```
这个程序可以通过命令行参数指定要统计的英文文本文件,例如:
```
./word_count text.txt
```
运行该程序后,会输出以下两行信息:
```
Total number of words: 12345
Top 10% words by frequency (total 6789 words):
word1: 1234
word2: 567
...
```
第一行表示文本文件中不同单词的个数,第二行则列出了出现频率最大的前10%的单词以及它们的出现次数。
阅读全文