自学内容网 自学内容网

python语言基础-4 常用模块-4.8 jieba模块

声明:本内容非盈利性质,也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站,会尽量附上原文链接,并鼓励大家看原文。侵删。

4.8 jieba模块

4.8.1 jieba库简介

中文文本需要通过分词来获得单个词语。而jieba就是一个优秀的中文分词第三方库。

jieba库作为第三方库使用前需要安装:pip install jieba。

jieba使用非常简捷,它提供了三种分词模式,最简单的只需要掌握一个函数。

4.8.2 jieba库分词原理

jieba库的分词原理:

  • 利用中文词库,确定汉字之间的关联概率;
  • 汉字间概率大的组成词组,形成分词结果;
  • 除了分词,用户可以添加自定义的词组。

jieba库的三种分词模式:

  • 精确模式:把文本精确切分开,不存在冗余单词(即所有词按顺序合起来仍是这个文本中的句子);
  • 全模式:把文本中所有可能的词语都扫描出来,有冗余(即某个字与前后两个字都有可能单独组成词语,则它们都会被扫描出来,于是这个字就出现了两次);
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分。

4.8.3 jieba库的常用函数

jieba中有以下常用函数可以用来达到相应的分词效果。

jieba.lcut(s):精确模式分词,返回一个列表类型的分词结果。其中,s是一个字符串。如下:

jieba.lcut("中国是一个伟大的国家")
# 分词的结果为['中国','是','一个','伟大','的','国家']

jieba.lcut(s, cut-all=True):全模式分词,返回一个列表类型的分词结果。其中,s是一个字符串。如下:

jieba.lcut("中国是一个伟大的国家", cut-all=True)
# 分词的结果为['中国','国是','一个','伟大','的','国家']

jieba.lcut_for_search(s):搜索引擎模式分词。返回一个列表类型的分词结果。其中,s是一个字符串。如下:

jieba.lcut_fort_search("中华人民共和国是伟大的")
# 分词的结果为['中华','华人','人民','共和','共和国','中华人民共和国','是','伟大','的']

jieba.add_word(w):向分词词典增加一个新词w。如下:

jieba.lcut("真是绝绝子")  # 未添加“绝绝子”词组,分词的结果为['真是','绝','绝','子']
jieba.add_word("绝绝子")  # 添加“绝绝子”词组
jieba.lcut("真是绝绝子")  # 再次分词结果为['真是','绝绝子']

4.8.4 jieba的使用案例:文本词频统计

(1)问题分析

如何确定一篇文章中出现了哪些单词?哪些单词出现得最多?

首先要确定这篇文章是英文文本还是中文文本?

(2)英文文本:《Hamlet》

将英文文本《Hamlet》分词,并输出排序前10的单词与词频。代码如下:

# 定义一个函数,将文件处理为全文字的字符串
def getText():
    txt = open("hamlet.txt", "r").read()  # 以字符流形式读取
    txt = txt.lower()  # 全部转换为小写
    for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_{|}.~‘’':  # 遍历每个特殊符号,检查文本中的特殊字符
        txt = txt.replace(ch, " ")  # 将特殊字符替换为空格
    return txt

hamletTxt = getText()
words = hamletTxt.split()  # 将单词按空格分词为列表,即将文章中的每个单词读取为列表的元素
counts = {}  # 定义一个空字典,用来放置单词word与其词频的键值对
for word in words:  # 遍历每个单词
    counts[word] = counts.get(word,0) + 1  # word为键时,其出现次数为值,统计遇到的word的数量。counts.get(word,0)表示如果字典中没有该word,则表示是第一次遇到,取其值为0;
items = list(counts.items())  # 将字典转化为列表。counts.items()表示返回字典counts中所有的键值,以列表的形式。因此items是一个包含了许多个长度为2的小列表的大列表
items.sort(key = lambda x:x[1], reverse=True)  # 对列表items进行排序。key = lambda x:x[1]表示取每个小列表的第二个元素为排序值。reverse=True,表示按从大到小排。
for i in range(10):  #  循环前10个结果进行打印
    word,count = items[i]
    print("{0:<10}{1:>5}".format(word, count))  # {0:<10},表示取format中的第一个元素,左对齐,宽度为10字符;{1:>5},表示取format中的第二个元素,右对齐,宽度为5字符。

(3) 中文文本:《三国演义》

对于英文来说,可以直接将单词读取成列表进行分词,而对于中文来说是不能这样做的,这就需要用到jieba库。下面是将中文文本《三国演义》分词,并输出排序前10的人名及其词频。代码如下:

import jieba

txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
words = jieba.lcut(txt)
counts = {}
exculdes = ["将军","却说","荆州","二人","不可","不能","如此"]  # 设置排除列表,去除不是人名的项
for word in words:
    if len(word) == 1:  # 人物姓名通常大于一个字,不算自称“亮”的情况
        continue
    elif word=="诸葛亮" or word=="诸葛孔明" or word=="孔明曰":  # 排除同一个人的不同称号,下同,只举两个例子
        rword = "孔明"
    elif word=="关公" or word=="云长":
        rword = "关羽"
    else:
        rword = word
    counts[word] = counts.get(word, 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))

原文地址:https://blog.csdn.net/qq_29567799/article/details/143723648

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!