2024年3月21日发(作者:)

实验一 词频统计

一,模型方法

本词频统计代码的主要方法如下:

(1)本程序的开发环境是VS2010,使用的编程语言是C++。

(2)不采用char*类型的字符串而采用

C++标准程序库中的string类,是因为它和

前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,它集成的

操作函数足以完成我们大多数情况下(甚至是100%)的需要。因此我采用字符串作为数据

处理类型,在程序中主要用来存储 每次从文件流中读取的一段字符串swhole,临时保存

单个词语的sdanci,保存所有不重复单词的sdanciwh,保存抽取出的高频单词的spaixu。

(3)使用

string

类的函数

substr(nstart,nlength)来从字符串中截取指定长度字符串。

(4)使用

string

类的函数find(s)来查找指定字符串。

(5)使用长整型数组count[alength]存储每个单词对应的频度

(6)词频统计思想:每次从语料中读取一段到swhole中,从头开始,首先判断

将要取的四个字节(即两个中文字符)是否包含中文标点,若全是汉字则截取这

四个字节存入sdanci,在sdanciwh中查找是否存在该单词,如果已存在,就将频

度数组count[]相应位加1,如果不存在就将该词添加到

sdanciwh,同时将总单词数

ndanci+1。

(7)本程序采用快速排序算法进行排序,关于针对单词和频度同时进行排序的技巧详见第

三部分系统设计。

(8)利用一个变量来实现系统功能的转换,如定义整型变量dancil来规定程序统计的是单

字,双字,或是三字的词语。

二,系统设计

系统详细的设计流程主要分为两部分,一是读取文本文件并进行单词频度统计。

二是对统计到的单词频度进行处理,筛选出高频词汇并输出到文本中。

(一)单词频度统计的具体流程:

(1)系统初始化:定义各种变量类型,分为全局变量和局部变量,设定程序的

文件输入输出流并初始化。全局变量主要用来设定可以控制程序功能和执行程度

的变量。如alength可以控制程序扫描文档的终止位置,b[maxnum]是用来存储

参与排序的临时数组变量。

(2)每次从文件流中读入一段数据,若这段数据是一个宋词词牌名,则直接从

文件流中读取下一段数据,因为词牌名并不参与词频统计。

(3)针对这一段数据,开始统计词频。比如“犹解嫁东风”这句话,可能的二

字组合是“犹解”“解嫁”“嫁东”“东风”,每次读取两个字,然后先在词库中查

找是否已存在该词,若存在则将频度数组相应位加一,若不存在,则将该词加入

到词库中,并将单词数量加一。注意:这里的词库采用一个字符串来存储所有读

取到的不重复词语。

(4)关于(3)中的标点处理。比如“高频词汇,数组”这个字符串,我们不能

让程序将“汇,”与“,数”识别为一个词语。我的处理是当字符位置变量读取

到“汇”字之前时就自动将该变量移到“数”前,为防止移动后再次遇到标点,

还应做到自动跳过前方的一个标点。这些在处理代码中已十分清楚。

关于单词频度统计的系统流程图(使用亿图制作)如下: