python第三方库--jieba库
中文分词第三方库,用于将文本分割为单个词语利用一个中文词库,确定中文字符之间的关联概率,关联概率大的组成词组形成分词结果对于某一段文本,如果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()
函数进行加载
词典文件的内容为:
词语 | 词频 | 词性 |
---|---|---|
周亚楠 | 3 | n |
word1 | num | adj |
… | … | … |
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)
运行结果
更多推荐
所有评论(0)