资源简介 (共25张PPT)2.4.3 算法与程序实现的综合应用@2.4.3 算法与程序实现的综合应用 “新”字是十九大报告的“亮点”,一个“新”字贯穿整个报告。通过选取“新”开头的词并进行分析与词云图展现,醒目的“新时代”三个字以强烈的视觉冲击效果呈现在我们眼前, 该词在全文中出现36次,高居榜首。其他还有“新格局”“新形势”“新征程”“新成果”“新发展理念”等词汇也频频出现。这意味着,我们党和国家进入了新时代,开启了新征程,人民的幸福之路也将越走越宽、越走越美。@ “词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。2.4.3 算法与程序实现的综合应用@ 学校开展经典诵读活动,小明在阅读《三国演义》时,为了分析小说的写作特色,想把小说中出现次数最多的20个词查找出来。想一想,小明是否能从纸质小说中找出这20个高频词?如果用计算机解决该问题,又应如何实现?项目描述2.4.3 算法与程序实现的综合应用@1.分析问题2.设计算法3.编程实现与调试4.保存文件,调试运行程序使用计算机解决问题的步骤2.4.3 算法与程序实现的综合应用@ 学校开展经典诵读活动,小明在阅读《三国演义》时,为了分析小说的写作特色,想把小说中出现次数最多的20个词查找出来。1.分析问题 手工方法:费时费力,难度很大。 计算机解决:已知条件为文本文件《三国演义》,求解目标为《三国演义》中出现次数最多的20个词。2.4.3 算法与程序实现的综合应用@ 在问题求解中,除了要完成读取文件和显示输出内容,还要重点实现分词、词频统计和排序等功能。如图所示:2.设计算法2.4.3 算法与程序实现的综合应用@ 由于中文文本是由连续的字序列构成,没有明显的词语界限,因此分词处理的算法比较复杂。有同学知道分词的算法吗? jieba 是目前最好的 Python 中文分词组件,它主要有以下特性:支持3种分词模式,支持繁体分词,支持自定义词典。 通过jieba的分词功能,我们可以将《三国演义》中的汉字字符序列切分成一个个单独的词,组合成一个“词汇表”。2.设计算法2.4.3 算法与程序实现的综合应用@ 如何进行词频统计?大家是否还记得之前解决票据中模糊数字推断问题? 在词频统计的过程中主要应用了枚举算法,对于“词汇表”中的每一个词,依次计算出各自的出现次数,生成一个包含词和次数的“统计表”。 请同学们将这个算法的流程图画出来。2.设计算法2.4.3 算法与程序实现的综合应用@2.设计算法2.4.3 算法与程序实现的综合应用@ 要找到出现次数最多的20个词,需要对“统计表”中的词语按次数从大到小进行排序。你们知道有哪些排序算法吗?交换排序1.冒泡排序2.快速排序插入排序1.直接插入排序2.希尔(shell)排序选择排序1.直接选择排序2.堆(Heap)排序归并排序2.设计算法 在Python语言中可以直接调用内置的排序函数快速实现序列排序。2.4.3 算法与程序实现的综合应用@读取文件实现f = open("三国演义.txt", "r", encoding="utf-8")# 打开文件txt = f.read() # 读取文件内容 注意:打开文件时要注意编码格式,待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8。3.编程实现与调试2.4.3 算法与程序实现的综合应用@中文分词实现import jieba # 导入jieba分词words = jieba.lcut(txt) # 将句子拆分为词语保存到列表中3.编程实现与调试2.4.3 算法与程序实现的综合应用@3.编程实现与调试2.4.3 算法与程序实现的综合应用@3.编程实现与调试jieba库函数 描述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) 向分词词典中增加新词w2.4.3 算法与程序实现的综合应用@3.编程实现与调试词频统计实现统计结果保存到哪里?这里我们需要使用Python中一个特殊的数据类型,字典。counts = {} # 建立空字典,用于存储词和出现次数for word in words:if len(word) == 1: # 单字的词语忽略不计continueelse:counts[word] = counts.get(word, 0) + 1 # 出现次数+12.4.3 算法与程序实现的综合应用@3.编程实现与调试词频统计实现 字典数据是无序的,需要将字典转化为列表,对列表排序。 函数参数的意义解释,这里会用即可,函数相关内容需要专门课时学习。items = list(counts.items()) # 字典转化为列表后才可以排序items.sort(key=lambda x:x[1], reverse=True)# 对列表items按“次数”降序排序2.4.3 算法与程序实现的综合应用@3.编程实现与调试lambda函数用于定义一种特殊的函数——匿名函数,又称lambda函数。匿名函数并非没有名字,而是将函数名作为函数结果返回,如下:<函数名> = lambda <参数列表>: <表达式>lambda函数与正常函数一样,等价于下面形式:def <函数名>(<参数列表>):return <表达式>2.4.3 算法与程序实现的综合应用@3.编程实现与调试lambda函数作为参数counts = {"Apple":25, "Orange":40, "Green tea":28, "Coffee":15}L = list(counts.items())L.sort(key=lambda x:x[1], reverse=True)则排序后列表L的值为:[("Orange", 40), ("Green tea", 28), ("Apple", 25),("Coffee", 15)]。2.4.3 算法与程序实现的综合应用@3.编程实现与调试 显示输出实现for i in range(20):print(items[i][0], items[i][1]) # 输出词和出现次数2.4.3 算法与程序实现的综合应用@3.编程实现与调试 编程解决问题不是一蹴而就的。通常,我们要根据程序运行结果,围绕求解目标,改进算法、优化程序,以实现问题的最终有效解决。 我们目前的程序运行得到的结果是什么?有什么问题吗?2.4.3 算法与程序实现的综合应用@3.编程实现与调试 我们可以利用Python语言中的if语句将这些词语进行合并处理,具体编码实现如下:for word in words:if len(word) == 1:continueelif word == "诸葛亮" or word == "孔明曰":rword = "孔明"elif word == "关公" or word == "云长" :rword = "关羽"elif word == "玄德" or word == "玄德曰" :rword = "刘备"elif word == "孟德" or word == "丞相" :rword = "曹操"else:rword = wordcounts[rword] = counts.get(rword, 0) + 12.4.3 算法与程序实现的综合应用@4.保存文件,调试运行程序 为了更有效地查找、修改程序中存在的错误,需要仔细阅读和分析程序语句,掌握必要的调试方法。断点调试是一种较为直观的程序调试方式,其基本方法为: 进入调试状态; 设置断点; 检查运行状态下各个变量的值,确定错误的位置,并进行修改; 反复调试直至程序运行正确。2.4.3 算法与程序实现的综合应用@课后思考: 在前面已经找到的20个高频词中,包括有“却说”“二人”“不能”等与人名无关的词语。想一想,如何去除这些词语,只显示10位出场次数最多的主要人物?尝试修改程序。2.4.3 算法与程序实现的综合应用谢谢观看Thanks for watching 展开更多...... 收起↑ 资源预览