# Python词频统计 **Repository Path**: zqidiot/wf ## Basic Information - **Project Name**: Python词频统计 - **Description**: No description available - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-05 - **Last Updated**: 2022-02-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 个人项目-词频统计 ## 零、任务 英语的26个字母的频率在一本小说中是如何分布的?某类型文章中常出现的单词是什么?某作家最常用的词汇是什么?《哈利波特》中最常用的短语是什么,等等。 汉语词汇不同于英语,需要进行一定的切割。同样地,我们也可以对文章、作家使用的常用词汇进行统计,如金庸的小说,路遥的小说等等。 为了解决这个问题,实现一个这样的程序,来满足一下我们的好奇心。 假设我们的命令行程序叫`WF.exe` (WF: Word Frequence) 。 ## 一、作业要求 1. 阅读个人软件开发流程(PSP)的相关资料。 2. 可选的语言包括:C++,C#,Java,Python。运行环境为64bit Windows 10 / MacOS / Ubuntu。 3. 提交的代码要求经过代码质量分析工具的分析并消除所有的警告。如[Code Quality Analysis](http://msdn.microsoft.com/en-us/library/dd264897.aspx)。 4. 完成项目的首个版本之后,请使用**性能分析工具**来找出代码中的性能瓶颈并进行改进。 5. 使用单元测试对项目进行测试,并查看测试分支覆盖率等指标;并写出至少10个测试用例确保你的程序能够正确处理各种情况。如[Studio Profiling Tools](https://msdn.microsoft.com/en-us/library/mt210448.aspx)。 6. 使用Git来管理源代码和测试用例,**代码有进展即签入本地仓库,定期推送到服务器上,并发送合并请求提交每周的工作成果。签入记录不合理的项目会被抽查询问项目细节。** 7. 按照要求发布博客,结合个人项目的实践经历,撰写解决项目的心路历程与收获。**博客与项目明显不符的作业将取消作业成绩。** > 注意:要求3、4、5根据所选编程语言使用对应的开发工具来完成。 ## 二、需求 **共3个阶段,每周更新。** ### 第1个阶段 输出某个文本文件中26个字母和汉字出现的频率,由高到低排列,并显示出现的百分比,精确到小数点后面两位。 **命令行参数是:** ``` wf.exe -c ``` ``` 字母频率 = 这个字母出现的次数/(所有A-Z,a-z字母、汉字出现的总数) ``` 如果两个token出现的频率一样,那么就按照字典序排列。 如果S和T出现频率都是10.21%, 那么, S要排在T的前面。 如果要处理一本大部头小说 (例如 Gone With The Wind), 你的程序效率如何?有没有什么可以优化的地方? ### 第2个阶段 #### 输出单个文件中的前 N 个最常出现的英语单词。 作用:一个用于统计文本文件中的英语单词出现频率的控制台程序 单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。 英文字母:A-Z,a-z 字母数字符号:A-Z,a-z,0-9 分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词 功能列表: - 功能1:`wf.exe -f ` ,输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。 - 功能2:`wf.exe -d `, 指定文件目录,对目录下每一个文件执行`wf.exe -f ` 的操作。 - `wf.exe -d -s ` 同上, 但是会递归遍历目录下的所有子目录。 - 功能3:支持`-n`参数,输出出现次数最多的前n个单词, 例如,`-n 10`就是输出最常出现单词的前10 名。 当没有指明数量的时候,我们默认列出所有单词的频率。 构建一些基本的测试用例来保证程序的基本功能不会在不断的扩展中出问题。 #### 支持 stop words 在一本小说里,频率出现最高的单词一般都是 "a", "it", "the", "and", "this", 中文里常出现的如“的”这些词, 我们并不感兴趣. 可以做一个stop word文件(停用词表), 在统计词汇的时候,跳过这些词。这个文件叫 "stopwords.txt" file. - 功能 4:支持新的命令行参数, 例如: ``` wf.exe -x -f ``` 在这一步要增加什么回归测试呢? ### 第3阶段 支持短语和动词形态还原 **先定义短语:"两个或多个英语单词, 它们之间只有空格分隔". 请看下面的例子:** ``` hello world //这是一个短语 hello, world //这不是一个短语 ``` - 功能 5:支持新的命令行参数`-p ` 参数` ` 说明要输出多少个词的短语,并按照出现频率排列。同一频率的词组, 按照字典序来排列。 把动词形态都统一之后再计数 我们想找到常用的单词和短语,但是发现英语动词经常有时态和语态的变化,导致同一个词,同一个短语却被认为是不同的。怎么解决这个问题呢? 假设我们有这样一个文本文件,这个文件的每一行都是这样构成: ```   动词原型 动词变形1 动词变形2... ``` 词之间用空格分开。 e.g. 动词 TAKE 有下面的各种变形 ```   *take takes took taken taking* ``` 在实现上面的各种功能的时候,有一个选项, 就是把动词的各种变形都归为它的原型来统计。 - 功能 6:支持动词形态的归一化,参数为 -v ```   wf.exe -v 其中 是纪录动词形态的文本文件。 ``` ## 三、博客撰写要求: 使用Markdown编写个人博客,可在个人目录中建立一个名为```blog```的子目录,建议每周一个文件,描述一周的工作进展。博客共15分,具体要求如下: * 在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间。(0.5‘) * 解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的过程。(3‘) * 设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?单元测试是怎么设计的?(5‘) * 记录在改进程序性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(如使用Visual Studio的性能分析工具自动生成),并展示你程序中消耗最大的函数。(3‘) * 代码说明。展示出项目关键代码,并解释思路与注释说明。(3‘) * 在你实现完程序之后,在下述PSP表格记录下你在程序的各个模块上实际花费的时间。(0.5‘) *附:PSP 2.1表格* | PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) | | --- | --- | --- | --- | | Planning | 计划 | | | | · Estimate | · 估计这个任务需要多少时间 | | | | Development | 开发 | | | | · Analysis | · 需求分析 (包括学习新技术) | | | | · Design Spec | · 生成设计文档 | | | | · Design Review | · 设计复审 (和同事审核设计文档) | | | | · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | | | | · Design | · 具体设计 | | | | · Coding | · 具体编码 | | | | · Code Review | · 代码复审 | | | | · Test | · 测试(自我测试,修改代码,提交修改) | | | | Reporting | 报告 | | | | · Test Report | · 测试报告 | | | | · Size Measurement | · 计算工作量 | | | | · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | | | | | 合计 | | | ## 四、评分规则 个人项目分数由三部分组成,分别是 * 博客 — 15分,分数组成在博文规范中。 * 程序 — 35分 ``` 10分为源代码管理评分,该评分主要通过源代码管理中的commit注释信息,增量修改的内容,是否有运行说明等给分。 20分为正确性评分。 5分为性能评分,性能测试中使用至少500M的文本进行,没有时间的最小要求限制。 当程序的正确性评分等于20分时才可以参与性能评分环节,所以请各位同学务必保证自己程序的正确性。 ``` * 注意事项: ``` 按时间完成并提交——正常评分 晚交一周以内——折扣90% 晚交一周以上——折扣70% 不交或抄袭——0分【严禁代码与博客等一切形式的抄袭!请各位同学千万不要触碰底线,勿谓言之不预也!】 ```