2.4.3算法与程序实现的综合应用
第二课时练习题
jieba库有三种模式,请写出不同模式下的分词结果。
1
全模式(以一个字为基准,筛选邻近并且可以组成词语的字进行组合显示)
import
jieba
s="钓鱼要上岛上钓不上岛上钓不到"
seg_list=jieba.cut(s,cut_all=False)
#cut_all=False表示全模式分词
print("Full
Mode:","/".join(seg_list))
2.精准模式
import
jieba
s="钓鱼要上岛上钓不上岛上钓不到"
s1="钓鱼要上岛上钓,不上岛上钓不到"
seg_list,seg_list1=jieba.cut(s),
jieba.cut(s1)#cut_all=True表示全模式分词;省略的话,默认为精准模式
print("Full
Mode:","/".join(seg_list),"\nFull
Mode1:","/".join(seg_list1))
3
搜索引擎模式
import
jieba
s="钓鱼要上岛上钓不上岛上钓不到"
seg_list=jieba.cut_for_search(s)
#该模式适用于搜索引擎构建倒排序索引的分词
print("Full
Mode:",",".join(seg_list))
答案:
1写出分词结果:
2分词结果:
3分词结果:教学设计
课例名称
2.4.3算法与程序实现的综合应用(第二课时)
学段学科
高一
信息技术
教材版本
人教中图版
章节
必修1
第二章
第四节
授课学校
核心素养
目标
根据具体需要,应用不同的算法,编写程序实现相应的问题求解。
借助给定的资源进行对比,完成相应问题分析。有意识地迁移,应用所学方法解决类似问题,强化主动应用算法知识解决问题的意识。
3、分析程序实现的关键技术,加深学生对数字化工具背后的技术思想和方法的感悟。
教学重难点
1、教学重点:
词频统计的算法设计与程序实现。
亲历阅读与分析程序,体会程序中每一语句、函数的含义。
2、教学难点:
结合具体问题进行算法优化,并总结此类问题的解决方法,迁移到类似问题中。
教材分析
本节内容是算法与程序实现的综合应用,教材案例中引用一个重要的技术支撑:字典。本节多了一些全新概念和功能实现,在教学中需要不拘泥于教科书中提供的资源,拓展更多的内容。
本节内容较多,分为两课时讲解,第一课时主要学习字典的相关知识,第二节课主要是经历具体问题的解决过程,进行算法与程序实现的综合应用,由浅入深,自顶而下,逐步求精地学习。
教学策略
本节强调学生通过感悟迁移和操作来体验算法与程序的综合应用,通过案例的举证和类比总结相关问题的解决方法。
突出学生主体,让学生亲历问题解决的全过程,通过师生交流、生生交流、逐步理解和内化算法思想,鼓励学生对运行结果进行分析,思考问题产生的原因,进一步优化。
2.4.3算法与程序实现的综合应用
第二课时
教学准备:
在电脑cmd后台下载安装如下工具:
一、温故知新——字典与列表
对前面所学的字典与列表进行比较,归纳梳理,总结出相似点与不同点。
1、相似点
列表的元素和字典的值可以是任意类型,比如数字、字符串、列表、字典,甚至对象等类型。
2、不同点
(1)列表有顺序,索引总是从
0
开始、连续增大的,字典无序,不需从0
开始。
(2)列表不允许对不存在的索引赋值,但字典则允许直接对不存在的
key
赋值。
(3)列表中的元素是使用索引访问的,通过索引可以对数据进行查询、修改、删除。
(4)字典中的元素是使用键来访问的,通过键可以对数据进行查询、修改、删除。
(5)字典的查找效率要比列表的查找效率更高。
二、讲授新知
(一)字典与列表的相关函数
字典没有顺序,但调用字典的keys()函数可以得到键构成的列表。
列表可以排序,将字典元素转换为列表,再排序。
(二)读取文件
Python对文本文件和二进制文件采用统一的操作步骤:?打开-操作-关闭
1、打开文件
调用内置函数open()
打开文件,并实现该文件与一个变量的关联。
open()
函数语法:?
<变量>
=
open(<文件名>,<打开模式>)
参数说明:
<文件名>可以是一个简单的文件名,也可以是包含完整路径的文件名。
<打开模式>用于控制打开文件的方式,例如读或写。
2、读取文本文件,替换内容、写出文件
三、学以至用——英文小说的词频统计
(一)词频统计的IPO描述
学生探究:词频统计的IPO描述
输入——处理——输出
(二)词频统计的算法
学生分析,在教师的引导下给出思路
1、第一步:提取单词
2、第二步:对每个单词进行计数
3、第三步:排序
(三)英文词频统计的完整程序
1)读取文件,通过lower()、replace()函数将所有单词统一为小写,并用空格替换特殊字符。
2)对处理后的文本进行词频统计存入字典
3)统计结果存为列表类型,按词频由高到低进行排序,输出前十位
(四)输出统计结果
以三个步骤让学生体验构建程序的过程,亲历阅读与分析程序,体会程序中每一语句、函数的含义。
改写:显示20个出现次数最多的词语。
四、实践活动
进一步加强解决“词频统计”相关问题的能力。
1、思考:在问题求解中,要完成读取文件和显示输出内容外,程序中还要重点实现哪些功能?完成下图:
以上一案例的分析进行知识迁移,给出本问题的解决过程:分词
——
统计
——
排序
2、jieba
分词
文本词频的统计,对英文不需要很麻烦的分词技术,但对中文要准确提取词语,就需要引入Python第三方库“jieba”的知识。jieba是python中一个重要的第三方中文分词函数库,他将待分词的内容与分词词库依次进行比对,通过图结构和动态规划的方法找到最大概率的词组,生成一个列表。
算法流程图
4、探究活动,完成下列任务:
5、调试程序
为了更有效地查找、修改程序中存在的错误,需要仔细阅读和分析程序语句,掌握必要的调试方法。断点调试是一种较为直观的程序调试方式,其基本方法为:
进入调试状态;
设置断点;
检查运行状态下各个变量的值,确定错误的位置,并进行修改;
反复调试直至程序运行正确。
思考:
在前面已经找到的高频词中,包括有“商议”“如何”等与人名无关的词语。想一想,如何去除这些词语?尝试修改程序。
五、深入探究
在大数据时代,经常可以在媒体或者网站上看到一些非常漂亮的信息图。教师运行词云相关程序,引领学生通过网络搜索“词语统计+词云”相关信息,课后进一步深入学习。
附:
三国演义词频统计程序:
import
jieba
excludes
=
{"将军","却说","荆州","二人","不可","不能","如此"}
txt
=
open("threekingdoms.txt",
"r",
encoding='utf-8').read()
words
=
jieba.lcut(txt)
counts
=
{}
for
word
in
words:
if
len(word)
==
1:
continue
elif
word
==
"诸葛亮"
or
word
==
"孔明曰":
rword
=
"孔明"
elif
word
==
"关公"
or
word
==
"云长":
rword
=
"关羽"
elif
word
==
"玄德"
or
word
==
"玄德曰":
rword
=
"刘备"
elif
word
==
"孟德"
or
word
==
"丞相":
rword
=
"曹操"
else:
rword
=
word
counts[rword]
=
counts.get(rword,0)
+
1
for
word
in
excludes:
del
counts[word]
items
=
list(counts.items())
items.sort(key=lambda
x:x[1],
reverse=True)
for
i
in
range(10):
word,
count
=
items[i]
print
("{0:<10}{1:>5}".format(word,
count))(共34张PPT)
第二章
算法与程序实现
2.4.3
算法与程序实现的综合应用
第二课时
目
录CONTENTS
一
字典与列表
二
读取文件
三
词频统计
四
实践活动
五
阅读拓展
字
典
与
一
列
表
本节程序涉及字典与列表的转换。
字典的键使用不可变类型,包括布尔型、整数、浮点数、字符串和元组。可变类型(如列表)不能作为字典的键。
字典和列表有类似,但也有一些区别。
1、相似点
列表的元素和字典的值可以是任意类型,比如数字、字符串、列表、字典,甚至对象等类型。
一、字典与列表
2、不同点
(1)列表有顺序,索引总是从
0
开始、连续增大的,字典无序,不需从0
开始。
(2)列表不允许对不存在的索引赋值,但字典则允许直接对不存在的
key
赋值。
(3)列表中的元素是使用索引访问的,通过索引可以对数据进行查询、修改、删除。
(4)字典中的元素是使用键来访问的,通过键可以对数据进行查询、修改、删除。
(5)字典的查找效率要比列表的查找效率更高。
一、字典与列表
3、相关函数
字典没有顺序,但调用字典的keys()函数可以得到键构成的列表。
列表可以排序,我们将字典元素转换为列表,再排序。
(1)字典转换为列表,用函数list():
?list(<字典>.items())
(2)使用排序函数sorted(),默认是以列表元素的第一个子元素来排序。
一、字典与列表
读
取
文
二
件
二、
读取文件
Python对文本文件和二进制文件采用统一的操作步骤:?打开-操作-关闭
1、打开文件
调用内置函数open()
打开文件,并实现该文件与一个变量的关联。
open()
函数语法:?
<变量>
=
open(<文件名>,<打开模式>)
参数说明:
<文件名>可以是一个简单的文件名,也可以是包含完整路径的文件名。
<打开模式>用于控制打开文件的方式,例如读或写。
#获取内容
str1?=?f.read()
#替换内容
str2?=?str1.replace("ha","123")
print(str1)
print(str2)
2、读取文本文件,替换内容、写出文件
#写出文件
ff?=?open(path,?"w")
#将信息写入缓冲区
ff.write(str2)
#刷新缓冲区
ff.flush()
#路径
path?=?r"D:\python\1.txt"
#读入
f?=?open(path,?"r",?encoding="utf-8")
二、
读取文件
词
频
统
三
计
三、词频统计
英文小说的词频统计
词频统计的IPO描述
词频统计的算法
词频统计的完整程序
输出统计结果
1、词频统计的IPO描述
对于一篇文章,我们要统计并找出其中多次出现的词语,这就是“词频统计”。
从算法上看,词频统计只是累加问题,也就是给文章的每个词语设计一个计数器,词语每出现一次,相关计数器就加1。
以词语为键,出现次数为值,构成“词语:出现次数”的键值对。
词频统计的IPO描述
词频统计的IPO描述
探究:词频统计的IPO描述
输入——处理——输出
输入:从文件中读取
处理:使用字典统计词语出现的频率
输出:出现最多的10个词语及其频率
词频统计的算法
2、词频统计的算法
统计过程主要应用了哪种算法?
A
枚举算法
B
排序法
C
解析法
D
递归法
词频统计的算法
2、词频统计的算法
第一步:提取单词
统计词频的第一步,是分解并提取文章的单词。
(1)同一个单词会存在大小写的形式,因此需要将大写字母统一转换为小写字母。
(2)英文单词的分隔可以是空格、标点符号或者特殊符号。为了统一分隔方式,调用函数replace()将各种特殊字符和标点符号替换为空格。
词频统计的算法
2、词频统计的算法
第二步:对每个单词进行计数
假设将所有单词保存在列表words中,变量word代表words的元素,使用字典counts统计单词出现的次数:
counts[word]=counts[word]+1
无论单词是否在字典中,处理逻辑都可以简洁地表示为如下代码:
counts[word]=counts.get(word,0)+1
get()
函数表示:如果word在字典中,则返回word对应的值;如果word不在字典中,则返回0。
2、词频统计的算法
第三步:排序
对单词的统计值从高到低进行排序:
items
=
list(counts.items())
items.sort(key=lambda
x:x[1],
reverse=True)
第1行代码是将字典转换为列表。
第2行代码是按照列表元素的第2项对列表进行排序,参数reverse=True
表示从大到小排序。
词频统计的算法
词频统计程序
3、词频统计的完整程序
以《飘》为例,统计词频最高的前十位。
1)读取文件,通过lower()、replace()函数将所有单词
统一为小写,并用空格替换特殊字符
def
gettext():
txt
=
pen("piao.txt","r",errors='ignore').read()
txt
=
txt.lower()
for
ch
in
'!"#$&()
+,-/:;<=>?@[\\]^_{|}·~‘’':
txt
=
txt.replace(ch,"")
return
txt
2)对处理后的文本进行词频统计存入字典
txt
=
gettext()
words
=
txt.split()
counts
=
{}
for
word
in
words:
counts[word]
=
counts.get(word,0)
+
3)统计结果存为列表类型,按词频由高到低进行排序,
输出前十位
items
=
list(counts.items())
items.sort(key=lambda
x:x[1],reverse=True)
for
i
in
range(10):
word,count
=
items[i]
print("{0:<10}{1:>5}".format(word,count))
输出词频统计结果
4、输出词频统计结果
从思路上看,词频统计只是一个累加的问题,用于网络信息的自动检索和归档,但在信息爆炸时代,这种检索或归档非常有必要。
在词频统计领域,哈佛大学的齐夫老师做了开创性的工作,提出了齐夫定律:即词的频次和他的等级相乘是一个常数。另外剑桥大学有一款
词频分析软件WordSMith,狂难用。
实
践
活
四
动
《三国演义》词频统计
Python在自然语言处理方面,有其天然的优势:简单、快捷。所以经常会遇到利用Python从一篇文档中,统计文本词频的问题。以《三国演义》这部名著为例,进行中文词语的统计,文中哪些人物的出场次数最多呢?让我们用Python来解决看看吧!
IPO
描述
探究完成此问题的IPO描述:
经前面分析,文本词频统计是通过对文本信息的自动检索,进行累加的计算。
Input:读取《三国演义》内容
Process:利用“字典”统计词语的出现次数
Output:打印出《三国演义》中出场次数最多的人
名和具体次数
问题解决过程
思考:在问题求解中,要完成读取文件和显示输出内容外,程序中还要重点实现哪些功能?完成下图:
以上一案例的分析进行知识迁移,给出本问题的解决过程。
jieba
分词
本节一直在强调的是文本词频的统计,“词语”是关键,对英文不需要很麻烦的分词技术,但对中文要准确提取词语,就需要引入Python第三方库“jieba”的知识。jieba是python中一个重要的第三方中文分词函数库,他将待分词的内容与分词词库依次进行比对,通过图结构和动态规划的方法找到最大概率的词组,生成一个列表。
?
python的jieba库可在命令提示符下,直接输入pip
install
jieba进行安装。
jieba库常用的分词模式有三种:
??
精确模式:jieba.lcut(str),尽可能地将文本精确地分开,比较适合于文本分析
??
全模式
:jieba.lcut(str,cut_all=True),把文本中可以成词的词语尽可能地分出来,速度较快,但不能解决歧义问题
??
搜索引擎模式:jieba.lcut_for_search(str),在精确模式的基础上,对长词进行再次切分,提高召回率,适合于搜索引擎。
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)
向分词词典中增加新词w
jieba库
jieba
分词
算法流程图
算法
程序实现
#打开“三国演义.txt”文件,读取文件内容
import
jieba
#导入jieba分词
excludes
=
{"将军","却说","荆州","二人","不可","不能","如此","商议","如何","公主","军士","主公","左右","军马","引兵","次日","大喜","天下","东吴","于是","今日","不敢","魏兵","陛下","一人","都督","人马","不知"}
f
=
open("threekingdoms.txt",
"r",
encoding='utf-8')
#打开文件
txt
=
f.read()
#读取文件内容
程序第一句导入jieba分词
程序实现
探究活动,完成下列任务:
第一步
分词
words
=
(请补充完整
)
#将句子拆分为词语保存到列表中
第二步
统计
统计结果保存到哪里?建立空字典的语句是?
根据流程图完成具体编码的实现。
第三步
排序
items
=
list(请补充完整)
#字典转化为列表后才可以排序
items.sort(请补充完整)
#对列表items按“次数”降序排序
调试程序
程序实现
调试程序
程序实现
在前面已经找到的高频词中,有“商议”、
“如何”等与人名无关的词语。想一想,如何去除这些词语?尝试修改程序。
阅
读
拓
五
展
词云实现
Python
词云实现
学生通过网络搜索“词云”相关信息,课后进一步深入学习。
谢
谢