jieba结巴分词器

安装:
pip install jieba

相关知识:
三种分词模式:
1. 全模式 :把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。这种全模式,会根据字典,将所有出现的字词全部匹配划分,所以会出现重复,这不是我们需要的。
2.精确模式 :试图将句子最精确地切开,适合文本分析(类似LTP分词方式),这种精确模式就比较接近我们想要的了。
3.搜索引擎模式:在精确模式的基础上对长词再次切分,提高召回率,适合用于搜索引擎分词。这种搜索引擎模式也不错,更加细化了。

载入自定义词典:
开发者可以自定义词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。
用法:
jieba.load_userdict(file_name)
词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词、数字(代表词频,越大越容易匹配到,但不要过大,可省略)、字母(代表词性,可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
词频省略时使用自动计算,能保证分出该词的词频。

词性表:

词性 表示符号
形容词 a 形容词;ad 副形词;an 名形词;ag 形容词性语素;al 形容词性惯用语
区别词 b 区别词;bl 区别词性惯用语
连词 c 连词;cc 并列连词
副词 d 副词
叹词 e 叹词
方位词 f 方位词
前缀 h 前缀
后缀 k 后缀
数词 m 数词;mq 数量词
名词 n 名词;nr 人名;nr1 汉语姓氏;nr2 汉语名字;nrj 日语人名;nrf 音译人名;ns 地名;nsf 音译地名;nt 机构团体名;nz 其它专名;nl 名词性惯用语;ng 名词性语素
拟声词 o 拟声词
介词 p 介词;pba 介词“把”;pbei 介词“被”
量词 q 量词;qv 动量词;qt 时量词
代词 r 代词;rr 人称代词;rz 指示代词;rzt 时间指示代词;rzs 处所指示代词;rzv 谓词性指示代词;ry 疑问代词;ryt 时间疑问代词;rys 处所疑问代词;ryv 谓词性疑问代词;rg 代词性语素
处所词 s 处所词
时间词 t 时间词;tg 时间词性语素
助词 u 助词;uzhe 着;ule 了 喽;uguo 过;ude1 的 底;ude2 地;ude3 得;usuo 所;udeng 等 等等 云云;uyy 一样 一般 似的 般;udh 的话;uls 来讲 来说 而言 说来;uzhi 之;ulian 连 (“连小学生都会”)
动词 v 动词;vd 副动词;vn 名动词;vshi 动词“是”;vyou 动词“有”;vf 趋向动词;vx 形式动词;vi 不及物动词(内动词);vl 动词性惯用语;vg 动词性语素
标点符号 w 标点符号;wkz 左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { < wky 右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >;wyz 左引号,全角:“ ‘ 『;wyy 右引号,全角:” ’ 』;wj 句号,全角:。;ww 问号,全角:? 半角:?;wt 叹号,全角:! 半角:!;wd 逗号,全角:, 半角:,;wf 分号,全角:; 半角: ;;wn 顿号,全角:、;wm 冒号,全角:: 半角: :;ws 省略号,全角:…… …;wp 破折号,全角:—— -- ——- 半角:— ----;wb 百分号千分号,全角:% ‰ 半角:%;wh 单位符号,全角:¥ $ £ ° ℃ 半角:$
字符串 x 字符串;xx 非语素字;xu 网址URL
语气词 y 语气词(delete yg)
状态词 z 状态词

调整词典:
1、使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
2、使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

例1:

import jieba
sent = '天善智能是一个专注于商业智能BI、数据分析、数据挖掘和大数据技术领域的技术社区 www.hellobi.com 。内容从最初的商业智能 BI 领域也扩充到了数据分析、数据挖掘和大数据相关 的技术领域,包括 R、Python、SPSS、Hadoop、Spark、Hive、Kylin等,成为一个专注于数据领域的垂直社区。天善智能致力于构建一个基于数据领域的生态圈,通过社区链接一切 与数据相关的资源:例如数据本身、人、数据方案供应商和企业,与大家一起共同努力推动大数据、商业智能BI在国内的普及和发展。'
#全模式
wordlist = jieba.cut(sent, cut_all = True)
print('|'.join(wordlist))

#结果为:
天|善|智能|是|一个|专注|于|商业|商业智能|智能|BI||数据|数据分析|分析|||数据|数据挖掘|挖掘|和|大数|数据|技术|领域|的|技术|技术社|社区||www|hellobi|com|||内容|从|最初|的|商业|商业智能|智能||BI||领域|也|扩充|充到|了|数据|数据分析|分析|||数据|数据挖掘|挖掘|和|大数|数据|相关|||的|技术|领域|||包括||R|Python|SPSS|Hadoop|Spark|Hive|Kylin|等|||成为|一个|专注|于|数据|领域|的|垂直|社区|||天|善|智能|致力|致力于|构建|一个|基于|数据|领域|的|生态|生态圈|||通过|社区|链接|一切|||与|数据|相关|的|资源|||例如|如数|数据|本身|||人|||数据|方案|供应|供应商|和|企业|||与|大家|一起|共同|共同努力|努力|力推|推动|大数|数据|||商业|商业智能|智能|BI|在|国内|的|普及|和|发展||

#精确模式
wordlist2 = jieba.cut(sent)
print('|'.join(wordlist2))

#结果为:
天善|智能|是|一个|专注|于|商业智能|BI|、|数据分析|、|数据挖掘|和|大|数据|技术|领域|的|技术|社区| |www|.|hellobi|.|com| |。|内容|从|最初|的|商业智能| |BI| |领域|也|扩充|到|了|数据分析|、|数据挖掘|和|大|数据|相关| |的|技术|领域|,|包括| |R|、|Python|、|SPSS|、|Hadoop|、|Spark|、|Hive|、|Kylin|等|,|成为|一个|专注|于|数据|领域|的|垂直|社区|。|天善|智能|致力于|构建|一个|基于|数据|领域|的|生态圈|,|通过|社区|链接|一切| |与|数据|相关|的|资源|:|例如|数据|本身|、|人|、|数据|方案|供应商|和|企业|,|与|大家|一起|共同努力|推动|大|数据|、|商业智能|BI|在|国内|的|普及|和|发展|。

#搜索引擎模式
wordlist3 = jieba.cut_for_search(sent)
print('|'.join(wordlist3))

#结果为
天善|智能|是|一个|专注|于|商业|智能|商业智能|BI|、|数据|分析|数据分析|、|数据|挖掘|数据挖掘|和|大|数据|技术|领域|的|技术|社区| |www|.|hellobi|.|com| |。|内容|从|最初|的|商业|智能|商业智能| |BI| |领域|也|扩充|到|了|数据|分析|数据分析|、|数据|挖掘|数据挖掘|和|大|数据|相关| |的|技术|领域|,|包括| |R|、|Python|、|SPSS|、|Hadoop|、|Spark|、|Hive|、|Kylin|等|,|成为|一个|专注|于|数据|领域|的|垂直|社区|。|天善|智能|致力|致力于|构建|一个|基于|数据|领域|的|生态|生态圈|,|通过|社区|链接|一切| |与|数据|相关|的|资源|:|例如|数据|本身|、|人|、|数据|方案|供应|供应商|和|企业|,|与|大家|一起|共同|努力|共同努力|推动|大|数据|、|商业|智能|商业智能|BI|在|国内|的|普及|和|发展|。

发现新问题–增加用户自定义词典:
回看精确模式的结果,发现有些新词汇或者专业词汇,例如:天善智能、大数据,这些不应该再被切分,所以在默认词典的基础上,可以加载自定义的词典。

#使用自定义字典
jieba.load_userdict('c:/ProgramData/Anaconda3/Lib/site-packages/jieba/mydict.txt')
Wordlist4 = jieba.cut(sent)
print('|'.join(wordlist4))

#结果为
天善智能|是|一个|专注|于|商业智能|BI|、|数据分析|、|数据挖掘|和|大数据|技术|领域|的|技术|社区| |www|.|hellobi|.|com| |。|内容|从|最初|的|商业智能| |BI| |领域|也|扩充|到|了|数据分析|、|数据挖掘|和|大数据|相关| |的|技术|领域|,|包括| |R|、|Python|、|SPSS|、|Hadoop|、|Spark|、|Hive|、|Kylin|等|,|成为|一个|专注|于|数据|领域|的|垂直|社区|。|天善智能|致力于|构建|一个|基于|数据|领域|的|生态圈|,|通过|社区|链接|一切| |与|数据|相关|的|资源|:|例如|数据|本身|、|人|、|数据|方案|供应商|和|企业|,|与|大家|一起|共同努力|推动|大数据|、|商业智能|BI|在|国内|的|普及|和|发展|。

例2:

#!/usr/bin/env python
# -*-coding=utf-8-*-

"""
为保证数据准确性需进行以下操作(注意按照以下顺序):
1、汉字繁简体统一
2、字母大小写统一
3、准确分词(注意'3d max'带空格或特殊符号的单词)
4、同义词替换
5、去除停用词
6、去除每条数据中的重复分词
7、去除多余标点符号
"""

import pandas as pd
import jieba
import re
from langconv import * 			#汉字繁简体转换,需下载langconv.py和zh_wiki.py文件,并将其放在与代码同一目录下
from tongyici import *			#引用自定义同义词字典,tongyici.py需与代码在同一目录下
from collections import Counter	#collections模块提供了一些有用的集合类,Counter是一个简单的计数器

# 转换繁体到简体
def fan_to_jian(line):
    line = Converter('zh-hans').convert(line)
    line.encode('utf-8')
    return line

# 添加自定义分词
def add_word(list):
	for i in list:
		jieba.add_word(i)

# 删除自定义分词
def del_word(list):
	for i in list:
		jieba.del_word(i)

# 用jieba对商品名称进行文本分析
add_ci = ['3d max', 'altium designer', 'mac os', 'spring boot', 'android studio', 'deep learning ai', 'machine learning', 'visual c++', 'visual studio', 'cloud docker', 'atey ghalian', 'john park']
del_ci = ['视频教程', '自学教材']
add_word(add_ci)
del_word(del_ci)						#或jieba.add_word('视频教程', 0)动态修改词典,使之分成视频和教程2个词
jieba.re_han_default = re.compile('(.+)', re.U)	#用于解决中间带空格或其他特殊符号的单词分成多个词的问题
jieba.load_userdict('c:/ProgramData/Anaconda3/Lib/site-packages/jieba/mydict.txt')						#导入自定义字典
file = pd.read_excel(r'c:\users\administrator\desktop\商品信息v2.0版.xlsx')  							#读取本地文件
title = list(file['商品名称'])			#商品名称转化成list
title_s = []							#商品名称分词list
for line in title:
	text = fan_to_jian(line).lower()#将繁体字转换成简体字并将大写字母转换成小写
	title_cut = jieba.lcut(text)		#分词成list,lcut()函数返回list
	#替换同义词
	new_cut = []						#替换同义词后的新数据
	for fenci in title_cut:				#替换同义词
		if fenci in dian:				#判断是否在字典中
			val = dian[fenci]			#获取同义词的统一词
			new_cut.append(val)
		else:
			new_cut.append(fenci)
	title_s.append(new_cut)
# print(title_s)
#导入停用词
stopwords = ['教程']						#停用词list,可将停用词表中没有的先加入进去
for line in open(r'e:/Python/mypy/stopwords/中英文.txt', 'r+', encoding='utf-8'):
	stopwords.append(line.strip())#将停用词字典内容写入停用词list中备用
#剔除商品名称分词中的停用词
title_clear = []						#剔除停用词后的商品名称分词
for line in title_s:
	line_clear = []						#每个商品剔除停用词后的商品名称分词
	for word in line:
		if word not in stopwords and word.strip():	#判断分词不在停用词字典中,并且不为空
			line_clear.append(word.strip())	#去除词两侧的空格
	title_clear.append(line_clear)
# print(title_clear)
#去除每个商品名称中的重复分词,提高准确率
title_clear2 = []
for line in title_clear:
	line_clear2 = []
	for word in line:
		if word not in line_clear2:
			line_clear2.append(word.strip())
	title_clear2.append(line_clear2)
# print(title_clear2)
# 去除标点符号后将所有商品名称分词放入同一个list中
allwords = []
r = "[^0-9A-Za-z\u4e00-\u9fa5]"				#非数字、字母和汉字
for line in title_clear2:
	for word in line:
		ci = re.sub(r, '', word).strip()	#去除标点符号
		if ci:								#ci若为空则原word为标点符号,如果ci不为空,则进行下步
			allwords.append(ci)	
# print(allwords)
#把allwords列表转为DataFrame数据,类似表格
df_allwords = pd.DataFrame({'allwords':allwords})	#前面一个allwords为columns列的名称
# print(df_allwords)
#对过滤去重的词汇进行分类汇总
#value_counts()的作用是统计表格某列有多少不同值,并计算每个不同值在该列中有多少重复值,需要指定对哪一列或行使用。
#reset_index()的作用是重新设置DataFrame的连续行索引index。
word_count = df_allwords.allwords.value_counts().reset_index()
# print(word_count)
word_count.columns = ['word', 'count']		#重命名列的名称
print(word_count)
# 获取所有分词及出现次数(按出现次数降序排列),需引用from collections import Counter
c = Counter(allwords).most_common()			#most_common(200)获取出现频率前200的分词及出现次数
# print(c)

常见问题:
1、jieba自带字典无法分开词的处理方法,如(‘视频教程’、‘javaweb’):
自带字典中有‘视频’、‘教程’和‘视频教程’时,可在程序中动态临时删除‘视频教程’,从而达到分开‘视频教程’的目的,如下:

jieba.del_word('视频教程')					#或jieba.add_word('视频教程', 0)动态修改词典,使之分成视频和教程2个词
jieba.suggest_freq('视频教程', True)			#suggest_freq()不能分解

自带字典中没有‘java’、‘web’和‘javaweb’时,可在程序中动态临时添加‘java’和‘web’,从而达到分开‘javaweb’的目的(建议在自定义字典中添加java和web,以便下次使用),如下:

jieba.add_word('java', 3, 'n')
jieba.add_word('web', 3, 'n')				#自带字典无java、web和javaweb,此2行可使javaweb分成java和web两个词,也可在自定义字典中添加java和web

2、中间带空格或其他特殊符号的单词分成多个词的问题:

#代码中添加以下2行即可
jieba.add_word('3D max', 3, 'n')
jieba.re_han_default = re.compile('(.+)', re.U)	#此2行用于解决中间带空格的单词分成多个词的问题

如果以上方法仍不行,则可尝试以下方法:
可以通过修改jieba的init.py文件中的几个正则表达式来解决这个问题。用户词典中词性用@@分隔。
1. 搜索

re_han_default = re.compile(“([\u4E00-\u9FD5a-zA-Z0-9+#&._]+)”, re.U) 

改成

re_han_default = re.compile(“(.+)”, re.U) 

2. 搜索

re_userdict = re.compile(‘^(.+?)( [0-9]+)?( [a-z]+)?$’, re.U) 

改成

re_userdict = re.compile(‘^(.+?)(\u0040\u0040[0-9]+)?(\u0040\u0040[a-z]+)?$’, re.U) 

3. 搜索

word, freq = line.split(’ ‘)[:2] 

改成

word, freq = line.split(‘\u0040\u0040’)[:2] 

4. 补充:若用全模式则继续改。
搜索

re_han_cut_all = re.compile(“([\u4E00-\u9FD5]+)”, re.U) 

改成

re_han_cut_all = re.compile(“(.+)”, re.U)

猜你喜欢

转载自blog.csdn.net/qq_38882327/article/details/89085235