Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)

前言

本篇主要介绍组合数据类型,以基本统计值计算为例,介绍函数使用和各种类型定义。以文本词频统计为例,介绍Jieba库的使用。
(从本篇开始,出现的一些库中函数介绍以及部分简单代码都将以图片形式呈现)

读完本篇,你将了解:
1.方法论:
Python三种主流组合数据类型的使用方法(建立集合、序列、字典模式)
2.实践能力:
学会编写处理一组数据的程序

本篇将系统介绍:
1.集合类型及操作
2.序列类型及操作(包括元组类型、列表类型)
3.实例:基本统计值计算
4.字典类型及操作
5.模块5: jieba库的使用
6.实例:文本词频统计

一、集合类型及操作

1.集合类型定义

(1)集合:多个元素的无序组合
①集合类型与数学中的集合概念一致
②集合元素之间无序,每个元素唯一,不存在相同元素
③集合元素不可更改,不能是可变数据类型(即元素放到集合中,不能被修改)
④非可变数据类型:整数、浮点数、复数、字符串类型、元组类型等
(2)建立集合类型
①集合用大括号表示,元素间用逗号分隔
②建立集合类型用或set()
③建立空集合类型,必须使用set()
(3)举例
①A = {“python”,123,(“python”,123)} # 使用{}建立集合
其中小括号表示的数据类型叫元组
②使用set()函数生成集合
B = set(“pypy123”)
使其中每一个字符单独拆分,变成集合中的一个元素。因此集合中有5个元素
{‘1’,‘p’,‘2’,‘3’,‘y’}
由于其中有2个p和2个y,生成集合之后,相同的p和y将会被去掉。生成之后其中的元素不会按顺序保留
③定义一个存在相同元素的方式构造的集合
C = {“python”,“123”,“python”,“123”}
这样生成的集合只有两个元素{‘python’,123}

2.集合操作符

(1)集合间操作
四种运算:并运算、差运算、交运算和补运算
(2)6个操作符
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第1张图片

(3)4个增强操作符
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第2张图片

不用的话会产生新的集合,使用增强操作符会修改原有的一个集合
(4)举例
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第3张图片

3.集合处理方法

Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第4张图片
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第5张图片

①以上十种对集合分别进行了增加、删除元素,清空元素、取出元素等基本操作
②同时对元素集合的元素个数、元素的拷贝、判断等做了相关操作
③有了这些,我们能处理集合的几乎所有功能
④for in的方式可以遍历一个组合数据类型,while也可以,他们的遍历在不同的应用场景各有特点

4.集合类型应用场景

(1)包含关系的比较
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第6张图片

①保留字in判断其他的元素是否在这个集合中
②判断数据之间的关系
(2)数据去重
利用集合中所有元素不能重复的特点
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第7张图片

二、序列类型及操作

1.序列类型定义

(1)序列
序列是具有先后关系的一组元素
①序列是一维元素向量,元素之间可以相同,元素类型可以不同
②类似数学元素序列:s0, s1, …,Sn-1
③元素间由序号引导,通过下标(整数序列编号),访问序列的特定元素
(2)序列类型的使用
序列是一个基类类型,简单说是一个基本的数据类型
①一般使用时,不会直接使用,而是使用序列类型衍生出来的几种数据类型
②比如字符串类型、元组类型。列表类型是序列类型的几种衍生
③序列类型的操作在以上衍生类型中同样适用
④以上三种衍生类型又有各自独特的操作能力
(3)序号的定义
①元素存在正向递增的序号的索引关系和反向递减序号的索引关系
②如原来讲过的字符串序号
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第8张图片

区别在于每一个元素在字符串类型中只是一个字符,而在序列类型中复中的每一个元素可以是任何一种数据类型

2.序列处理函数及方法

(1)序列类型通用操作符
6个操作符
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第9张图片

①s[i]中:序号有正向递增、反向递减两种体系
(2)序列类型通用函数和方法
5个函数和方法
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第10张图片

①min和max中,若序列中元素是不同类型、不能比较,这两个函数将报错
②举例
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第11张图片

3.元组类型及操作

(1)元组类型定义
将元素进行有序的排列,用()组织
①元组是序列类型的一种扩展
②元组是一种序列类型,一旦创建就不能被修改
③使用小括号()或 tuple()创建,元素间用逗号,分隔
④可以使用或不使用小括号
⑤函数中获得元组的返回变量,也可以用元组的形式来解析其中的返回元素
(2)举例
①如图
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第12张图片

使用creature变量的时候会看到,内部会把由逗号分隔形成的多个元素表达为元组类型
②如图
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第13张图片
元组类型中包含元组类型
(3)元组类型操作
①元组继承了序列类型的全部通用操作
②元组因为创建后不能修改,因此没有特殊操作
③使用或不使用小括号
注意:切片时不改变原有变量值,而是生成了一个新的元组值

4.列表类型及操作

(1)列表类型定义
列表是序列类型的一种扩展,十分常用
①列表是一种序列类型,创建后可以随意被修改
②使用方括号或list()创建,元素间用逗号,分隔
③列表中各元素类型可以不同,无长度限制
④举例
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第14张图片

注意:方括号[]真正创建一个列表,赋值仅传递引用。如果仅仅通过=将一个列表变量赋值给另外一个列表变量
此时并未在系统中真正的生成一个列表。而是将同一个列表赋给了不同的名字ls、lt,他们两个都指向同一个列表
(2)列表类型操作函数和方法
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第15张图片
举例
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第16张图片

(3)修改列表内容
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第17张图片

举例
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第18张图片

5.序列类型应用场景

(1)数据表示
①元组用于元素不改变的应用场景,更多用于固定搭配场景
比如函数的返回值return
②列表更加灵活,它是最常用的序列类型
用一个数据类型处理一组数据,且处理的功能多样,尽可能使用列表
③最主要作用:表示一组有序数据,进而操作它们
(2)元素遍历(更主要的是对数据的表达)
(3)数据保护
如果不希望数据被程序所改变,转换成元组类型(利用元组元素不可修改特点)

三、实例:基本统计值计算

1.问题分析

(1)基本统计值
需求∶给出一组数,对它们有个概要理解(总个数、求和、平均值、方差、中位数…)
(2)相关方法
①总个数:len()
②求和:for … in
③平均值:求和/总个数
④方差∶各数据与平均数差的平方的和的平均数
⑤中位数:排序,奇数找中间1个,偶数找中间2个取平均

2.实例讲解

(1)获取用户不定长度的输入

def getNum():
    nums = []
    iNumStr = input("请输入数字(回车退出):")
    while iNumStr != "":
        nums.append(eval(iNumStr))
        iNumStr = input("请输入数字(回车退出):")
    return nums

①使用input函数获得用户输入。若输入非空,转换为数字放到列表中
②同时再次要求用户提供一个输入
③直到输入一个空字符串或者回车,循环退出
④最终会将每一个输入放进列表中,返回给调用函数的部分,作为输入的数据
(2)计算平均值

def mean(numbers):
    s = 0.0
    for num in numbers:
        s = s + num
    return s/len(numbers)
    (3)计算方差
def dev(numbers, mean):
    sdev = 0.0
    for num in numbers:
        sdev += (num-mean)**2
    return  pow(sdev.(len(numbers)-1),0.5)

(4)计算中位数


def median(numbers):
    sorted(numbers)
    size = len(numbers)
    if size%2 == 0:
        med = (numbers[size//2-1]+numbers[size//2])/2
    else:
        med = numbers[size//2]
    return med

①sorted函数进行排序
(5)调用

    n = getNum()
    m = mean(n)
    print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n, m), median(n)))

3.举一反三

技术能力扩展
①获取多个数据:从控制台获取多个不确定数据的方法
②分隔多个函数︰模块化设计方法
③充分利用函数︰充分利用Python提供的内容函数

四、字典类型及操作

1.字典类型定义

(1)映射
①映射是一种键(索引引和值(数据)的对应
②序列类型由0…N整数作为数据的默认索引,映射类型则由用户为数据定义索引
(2)字典类型(是映射类型的体现)
①是数据组织与表达的一种新的形态
②键值对:键是数据索引的扩展
③字典是键值对的集合,键值对之间无序
④采用大括号f和dict()创建,键值对用冒号:表示
举例:{<键1>:<值1>,<键2>:<值2>,…,<键n>:<值n>}

    (3)[]用来向字典变量中索引或增加元素
        ①<字典变量> ={<键1>:<值1>,... ,<键n>:<值n>}
        ②<值>=<字典变量>-[<键>]
        ③<字典变量>[<键>]=<值>
    (4)举例
        生成一个字典d,每个元素都是一个键值对
        d = {"中国":"北京",“美国":"华盛顿","法国":"巴黎""}
        使用d["中国"]返回‘北京’
    (5)生成空的字典
        de = {}; type(de)
        注意:空的{}不能用来生成空集合

2.字典处理函数及方法

(1)几种函数
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第19张图片
①k in d中,k并不是数据值,而是数据值的索引
②d.keys和d.values并不返回列表类型,返回一种字典的key类型或values类型(可用for in的方式做遍历)
③举例
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第20张图片

(2)处理操作的方法
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第21张图片

3.字典类型应用场景

(1)映射的表达
①映射无处不在,键值对无处不在
②例如∶统计数据出现的次数,数据是键,次数是值
③最主要作用:表达键值对数据,进而操作它们

五、模块5: jieba库的使用

1.jieba库基本介绍

(1)jieba是优秀的中文分词第三方库
①中文文本需要通过分词获得单个的词语
②jieba需要额外安装
③jieba库提供三种分词模式,最简单只需掌握一个函数
(2)jieba库的安装
(cmd命令行) pip install jieba
(3)jieba分词原理
①利用一个中文词库,确定汉字之间的关联概率
②汉字间概率大的组成词组,形成分词
③结果除了分词,用户还可以添加自定义的词组(以适用于其他领域)

2.jieba库使用说明

(1)jieba分词的三种模式
①精确模式(最常用):把文本精确的切分开,不存在冗余单词
②全模式∶把文本中所有可能的词语都扫描出来,有冗余
③搜索引擎模式(更智能)︰在精确模式基础上,对长词再次切分
(2)常用函数
如图22、23
(3)jieba分词要点
记住jieba.lcut(s)函数即可完成分词功能

六、实例:文本词频统计

1.问题分析

(1)需求:一篇文章,出现了哪些词?哪些词出现得最多?
(2)给出英文文本和中文文本分别进行的文本词频统计的实例
(3)举例
①英文文本:Hamlet 分析词频
https://python123.io/resources/pye/hamlet.txt
②中文文本︰《三国演义》 分析人物
https://python123.io/resources/pye/threekingdoms.txt
文本可在链接中下载

2.实例讲解

(1)Hamlet英文词频统计
注意大小写,空格,不同的标点符号
①将文本进行噪音处理、归一化,提取其中的每一个单词

def getText():  # 获得文本的具体信息
    txt = open("hamlet.txt", "r").read()  # 打开文件
    txt = txt.lower()
    for ch in '|"#$%&*()+-./;:<>=?@[\\]^_’{}!':  # 将文本中每一个特殊符号拿来
        txt = txt.replace(ch, "")  # 用空格替换特殊符号
    return txt  # 替换后仍保存在txt中,处理后形成归一化结果,所有单词小写,单词之间使用空格分隔,且无任何特殊符号


hamletTxt = getText()  # 对文件进行读取且对文本归一化
words = hamletTxt.split()  # 字符串中split()默认采用空格将字符电中的信息进行分隔,并且以列表形式返回给变量
counts = {
     }  # 字典类型表达单词跟出现频率之间的对应关系
for word in words:  # words列表中取出元素
    counts[word] = counts.get(word, 0) + 1  # 字典中get()用来从字典中获得某一个键应的值,不存在给出默认值0
items = list(counts.items())  # 字典类型转换为列表类型
items.sort(key=lambda x: x[1], reverse=True)  # lambda用来指定使用哪—个多元选项的列作为排序列,默认排序从小到大, reverse=True排序从大到小
# 即对一个列表,按照键值对的2个元素的第二个元素进行排序,排序的方式是由大到小的倒排
for i in range(10):  # 将其中的前10个出现最多的单词及对应次数打印出来
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))

结果统计
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第22张图片

(2)《三国演义》人物出场统计实例讲解
①使用jieba进行分词
②中文不存在大小写问题,中文标点符号在分词过程中会被处理掉
③附码

import jieba
txt = open("thresskingdoms.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)  # 进行分词处理,形成列表类型的带有所有单词的列表words
counts = {
     }  # 构造字典counts
for word in words:  # 逐一遍历words中的每一个中文单词
    if len(word) == 1:
        continue
    else:
        counts[word] = counts.get(word, 0) + 1  # 通过字典进行计数
items = list(counts.items())  # 转换为列表类型
items.sort(key=lambda x: x[1], reverse=True)  # 排序
for i in range(15):  # 将其中的前15位单词打印输出
    word, count = items[i]
    print("{0:<10}{1:>5}".format(word, count))

④运行结果
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第23张图片

由于分词原因,同一个人和单词组合会使结果不太合理,代码需进行改造
(3)《三国演义》人物出场统计代码优化
①在原代码结果中出现大量和人名无关的词,以及同一个人的不同名称,重复计数
②考虑如何面向问题改造程序
③升级代码

import jieba
txt = open("thresskingdoms.txt", "r", encoding="utf-8").read()
excludes = {
     "将军", "却说", "荆州", "二人", "不可", "不能", "如此"}  # 构造集合,将一些确定不是人名但是又排序比较靠前的单词列进去
# 不断运行程序,结果发现其中多少位有多少的单词确定不是人名,则加到集合中
words = jieba.lcut(txt)  # 进行分词处理,形成列表类型的带有所有单词的列表words
counts = {
     }  # 构造字典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  # 通过字典进行计数
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))

④运行结果
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第24张图片

进一步更新排除词库,优化输出结果
最终结果:
Python—— 组合数据类型(模块5: jieba库的使用)(实例:基本统计值计算&文本词频统计)_第25张图片

3.举一反三

(1)应用问题的扩展
①人物统计:《红楼梦》、《西游记》、《水浒传》
②词频统计政府工作报告、科研论文、新闻报道
③对对文本的词语或词汇绘制词云,具有更直观的展示效果
(2)这是充分利用组合数据类型中的集合、序列以及字典完成功能的非常好的实例

总结

经过本篇的学习,可以大致掌握运用集合、序列、字典类型和jieba分词库去实现一些文本的词频统计,大家可以尝试不同的类型代码使用,进行各类型的对比和优劣,进行多种分词和基本问题的解决。

下篇将介绍文件和数据格式化。

你可能感兴趣的:(python)