C语言实现英文文本词频统计

这几天写了一个基于C语言对文本词频进行统计的程序,开发及调试环境:mac集成开发环境Xcode;测试文本,马丁.路德金的《I have a dream》原文演讲稿。

主要运行步骤:

1. 打开文本把文本内容读入流中并且开辟相应空间放入内存
2 .对文本内容进行处理,去除大写字母(转化为小写),去除特殊字符
3. 基于单链表对词频进行统计
4. 把统计结果进行归并排序
5.打印输出全部词频或者频率最高的10个单词和其出现次数
6.释放所有结点消耗的内存

废话不多说,上代码!

//
// main.c
// word_frequency_statistic
//
// Created by tianling on 14-3-16.
// Copyright (c) 2014年 tianling. All rights reserved.
// 实现英文文本的词频统计
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ERROR 1
#define OK 0
const int WORD_LENGTH = 250;//定义单个单词最大长度
typedef int status;

/*
 **定义存储单词及其出现次数的结构体
 */
typedef struct Node{
 char word[WORD_LENGTH];
 int time;
 struct Node *next;
}wordNode;

wordNode *headNode = NULL;//定义链表头指针

/*
 **函数声明
 */
wordNode *wordSearch(char *word,int *num);
status wordCount(char *word,int *num);
void printCountList(int *num);
void PrintFirstTenTimes();
void mergeSort(wordNode **head);
void FrontBackSplit(wordNode *head,wordNode **pre,wordNode **next);
void wordJob(char word[]);
wordNode *SortedMerge(wordNode *pre,wordNode *next);
void release();

status main(int argc,char *argv[])
{
 char temp[WORD_LENGTH];//定义用以临时存放单词的数组
 FILE *file;
 int count,articleWordNum = 0;//定义统计结点个数的变量
 int *num = &articleWordNum,choose;

 /*
  **读取文件
  */
 if((file = fopen("/Users/tianling/Documents/Data_Structure/word_frequency_statistic/word_frequency_statistic/article.txt", "r")) == NULL){
  //这里是绝对路径,基于XCode编译器查找方便的需求
  printf("文件读取失败!");
  exit(1);
 }

 while((fscanf(file,"%s",temp))!= EOF){
  wordJob(temp);
  count = wordCount(temp,num);
 }

 fclose(file);//关闭文件

 printCountList(num);

 printf("***********请选择***********\n");
 printf("*****1. 输出词频最高的10个词**\n");
 printf("*****2. 退出****************\n");

 scanf("%d",&choose);
 if(choose == 1){
  mergeSort(&headNode);
  PrintFirstTenTimes();

 }else{
  release();
  exit(0);
 }

 release();
 return 0;

}

/*
 **查找单词所在结点
 */
wordNode *wordSearch(char *word,int *num){
 wordNode *node;//声明一个新结点

 if(headNode == NULL){//若头结点为空
  node = (wordNode*)malloc(sizeof(wordNode));
  strcpy(node->word, word);//将第一个单词赋值给这个新结点
  node->time = 0;//初始化该单词的出现次数
  *num+=1;
  headNode = node;//将头结点指向这个新结点
  return node;

 }

 wordNode *nextNode = headNode;
 wordNode *preNode = NULL;

 while(nextNode != NULL && strcmp(nextNode->word, word) != 0){
  preNode = nextNode;
  nextNode = nextNode->next;
 }

 //若该单词不存在,则在链表中生成新结点
 if(nextNode == NULL){
  node = (wordNode*)malloc(sizeof(wordNode));
  strcpy(node->word, word);
  node->time = 0;
  node->next = headNode->next;
  headNode->next = node;
  *num+=1;

  return node;
 }else
  return nextNode;

}

/*
 **词频统计
 */
status wordCount(char *word,int *num){
 wordNode *tmpNode = NULL;
 tmpNode = wordSearch(word,num);

 if(tmpNode == NULL){
  return ERROR;
 }

 tmpNode->time++;

 return 0;
}

/*
 **打印所有词频
 */
void printCountList(int *num){
 if(headNode == NULL){
  printf("该文件无内容!");

 }else{
  wordNode *preNode = headNode;
  printf("总词量 %d \n",*num);

  while(preNode != NULL){
   printf("%s 出现次数 %d\n",preNode->word,preNode->time);
   preNode = preNode->next;
  }
 }

}

/*
 **打印词频最高的10个词
 */
void PrintFirstTenTimes(){
 if(headNode == NULL){
  printf("该文件无内容!");

 }else{
  wordNode *preNode = headNode;
  int i = 0;
  printf("出现次数最多的10个词如下: \n");

  while (preNode != NULL && i<=10) {
   printf("%s 出现次数 %d\n",preNode->word,preNode->time);
   preNode = preNode->next;
   i++;

  }
 }
}

/*
 **对词频统计结果进行归并排序
 */
void mergeSort(wordNode **headnode){
 wordNode *pre,*next,*head;
 head = *headnode;

 //若链表长度为0或1则停止排序
 if(head == NULL || head->next == NULL){
  return;
 }

 FrontBackSplit(head,&pre,&next);

 mergeSort(&pre);
 mergeSort(&next);

 *headnode = SortedMerge(pre,next);

}

/*
 **将链表进行分组
 */
void FrontBackSplit(wordNode *source,wordNode **pre,wordNode **next){
 wordNode *fast;
 wordNode *slow;

 if(source == NULL || source->next == NULL){
  *pre = source;
  *next = NULL;
 }else{
  slow = source;
  fast = source->next;

  while(fast != NULL){
   fast = fast->next;

   if(fast != NULL){
    slow = slow->next;
    fast = fast->next;
   }
  }
  *pre = source;
  *next = slow->next;
  slow->next = NULL;
 }
}

/*
 **根据排序结果更换头结点
 */
wordNode *SortedMerge(wordNode *pre,wordNode *next){
 wordNode *result = NULL;

 if(pre == NULL)
  return next;
 else if(next == NULL)
  return pre;

 if(pre->time >= next->time){
  result = pre;
  result->next = SortedMerge(pre->next,next);

 }else{
  result = next;
  result->next = SortedMerge(pre,next->next);
 }
 return result;
}

/*
 **处理大写字母及特殊字符
 */
void wordJob(char word[]){
 int i,k;
 char *specialChar = ",.;:'?!><+=|*&^%$#@\"";//定义特殊字符集

 for(i = 0;i<strlen(word);i++){
  //筛选并将字符串中的大写字母转化为小写字母
  if(word[i]>='A'&& word[i]<='Z'){
   word[i] += 32;
  }
  //筛选并去除字符串中的特殊字符
  for(k = 0;k<strlen(specialChar);k++){

   if(word[i] == specialChar[k]){

    while(i<strlen(word)){
     word[i] = word[i+1];
     i++;
    }

   }
  }
 }

}

/*
 **释放所有结点内存
 */
void release(){
 if(headNode == NULL)
  return;

 wordNode *pre = headNode;
 while(pre != NULL){
  headNode = pre->next;
  free(pre);
  pre = headNode;

 }
}

调试结果:(Xcode环境)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • c语言实现词频统计的简单实例

    需求: 1.设计一个词频统计软件,统计给定英文文章的单词频率. 2.文章中包含的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为是跨专业0.0···并不会c++和java,只能用仅学过的C语言进行编写,还是挺费劲的. 2.定义一个包含单词和频率两个成员的结构体来统计词频(进行了动态分配内存,可以处理较大文本). 3.使用fopen函数读取指定的文档. 4.使用fgetc函数获取字符,再根据取得的字符是否是字母进行不同的处理. 5.采用快速排序法对统计结果进行排序. 5

  • C语言实现英文文本词频统计

    这几天写了一个基于C语言对文本词频进行统计的程序,开发及调试环境:mac集成开发环境Xcode:测试文本,马丁.路德金的<I have a dream>原文演讲稿. 主要运行步骤: 1. 打开文本把文本内容读入流中并且开辟相应空间放入内存 2 .对文本内容进行处理,去除大写字母(转化为小写),去除特殊字符 3. 基于单链表对词频进行统计 4. 把统计结果进行归并排序 5.打印输出全部词频或者频率最高的10个单词和其出现次数 6.释放所有结点消耗的内存 废话不多说,上代码! // // main

  • Python英文文章词频统计(14份剑桥真题词频统计)

    Python剑桥真题词频统计 最好还是要学以致用,自主搜集了19年最近的14份剑桥真题之后,通过Python提供的jieba第三方库,对所有的文章信息进行了词频统计,并选择性地剔除了部分简易词汇,比如数字,普通冠词等,博主较懒,未清楚干净. Python代码如下: import jieba # 以只读方式打开text(即真题库) text = open('text.txt', 'r', encoding = 'utf-8').read() # len(text) #统一为小写 text = te

  • python 文本单词提取和词频统计的实例

    这些对文本的操作经常用到, 那我就总结一下. 陆续补充... 操作: strip_html(cls, text) 去除html标签 separate_words(cls, text, min_lenth=3) 文本提取 get_words_frequency(cls, words_list) 获取词频 源码: class DocProcess(object): @classmethod def strip_html(cls, text): """ Delete html ta

  • Python实现统计英文文章词频的方法分析

    本文实例讲述了Python实现统计英文文章词频的方法.分享给大家供大家参考,具体如下: 应用介绍: 统计英文文章词频是很常见的需求,本文利用python实现. 思路分析: 1.把英文文章的每个单词放到列表里,并统计列表长度: 2.遍历列表,对每个单词出现的次数进行统计,并将结果存储在字典中: 3.利用步骤1中获得的列表长度,求出每个单词出现的频率,并将结果存储在频率字典中: 4.以字典键值对的"值"为标准,对字典进行排序,输出结果(也可利用切片输出频率最大或最小的特定几个,因为经过排序

  • 如何利用python实现词频统计功能

    目录 功能要求 方法如下 运行结果 总结 功能要求 这是我们老师的作业 代码中都有注释 要求 词频统计软件: 1)从文本中读入数据:(文件的输入输出) 2)不区分大小写,去除特殊字符. 3) 统计单词 例如:about :10 并统计总共多少单词 4)对单词排序.出现次数 5)输出词频最高的10个单词和次数 6)把统计结果存入文本 方法如下 1.文件的读取,区分大小写,去除特殊字符 import re def getword(): # 读取文件 f=open('read.txt','r',enc

  • python中文分词+词频统计的实现步骤

    目录 前言 一.文本导入 二.使用步骤 1.引入库 2.读入数据 3.取出停用词表 4.分词并去停用词(此时可以直接利用python原有的函数进行词频统计) 5. 输出分词并去停用词的有用的词到txt 6.函数调用 7.结果 附:输入一段话,统计每个字母出现的次数 总结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 本文记录了一下Python在文本处理时的一些过程+代码 一.文本导入 我准备了一个名为abstract.txt的文本文件 接着是在网上下载了stopword

  • java实现简单的英文文本单词翻译器功能示例

    本文实例讲述了java实现简单的英文文本单词翻译器功能.分享给大家供大家参考,具体如下: 直接上代码: package fanyi; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader;

  • python实现简单中文词频统计示例

    本文介绍了python实现简单中文词频统计示例,分享给大家,具体如下: 任务 简单统计一个小说中哪些个汉字出现的频率最高 知识点 1.文件操作 2.字典 3.排序 4.lambda 代码 import codecs import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体 mpl.rcParams['axes.unicode_minus

  • 易语言取随机文本的实例教学

    易语言取随机文本 1.创建一个窗口,建一个编辑框和一个按钮 2.我们主要用分割文本的方法 将他分割成一个文本数组 在编辑框里内容随便写一些字,如:"你好|哈|易语言|作者最帅" 然后用你想用的符号分割,我用的是"|" 如下图: 3.开始写代码,创建一个文本型数组变量 把编辑框1.内容分割 4.取随机数 从1-最多数组里取一个数 我的文本是"你好|哈|易语言|作者最帅" 有四个成员,就是四个 所以就是从1和4间任意取一个数 5.信息框(文本型数组[

随机推荐