案例二十 基于词表的词频统计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第8页 共36页
目录
目录 退出
二,案例分析
根据需要构造一个哈希表类,在类中实现如下操作: (1)建立哈希表,将词表在内存中存储起来,这个存 储的过程就是类的构造函数.案例中的词表是数量较 大的词组,词与词之间用空格隔开.因此可用文件流 函数getline来实现.每次调用getline函数便得到一个存 有词的字符串,然后将字符串按照某种散列函数插入 到哈希表中,一直到词表全部存储为止. (2)统计词频.从词表中读取文本文件,存储在一个 字符串中,因为每个汉字存储在两字节中,所以词在 4~14字节之间,用char word[15]即可表示一个词.考 虑到词频统计的交集性和组合性原则,可将在文本字 符串中的每个汉字与其后的汉字分别组成2~7个汉字 的词,在词表中进行搜索,每被搜到一次,将统计次 数加1.循环直到文本末尾.
第11页 共36页
目录
目录 退出
第12页 共36页
目录
目录 退出
第13页 共36页
目录
目录 退出
第14页 共36页
目录
目录 退出
第15页 共36页
目录
目录 退出
第16页 共36页
目录
目录 退出
2.主程序设计 在主函数中声明了一个 SYMBOLTABLE类的对象,依次调用 哈希表类的构造函数,统计函数,输 出函数即可.另外,为了记录程序的 运行时间,包含了time头文件,调用 clock函数,能精确到毫秒.主程序有 详细的注释,清晰易懂,流程图略.
第35页 共36页
目录
目录 退出
第36页 共36页
目录
目录 退出
五,案例总结与提高
案例总结 本案例类的设计并不复杂,但是要求读 者除了具备C++基本知识和简单的数据结 构知识以外,还要求读者掌握文件流, 哈希表,快速排序,算法设计,主函数 接口等诸多知识点,否则案例理解起来 比较困难.本案例用到的许多知识点在 数据结构教材中都有很详细的讲述,读 者可以查找相关书籍熟悉这些知识,对 照程序来理解掌握这些知识,逐步提升 程序设计水平.
第37页 共36页
目录
目录 退出
案例提高 可以考虑采用更高效,冲突更少的 哈希函数(HashFun(const string &s)) 来完成本案例. 可以试着改用平衡树(AVL)作为 数据结构.关于平衡树的相关知识 可查阅数据结构教材.
第38页 共36页
目录
目录 退出

第2页 共36页
目录
目录 退出
待统计文本文件
第3页 共36页
目录
目录 退出
本案例需一个词表文件,如图所示.
词表文件内容
第4页 共36页
目录
目录 退出
本案例最终统计出每个词在文本中出现的次数.运行
效果如图所示.
运行效果
第5页 共36页
目录
目录 退出
本案例最终统计出的结果保存在文件out.txt中.效果如
第7页 共36页
目录
目录 退出
文本和词表的格式如下:
文本是一个长句,句中只包含汉字,不包含 数字,标点,空格,回车以及其他任何特殊 符号.文本规模小于或等于50 000汉字. 词表的规模小于或等于100 000个词,所有词 不重复,词在2~7个汉字之间,每个词占一 行. 实现基于词表的词频统计,从磁盘中读取词表 和文本,将词频统计结果输出到磁盘中,输出 结果要求按字典序排序,并计算出程序运行时 间.
案例二十 基于词表的词频统计
本案例知识要点 链表的使用 文件操作 哈希表的使用 快速排序法 类的设计和使用
第1页 共36页
目录
目录 退出
一,案例需求
案例描述 词频统计就是统计一个句子或一篇文章中各种 词出现的频率,它是中文信息处理的一项基本 技术,在很多领域中都有重要的应用.例如在 中文搜索引擎(如Google,百度)中,除特别 常用的词以外,一篇文章中出现频率较高的词 通常能反映这篇文章的主题,因此可以使用词 频来对中文文章进行归类.本案例实现按词表 对文章中的词语进行分析,并按字典序给出词 表中各词语在文章中出现的次数. 案例效果图 本案例需要一个待统计文本文件,如图所示.
第10页 共36页
目录
目录 退出
三,案例设计
1.类的设计 根据案例分析,需要设计出两个结构体 NODE和TABLE,同时还需要设计一个类 SYMBOLTABLE.其中,结构体NODE是 哈希桶(哈希桶即哈希表中各个同地址值 的元素构成的链表)中节点的数据结构, TABLE是哈希表的结构,SYMBOLTABLE 类提供了诸如哈希函数,查找词汇,遍历 哈希表,将词汇插入哈希表中,快速排序 等功能.
第26页 共36页
目录
目录 退出
第27页 共36页
目录
目录 退出
第28页 共36页
目录
目录 退出
第29页 共36页
目录
目录 退出
第30页 共36页
目录
目录 退出
第31页 共36页
目录
目录 退出
第32页 共36页
目录
目录 退出
第33页 共36页
目录
目录 退出
第34页 共36页
目录
目录 退出
第9页 共36页
目录
目录 退出
(3)哈希函数(散列函数)的实现.用
char word[15]存储的词得到一个关键字, 然后除以某个素数,得到的余数为散列 地址.由于数据较多,要高速完成搜索, 散列到每个相同地址的元素要尽量少, 因此素数要很大,关键字的范围也要很 大而且不重叠. (4)按字符的字典序排序输出.哈希表 是乱序存储的,因此可先遍历哈希表, 将所有词频大于0的词存入数组中,用快 速排序法对这个数组中的元素进行排序.
图所示.
out.txt文件
第6页 共36页
目录
目录 退出
功能说明 (1)本案例需要一个文本和一个词表, 统计出每个词在文本中出现的次数.统 计的原则包括以下两种: 交集型.例如"内存在涨价",需要 统计"内存"和"存在"两个词各一 次(假设这两个词都在词表中). 组合型.例如"中美关系在发展", 需要统计"中美","关系"和"中 美关系"(假设这3个词都在词表中).
第17页 共36页
Байду номын сангаас
目录
目录 退出
第18页 共36页
目录
目录 退出
第19页 共36页
目录
目录 退出
第20页 共36页
目录
目录 退出
第21页 共36页
目录
目录 退出
第22页 共36页
目录
目录 退出
第23页 共36页
目录
目录 退出
第24页 共36页
目录
目录 退出
第25页 共36页
目录
目录 退出
相关文档
最新文档