(
课件网) 2.4.3算法与程序实现的综合应用 《中共中央关于制定国民经济和社会发展第十四个五年规划和二〇三五年远景目标的建议》 十九大报告 ———词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。 项目描述: 学校开展经典诵读活动,小明在阅读《三国演义》时,为了分析小说的写作特色,想把小说中出现次数最多的20个词查找出来。想一想,小明是否能从纸质小说中找出这20个高频词?如果用计算机解决该问题,又应如何实现? 分析问题 设计算法 保存文件,调试运行 编程实现与调试 1.分析问题 小明在阅读《三国演义》时,为了分析小说的写作特色,想把小说中出现次数最多的20个词查找出来。使用手工方式逐一查找统计,费时费力而且任务难度大,此时,我们可以将其转化为可计算问题,通过编程实现问题的高效求解。 已知条件:文本文件《三国演义); 求解目标:《三国演义》中的高频词(以出现次数最多的20个词为例); 已知与未知的关系:统计《三国演义》文本中词频, 找出出现次数最 多的20个词。 2.设计算法 在问题求解中,除了要完成读取文件和显示输出内容,还要重点实现分词、词频统计和排序等功能。如图所示: 由于中文文本是由连续的字序列构成,没有明显的词语界限,因此分词处理的算法比较复杂。有同学知道分词的算法吗? jieba 是目前最好的 Python 中文分词组件,它主要有以下特性:支持3种分词模式,支持繁体分词,支持自定义词典。 通过jieba的分词功能,我们可以将《三国演义》中的汉字字符序列切分成一个个单独的词,组合成一个“词汇表”。 如何进行词频统计?大家是否还记得之前解决票据中模糊数字推断问题? 在词频统计的过程中主要应用了枚举算法,对于“词汇表”中的每一个词,依次计算出各自的出现次数,生成一个包含词和次数的“统计表”。 请同学们将这个算法的流程补充完整。 词汇表读完了 是否为单字的词 统计表中已有该词 统计结束 统计开始 读取一个词 统计表中该词次数+1 统计表中添加该词,次数为1 true false false true false true 读取文件实现 f = open("三国演义.txt", "r", encoding="utf-8") # 打开文件 txt = f.read() # 读取文件内容 注意:打开文件时要注意编码格式,待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8。 3.编程实现与调试 中文分词实现 import jieba # 导入jieba分词 words = jieba.lcut(txt) # 将句子拆分为词语保存到列表中 函数 描述 jieba.cut(s) 精确模式,返回一个可迭代的数据类型 jieba.cut(s, cut_all=True) 全模式,输出文本s中所有可能单词 jieba.cut_for_search(s) 搜索引擎模式,适合搜索引擎建立索引的分词结果 jieba.lcut(s) 精确模式,返回一个列表类型,建议使用 jieba.lcut(s, cut_all=True) 全模式,返回一个列表类型,建议使用 jieba.lcut_for_search(s) 搜索引擎模式,返回一个列表类型,建议使用 jieba.add_word(w) 向分词词典中增加新词w jieba库 词频统计实现 统计结果保存到哪里?这里我们需要使用Python中一个特殊的数据类型,字典。 counts = {} # 建立空字典,用于存储词和出现次数 for word in words: if len(word) == 1: # 单字的词语忽略不计 continue else: counts[word] = counts.get(word, 0) + 1 # 出现次数+1 lambda函数 用于定义一种特殊的函数———匿名函数,又称lambda函数。 ... ...