- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
实验一词频统计
模型方法
本词频统计代码的主要方法如下:
本程序的开发环境是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来规定程序统计的是单字,双字,或是三字的词语。
系统设计
系统详细的设计流程主要分为两局部,一是读取文本文件并进行单词频度统计。二是对统计到的单词频度进行处理,筛选出高频词汇并输出到文本中。
〔一〕单词频度统计的具体流程:
系统初始化:定义各种变量类型,分为全局变量和局部变量,设定程序的文件输入输出流并初始化。全局变量主要用来设定可以控制程序功能和执行程度的变量。如alength可以控制程序扫描文档的终止位置,b[maxnum]是用来存储参与排序的临时数组变量。
〔2〕每次从文件流中读入一段数据,假设这段数据是一个宋词词牌名,那么直接从文件流中读取下一段数据,因为词牌名并不参与词频统计。
〔3〕针对这一段数据,开始统计词频。比方“犹解嫁东风”这句话,可能的二字组合是“犹解”“解嫁”“嫁东”“东风”,每次读取两个字,然后先在词库中查找是否已存在该词,假设存在那么将频度数组相应位加一,假设不存在,那么将该词参加到词库中,并将单词数量加一。注意:这里的词库采用一个字符串来存储所有读取到的不重复词语。
〔4〕关于〔3〕中的标点处理。比方“高频词汇,数组”这个字符串,我们不能让程序将“汇,”与“,数”识别为一个词语。我的处理是当字符位置变量读取到“汇”字之前时就自动将该变量移到“数”前,为防止移动后再次遇到标点,还应做到自动跳过前方的一个标点。这些在处理代码中已十分清楚。
关于单词频度统计的系统流程图〔使用亿图制作〕如下:
筛选出高频词汇并排序
〔1〕由于统计词频是按照文本文件从前到后统计的,所以频度数组的内容完全是无序的。假设直接对该数组排序,将引起十分庞大的复杂度。这里通过对频度数组内的频度进行筛选,只选出高频词汇,然后将新的高频词汇存入另一个词库字符串中,将高频词汇对应的频度存入新的频度数组中。
〔2〕关于排序算法,这里对两个数组同时采用快速排序算法。算法思路是:
比方:strings=”英语数学语文化学历史”//五个词语
Inta[10]={3,2,5,7,9}
Intb[10]={0,1,2,3,4};
a存的是每个词的频度,b存的是a中各频度的位置,因为每个频度对应每个词语的位置,如果直接对a排序,将丧失对应关系。这里,采用对a,b数组同时使用快速排序,这样,排序后频度对应的单词位置也不会丧失。
最后采用以下语句即可正确实现排序输出:
coutj:js.substr(b[j]*4,4)a[j]endl;
同时,将相应结果输出到输出文件ak48.txt中。
系统测试
实验输入文档:Ci.txt
实验输出文档:ak58.txt
程序中可以实现程序控制的常量:
constlongalength=100控制程序扫描到文档哪一位置
(扫描字符(即半个汉字)数量)
constlongmincipin=2控制单词的最小频度以筛选高频词汇
constlongmaxnum=100控制参与快速排序的单词数量
(即最后显示数量)以减少算法复杂度
constintdancil=
您可能关注的文档
最近下载
- 2024年安徽省合肥市庐阳区小升初数学试卷附答案解析.doc VIP
- 2025年陕西铜川市事业单位招聘带编入伍高校毕业生3人笔试模拟试题及参考答案详解一套.docx VIP
- 事业单位宣传工作总结PPT.pptx VIP
- TCCIAT_0003-2019_建筑施工承插型轮扣式模板支架安全技术规程.doc VIP
- 超声波探伤培训教材.doc VIP
- 2024年苏州昆山国创投资集团有限公司招聘考试真题 .pdf VIP
- 合并工作底稿完整版带公式.xls VIP
- 2025江苏苏州昆山国创投资集团有限公司第一期招聘17人考试备考题库及答案解析.docx VIP
- 家具设计软件:SketchUp二次开发_(6).动态组件设计与应用.docx VIP
- 2025江苏苏州昆山国创投资集团有限公司第一期招聘17人笔试模拟试题及答案解析.docx VIP
文档评论(0)