jieba分词基本用法
1、jieba分词基本概述
- 它号称“做最好的Python中文分词组件”的jieba分词是python语言的一个中文分词包。
- 它有如下三种模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- 支持繁体分词
- 支持自定义词典,接下来看一个小 demo 如下:
import jieba
seg_list = jieba.cut('我来到北京清华大学',cut_all=True)
print('Full Mode:', '/ '.join(seg_list)) # 全模式
seg_list = jieba.cut("我来到北京清华大学",cut_all=False)
print ("\nDefault Mode:", "/ ".join(seg_list)) #精确模式
seg_list = jieba.cut("他来到了网易杭研大厦") #默认是精确模式
print ('\n新词识别:(如,杭研)',", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") #搜索引擎模式
print ("\n搜索引擎模式:",", ".join(seg_list))
执行结果:
Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
新词识别:(如,杭研) 他, 来到, 了, 网易, 杭研, 大厦
搜索引擎模式: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
2、添加自定义词典
-
开发者可以指定自己自定义的词典,以便包含jieba词库里没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率,通过用户自定义词典可以来增强歧义纠错能力。
-
用法:
jieba.load_userdict(file_name)
# file_name为自定义词典的路径 -
词典格式和dict.txt一样,一个词占一行;每一行分三部分,一部分为词语,另一部分为词频,最后为词性(可省略),用空格隔开
-
范例:
-
之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /
-
加载自定义词库后: 李小福 / 是 / (创新办) / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
-
可以参见jieba 官方提供的自定义词典,以及程序:https://github.com/fxsjy/jieba/blob/master/test/userdict.txt
-
用法示例:https://github.com/fxsjy/jieba/blob/master/test/test_userdict.py
-
示例:
云计算 5
李小福 2 nr
创新办 3 i
easy_install 3 eng
好用 300
韩玉赏鉴 3 nz
八一双鹿 3 nz
台中
凱特琳 nz
Edu Trust认证 2000
3、关键词提取
1、首先,通过如下代码导入下面的库
import jieba.analyse
其次:便可以使用,
jieba.analyse.extract_tags(sentence,topK)
- 其中,sentence 为待提取的文本
- topK 为返回的几个 TF/IDF 权重最大的关键词,默认值为20
示例代码:
import sys
sys.path.append('../')
import jieba
import jieba.analyse
from optparse import OptionParser
USAGE = "usage: python extract_tags.py [file name] -k [top k]"
parser = OptionParser(USAGE)
parser.add_option("-k", dest="topK")
opt, args = parser.parse_args()
if len(args) < 1:
print(USAGE)
sys.exit(1)
file_name = args[0]
if opt.topK is None:
topK = 10
else:
topK = int(opt.topK)
content = open(file_name, 'rb').read()
tags = jieba.analyse.extract_tags(content, topK=topK)
print(",".join(tags))
4、词性标注
- 标注句子分词后每个词的词性,采用和ictclas兼容的标记法
- 用法示例:
>>> import jieba.posseg as pseg
>>> words =pseg.cut("我爱北京天安门")
>>> for w in words:
... print w.word,w.flag
...
输出如下 :
我 r
爱 v
北京 ns
天安门 ns
pseg.cut("我爱北京天安门")
和 jieba.cut("我爱北京天安门")
都是中文分词的操作,但使用了不同的分词工具库。
-
pseg.cut
使用的是 Python 中的 jieba 库中的pseg
分词模块。该模块提供了基于词性标注的分词功能。它将中文文本分割成一个个独立的词语,并为每个词语标注词性。例如,对于 “我爱北京天安门” 这个句子,pseg.cut
可能会返回类似于[('我', 'r'), ('爱', 'v'), ('北京', 'ns'), ('天安门', 'ns')]
的结果,其中每个词语后面跟着一个表示词性的标记。 -
jieba.cut
是 jieba 库中的分词模块。它是一种常用的中文分词工具,使用了基于统计的分词算法。对于 “我爱北京天安门” 这个句子,jieba.cut
可能会返回类似于['我', '爱', '北京', '天安门']
的结果,其中每个元素都是一个独立的词语。
因此,pseg.cut
提供了更为详细的分词结果,包含了每个词语的词性信息,而 jieba.cut
则更加简洁,只返回分割后的词语列表。
你可以根据具体的需求选择使用哪种分词工具,需要注意的是,使用 pseg.cut
需要先安装 jieba 库,并且加载 pseg
模块。
5、并行分词
- 原理:将目标文本按行分隔后,把各行文本分配到多个python进程并行分词,然后归并结果,从而获得分词速度的可观提升
- 基于python自带的multiprocessing模块,
- 用法:
- jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数
- jieba.disable_parallel() # 关闭并行分词模式
代码示例:
import sys
import time
sys.path.append("../../")
import jieba
jieba.enable_parallel()
url = sys.argv[1]
content = open(url,"rb").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))
t2 = time.time()
tm_cost = t2-t1
log_f = open("1.log","wb")
log_f.write(words.encode('utf-8'))
print('speed %s bytes/second' % (len(content)/tm_cost))
6、Tokenize:返回词语在原文的起始位置
- 注意,输入参数只接受unicode
- 默认模式
result = jieba.tokenize(u'永和服装饰品有限公司')
for tk in result:
print ("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
输出:
word 永和 start: 0 end:2
word 服装 start: 2 end:4
word 饰品 start: 4 end:6
word 有限公司 start: 6 end:10
- 搜索模式
result = jieba.tokenize(u'永和服装饰品有限公司',mode='search')
for tk in result:
print ("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 永和 start: 0 end:2
word 服装 start: 2 end:4
word 饰品 start: 4 end:6
word 有限 start: 6 end:8
word 公司 start: 8 end:10
word 有限公司 start: 6 end:10
7、词性标注表
-
这里附上词性标注表,如下:
-
名词 (1个一类,7个二类,5个三类)
-
名词分为以下子类:
-
- n 名词
- nr 人名
- nr1 汉语姓氏
- nr2 汉语名字
- nrj 日语人名
- nrf 音译人名
- ns 地名
- nsf 音译地名
- nt 机构团体名
- nz 其它专名
- nl 名词性惯用语
- ng 名词性语素
-
时间词(1个一类,1个二类)
- t 时间词
- tg 时间词性语素
-
处所词(1个一类)
- s 处所词
-
方位词(1个一类)
- f 方位词
-
动词(1个一类,9个二类)
- v 动词
- vd 副动词
- vn 名动词
- vshi 动词“是”
- vyou 动词“有”
- vf 趋向动词
- vx 形式动词
- vi 不及物动词(内动词)
- vl 动词性惯用语
- vg 动词性语素
-
形容词(1个一类,4个二类)
- a 形容词
- ad 副形词
- an 名形词
- ag 形容词性语素
- al 形容词性惯用语
-
区别词(1个一类,2个二类)
- b 区别词
- bl 区别词性惯用语
-
状态词(1个一类)
- z 状态词
-
代词(1个一类,4个二类,6个三类)
- r 代词
- rr 人称代词
- rz 指示代词
- rzt 时间指示代词
- rzs 处所指示代词
- rzv 谓词性指示代词
- ry 疑问代词
- ryt 时间疑问代词
- rys 处所疑问代词
- ryv 谓词性疑问代词
- rg 代词性语素
-
数词(1个一类,1个二类)
- m 数词
- mq 数量词
-
量词(1个一类,2个二类)
- q 量词
- qv 动量词
- qt 时量词
-
副词(1个一类)
- d 副词
-
介词(1个一类,2个二类)
- p 介词
- pba 介词“把”
- pbei 介词“被”
-
连词(1个一类,1个二类)
- c 连词
- cc 并列连词
-
助词(1个一类,15个二类)
- u 助词
- uzhe 着
- ule 了 喽
- uguo 过
- ude1 的 底
- ude2 地
- ude3 得
- usuo 所
- udeng 等 等等 云云
- uyy 一样 一般 似的 般
- udh 的话
- uls 来讲 来说 而言 说来
- uzhi 之
- ulian 连 (“连小学生都会”)
-
叹词(1个一类)
- e 叹词
-
语气词(1个一类)
- y 语气词(delete yg)
-
拟声词(1个一类)
- o 拟声词
-
前缀(1个一类)
- h 前缀
-
后缀(1个一类)
- k 后缀
-
字符串(1个一类,2个二类)
- x 字符串
- xx 非语素字
- xu 网址URL
-
标点符号(1个一类,16个二类)
- w 标点符号
- wkz 左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <
- wky 右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >
- wyz 左引号,全角:“ ‘ 『
- wyy 右引号,全角:” ’ 』
- wj 句号,全角:。
- ww 问号,全角:? 半角:?
- wt 叹号,全角:! 半角:!
- wd 逗号,全角:, 半角:,
- wf 分号,全角:; 半角: ;
wn 顿号,全角:、 - wm 冒号,全角:: 半角: :
- ws 省略号,全角:…… …
- wp 破折号,全角:—— -- ——- 半角:—
- wb 百分号千分号,全角:% ‰ 半角:%
- wh 单位符号,全角:¥ $ £ ° ℃ 半角 $