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)!