python第三方库--jieba库

基础篇

基本介绍

中文分词第三方库,用于将文本分割为单个词语

分词原理:
利用一个中文词库,确定中文字符之间的关联概率,关联概率大的组成词组形成分词结果

分词模式

jieba库分词具有三种模式

分词模式特点
精确模式将文本精确分开,不存在冗余单词,适合文本分析
全模式得到文本中所有可能的词语,有冗余,不能解决歧义
搜索引擎模式精确模式基础上对长词再次切分,有冗余

常用函数

函数描述返回结果类型
jieba.lcut(s)精确模式列表
jieba.lcut(s,cut_all)全模式列表
jieba.lcut_for_search(s)搜索引擎模式列表
jieba.add_word(w)向分词字典中添加新词

函数应用举例

在这里插入图片描述

实例1:唐诗三百文本词频分析

文本资源链接:唐诗三百(纯内容)

# coding:utf-8
import jieba
content=open('唐诗三百.txt','r',encoding='gbk').read()
words=jieba.lcut(content)
counts={}		# 建立一个字典,键为分词名称,值为其对应的词频
for word in words:
    if word=='一作':	# “一作”为唐诗的注释,并非唐诗内容
        continue
    elif len(word)==1:		# 去除标点和空格等干扰
        continue
    else:
        counts[word]=counts.get(word,0)+1		# 等号左边用于设置字典键对应的值,右边get()函数表示有键对应的值则取其值,没有则取0
items=list(counts.items())		# 将字典中的键和值取出并转化为列表,便于排序
items.sort(key=lambda x:x[1],reverse=True)		# 升序排序,key表示取出每个元素中的第二项(即键对应的值)作为比较依据
for i in range(20):	# 输出升序的前二十项
    word,count=items[i]
    print(word,count)

执行结果
在这里插入图片描述

进阶篇

230213更新

自定义词典

对于某一段文本,如果jieba库的某些分词结果不太令人满意,可以通过自定义进行修改,下面来看一个例子

import jieba
text='周亚楠是一位著名的歌手'
word_list=jieba.lcut(text,cut_all=True)
final_words=list(word_list)
print(final_words)
>>> ['周','亚','楠', '是', '一位', '著名', '的', '歌手']

上面的问题是,一个人名被分为了多个词,我们显然不想看到这样的结果,使用下面的方法解决,建立一个词典文件mydict.txt,使用jieba.load_userdict()函数进行加载
词典文件的内容为:

词语词频词性
周亚楠3n
word1numadj
jieba.load_userdict(mydict.txt)
word_list1=jieba.cut(text,cut_all=True)
final_words=list(word_list)
print(final_words)
>>> ['周亚楠', '是', '一位', '著名', '的', '歌手']

词性标注

为分词结果中的每一个词标注正确的词性,有助于消除歧义并强化基于单词的特征,可以使用jieba中的posseg.cut()函数实现该功能

import jieba.posseg as posseg
text='周亚楠是一位著名的歌手'
word_list=posseg.cut(text)
final_words=list(word_list)
print(final_words)

>>> [pair('周亚楠', 'nr'), pair('是', 'v'), pair('一位', 'm'), pair('著名', 'a'), pair('的', 'uj'), pair('歌手', 'n')]

常见词性表
在这里插入图片描述

断词位置

jieba.Tokenizer()函数返回每个分词的起始和终止位置

import jieba
text='周亚楠是一位著名的歌手'
word_list=jieba.tokenize(text)
final_words=list(word_list)
print(final_words)
>>> [('周亚楠', 0, 3), ('是', 3, 4), ('一位', 4, 6), ('著名', 6, 8), ('的', 8, 9), ('歌手', 9, 11)]

关键词抽取

jieba.analyse.extract_tags()函数基于TF-IDF算法计算文本中词语的权重,进行关键词提取,给每一个分词标出IDF分数比重,并按照IDF分数降序的形式返回分词列表

jieba.analyse.extract_tags(lines,topK=20,withWeight=True,allowPOS=())

主要参数

参数描述
lines文本
topK=20返回IDF分数的TOP20
withWeight是否 返回关键词权重值
allowPOS词性过滤列表
import jieba.analyse
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei'

text1='2月7日晚,中国选手任子威获得北京冬奥会短道速滑男子1000米金牌。任子威因为在训练和比赛中有一股子勇往直前的精神和冲劲,在国家队又被教练和队友们称为“大象”'
keyword_list=jieba.analyse.extract_tags(text1,topK=20,withWeight=True,allowPOS=())
keys=[]
values=[]
for key,value in keyword_list:
    keys.append(key)
    values.append(value)
plt.bar(x=keys,height=values)
plt.xticks(rotation=90)
plt.xlabel('关键词')
plt.ylabel('IDF分数')
plt.show()

运行结果
在这里插入图片描述

可通过jieba.analyse.set_idf_path(mydict.txt)创建一个字典来自定义某些词的IDF分数,字典文件的内容

词语权重
任子威30

停止词

  • 停止词指的是一些完全没用或者没有意义的词,比如标点符号、部分连词、部分助词、语气词、介词等等,在使用jieba库对某个文本进行分类时,这些停止词会占大量的篇幅,干扰我们对文本的分析,这是我们就需要采用一些特殊的手段来取去除这些停止词
  • 常见的停止词有:
    中文停止词表:cn_stopwords.txt
    哈工大停止词表:hit_stopwords.txt
    百度停止词表:baidu_stopwords.txt
    下载地址:【https://github.com/goto456/stopwords

实例2:三国演义文本词频分析

下面我们来对三国演义的文本进行简单的分析,三国演义文本获取

import requests
resp=requests.get('https://python123.io/resources/pye/threekingdoms.txt')
with open('./data/三国演义.txt','w',encoding='utf-8') as f:
    f.write(resp.text)

文本分析

import jieba

text = open('./data/三国演义.txt', encoding='utf-8').read()
word_list = jieba.lcut(text)

counts = {}
for word in word_list:
    counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(20):
    word, count = items[i]
    print(word, count)

运行结果

在这里插入图片描述

从上面的结果我们可以看出,jieba给出的分词结果中词频靠前的几乎都是停止词,我们需要对其进行过滤,思路是:下载万停止词文件后,加载出来形成一个python列表,每次进行计数之前先判断当前词是否在停止词列表中,如果不在就继续进行计数

# 加入停止词后的程序
import jieba

text = open('./data/三国演义.txt', encoding='utf-8').read()
stop_word_file=open('./data/cn_stopwords.txt',encoding='utf-8')

# strip()函数用于去除字符串两端的空格
stop_list=[word.strip() for  word in stop_word_file]
word_list = jieba.lcut(text)

counts = {}
for word in word_list:
    if word not in stop_list and len(word)!=1:
        counts[word] = counts.get(word, 0) + 1
    else:continue
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(20):
    word, count = items[i]
    print(word, count)

运行结果
在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夺笋123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值