字典类型操作、jieba库使用及文本词频统计

字典类型及操作

字典的定义

理解“映射”

映射是一种键(索引)和值(数据)的对应

字典类型是“映射”的体现

键值对:键是数据索引的扩展

字典是键值对的集合,键值对之间无序

采用大括号{}和dict()创建,键值对用冒号: 表示

{<键1>:<值1>,<键2>:<值3>}

可以通过键拿到值

我们在之前的的集合中说声明一个空集合要使用set(),而不是直接用{}这是因为,如果使用{}默认为集合

字典的处理函数及方法

 

注意keys()和values()返回的是一种字典的key类型,这些类型是可以用for in的方式做遍历,但是不能当做列表类型来操作

 这里要注意的是:如果我们使用get()找键时没有找到,那就返回第二个设置的参数,否则返回值 

# 定义空字典d
d={}
# 向d新增2个键值对元素
d[0]=1
d[1]=2
# 修改第2个元素
d[1]=3
# 判断字符"c"是否是d的键
"c" in d
# 计算d的长度
len(d)
# 清空d
d.clear()

Jieba库的使用

jieba库概述:jieba是优秀的中文分词第三方库

中文文本需要通过分词获得单个的词语

jieba是优秀的中文分词第三方库,需要额外安装

jieba库提供三种分词模式,最简单只需掌握一个函数

jieba库的安装

(cmd命令行) pip install jieba

jieba分词的原理 

jieba分词依靠中文词库

利用一个中文词库,确定中文字符之间的关联概率

中文字符间概率大的组成词组,形成分词结果

除了分词,用户还可以添加自定义的词组

jieba库使用说明

 精确模式、全模式、搜索引擎模式

精确模式:把文本精确的切分开,不存在冗余单词

全模式:把文本中所有可能的词语都扫描出来,有冗余

搜索引擎模式:在精确模式基础上,对长词再次切分

 

jieba分词要点 jieba.lcut(s)

文本词频统计--英文

需求:一篇文章,出现了哪些词?哪些词出现得最多?

该怎么做呢? 这里要分中文文本 和 英文文本

 英文文本:Hamet 分析词频

https://python123.io/resources/pye/hamlet.txt

中文文本:《三国演义》 分析人物

https://python123.io/resources/pye/threekingdoms.txt 

这段代码的作用是读取一个名为“hamlet.txt”的文本文件,将其转换为小写字母,并将文本中的特殊字符替换为空格。然后,将文本中的单词分割,并统计每个单词出现的次数。最后,按照单词出现次数从高到低的顺序,输出出现次数最多的前10个单词及其出现次数。

具体实现过程如下:

  1. 定义函数 getText(),它打开名为“hamlet.txt”的文本文件,并将文件内容读取到变量 txt 中。

  2. 将 txt 中的所有字符转换为小写字母。

  3. 遍历字符串 txt 中的每个字符,如果字符是特殊字符,则将其替换为空格。

  4. 返回处理后的文本 txt

  5. 调用 getText() 函数,将处理后的文本赋值给变量 hamletTxt

  6. 将 hamletTxt 中的单词通过空格分割,并将每个单词的出现次数保存在字典 counts 中。

  7. 将 counts 转换为列表 items,并按照每个元素的第二个值(即单词出现次数)从高到低排序。

  8. 遍历 items 列表的前10个元素,将每个元素的第一个值(即单词)和第二个值(即出现次数)输出到屏幕上。其中,{0:<10} 表示输出第一个值(即单词)时左对齐占用10个字符的位置,{1:>5} 表示输出第二个值(即出现次数)时右对齐占用5个字符的位置。

文本词频统计--中文

import jieba
txt = open("threekingdoms.txt", "r", encoding='utf-8').read()
words  = jieba.lcut(txt)
counts = {}
for word in 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):
    word, count = items[i]
    print ("{0:<10}{1:>5}".format(word, count))

这段代码的作用是读取一个名为“threekingdoms.txt”的文本文件,使用结巴分词库将文本中的中文分词,并统计每个词语出现的次数。最后,按照词语出现次数从高到低的顺序,输出出现次数最多的前15个词语及其出现次数。

具体实现过程如下:

  1. 导入结巴分词库 jieba

  2. 打开名为“threekingdoms.txt”的文本文件,并将文件内容读取到变量 txt 中。注意需要指定文件编码为 utf-8

  3. 使用结巴分词库 jieba 中的 lcut() 函数对文本进行分词,并将分词结果保存在列表 words 中。

  4. 创建一个空字典 counts,用于保存每个词语的出现次数。

  5. 遍历列表 words 中的每个词语,如果该词语的长度为1,则跳过该词语;否则,将该词语的出现次数加1,并保存到字典 counts 中。

  6. 将字典 counts 转换为列表 items,并按照每个元素的第二个值(即词语出现次数)从高到低排序。

  7. 遍历 items 列表的前15个元素,将每个元素的第一个值(即词语)和第二个值(即出现次数)输出到屏幕上。其中,{0:<10} 表示输出第一个值(即词语)时左对齐占用10个字符的位置,{1:>5} 表示输出第二个值(即出现次数)时右对齐占用5个字符的位置。

但是存在一个bug,将词频与人物并没有相关联 

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]

中文文本分词

使用字典表达词频

扩展程序解决问题

面向问题改造程序

这段代码的功能是读取《三国演义》文本文件,使用jieba分词库对文本进行分词,并统计关键词出现的频率。在统计关键词的过程中,对一些关键词进行了简化和替换,如“孔明曰”简化为“孔明”,“玄德曰”简化为“刘备”,“丞相”替换为“曹操”。

该代码的面向问题改造思路如下:

  1. 问题:需要统计《三国演义》中出现频率最高的关键词。

  2. 解决方案:使用jieba分词库对文本进行分词,并统计关键词出现的频率,然后按照出现频率从高到低排序,选取出现频率最高的前10个关键词。

  3. 实现步骤:

  • 读取《三国演义》文本文件,使用jieba分词库对文本进行分词。
  • 统计分词结果中各个关键词出现的频率,将结果存储在字典counts中。
  • 对一些关键词进行简化和替换,如“孔明曰”简化为“孔明”,“玄德曰”简化为“刘备”,“丞相”替换为“曹操”。
  • 删除一些无意义的关键词,如“将军”、“却说”、“荆州”、“二人”、“不可”、“不能”、“如此”。
  • 将counts转换为列表items,并按照出现频率从高到低排序。
  • 选取出现频率最高的前10个关键词,并输出结果。

猜你喜欢

转载自blog.csdn.net/weixin_64612659/article/details/129821830
今日推荐