jieba分词

参考:
Python 中文分词组件 jiaba
Python中文分词 jieba 十五分钟入门与进阶
jieba完整文档
$好玩的分词——python jieba分词模块的基本用法

支持三种分词模式:
  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

主要功能:

1. 分词
  • jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型(是否开启HMM进行中文分词)
  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语,或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
cut(self, sentence, cut_all=False, HMM=True)  # 默认精确模式
cut_for_search(self, sentence, HMM=True) # 搜索引擎模式
    import jieba
    jieba.add_word('中国科学院')

    seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", cut_all=False) # 精确模式
    print(" ".join(seg_list))

    seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", cut_all=True) # 全模式
    print(" ".join(seg_list))

    seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") #搜索引擎模式
    print(" ".join(seg_list))
小明 硕士 毕业 于 中国科学院 计算所 , 后 在 日本京都大学 深造
小 明 硕士 毕业 于 中国 中国科学院 科学 科学院 学院 计算 计算所   后 在 日本 日本京都大学 京都 京都大学 大学 深造
小明 硕士 毕业 于 中国 科学 学院 科学院 中国科学院 计算 计算所 , 后 在 日本 京都 大学 日本京都大学 深造
note:
  全模式与搜索引擎模式下自己添加的词不起作用
2. 添加自定义词典

载入词典:

  • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
  • 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
  • 词频省略时使用自动计算的能保证分出该词的词频。

官方范例:

调整词典:

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

案例:

seg_list = jieba.cut("我们中出了一个叛徒", cut_all=False) 
print(" ".join(seg_list))

jieba.del_word('中出')
seg_list = jieba.cut("我们中出了一个叛徒", cut_all=False) 
print(" ".join(seg_list))

我们 中出 了 一个 叛徒
我们 中 出 了 一个 叛徒
jieba.add_word('中出')
seg_list = jieba.cut("我们中出了一个叛徒", cut_all=False) 
print(" ".join(seg_list))

jieba.suggest_freq(('中','出'),tune=True)
seg_list = jieba.cut("我们中出了一个叛徒", cut_all=False) 
print(" ".join(seg_list))

我们 中出 了 一个 叛徒
我们 中 出 了 一个 叛徒
seg_list = jieba.cut("我们中出了一个叛徒", cut_all=False) 
print(" ".join(seg_list))

jieba.suggest_freq('一个叛徒',tune=True)
seg_list = jieba.cut("我们中出了一个叛徒", cut_all=False) 
print(" ".join(seg_list))

我们 中 出 了 一个 叛徒
我们 中 出 了 一个叛徒
3.关键词提取
基于 TF-IDF 算法的关键词抽取

import jieba.analyse

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
  • sentence 为待提取的文本
  • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
  • withWeight 为是否一并返回关键词权重值,默认值为 False
  • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件

代码示例 (关键词提取)

https://github.com/fxsjy/jieba/blob/master/test/extract_tags.py

关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径

关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径

关键词一并返回关键词权重值示例

import jieba
from jieba import analyse

text_full_path = r'C:\Users\jjj\Desktop/123.txt' #设置要分析的文本路径
text = open(text_full_path, encoding='utf-8').read()
for key in analyse.extract_tags(text,50, withWeight=True):
# 使用jieba.analyse.extract_tags()参数提取关键字,默认参数为50
    print(key)
    # 设置输出编码为utf-8不然在因为win下控制台默认中文字符集为gbk,所以会出现乱码
    # 当withWeight=True时,将会返回number类型的一个权重值(TF-IDF)

基于 TextRank 算法的关键词抽取
  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
  • jieba.analyse.TextRank() 新建自定义 TextRank 实例

算法论文: TextRank: Bringing Order into Texts

基本思想:
  1. 将待抽取关键词的文本进行分词
  2. 以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
  3. 计算图中节点的PageRank,注意是无向带权

使用示例:

test/demo.py

4. 词性获取
  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
import jieba.posseg as pseg
words = pseg.cut('我爱北京天安门')
for w in words:
    print(w.word, w.flag)

我 r
爱 v
北京 ns
天安门 ns
5.并行分词
  • 原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升

  • 基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows

  • 用法:

    • jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数
    • jieba.disable_parallel() # 关闭并行分词模式
  • 例子:https://github.com/fxsjy/jieba/blob/master/test/parallel/test_file.py

  • 实验结果:在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。

  • 注意:并行分词仅支持默认分词器 jieba.dtjieba.posseg.dt

附:结巴分词词性对照表(按词性英文首字母排序)

形容词(1个一类,4个二类)
  • a 形容词

  • ad 副形词

  • an 名形词

  • ag 形容词性语素

  • al 形容词性惯用语

区别词(1个一类,2个二类)
  • b 区别词

  • bl 区别词性惯用语

连词(1个一类,1个二类)
  • c 连词

  • cc 并列连词

副词(1个一类)
  • d 副词
叹词(1个一类)
  • e 叹词
方位词(1个一类)
  • f 方位词
前缀(1个一类)
  • h 前缀
后缀(1个一类)
  • k 后缀
数词(1个一类,1个二类)
  • m 数词

  • mq 数量词

名词 (1个一类,7个二类,5个三类)

名词分为以下子类:

  • n 名词

  • nr 人名

  • nr1 汉语姓氏

  • nr2 汉语名字

  • nrj 日语人名

  • nrf 音译人名

  • ns 地名

  • nsf 音译地名

  • nt 机构团体名

  • nz 其它专名

  • nl 名词性惯用语

  • ng 名词性语素

拟声词(1个一类)
  • o 拟声词
介词(1个一类,2个二类)
  • p 介词

  • pba 介词“把”

  • pbei 介词“被”

量词(1个一类,2个二类)
  • q 量词

  • qv 动量词

  • qt 时量词

代词(1个一类,4个二类,6个三类)
  • r 代词

  • rr 人称代词

  • rz 指示代词

  • rzt 时间指示代词

  • rzs 处所指示代词

  • rzv 谓词性指示代词

  • ry 疑问代词

  • ryt 时间疑问代词

  • rys 处所疑问代词

  • ryv 谓词性疑问代词

  • rg 代词性语素

处所词(1个一类)
  • s 处所词
时间词(1个一类,1个二类)
  • t 时间词

  • tg 时间词性语素

助词(1个一类,15个二类)
  • u 助词

  • uzhe 着

  • ule 了 喽

  • uguo 过

  • ude1 的 底

  • ude2 地

  • ude3 得

  • usuo 所

  • udeng 等 等等 云云

  • uyy 一样 一般 似的 般

  • udh 的话

  • uls 来讲 来说 而言 说来

  • uzhi 之

  • ulian 连 (“连小学生都会”)

动词(1个一类,9个二类)
  • v 动词

  • vd 副动词

  • vn 名动词

  • vshi 动词“是”

  • vyou 动词“有”

  • vf 趋向动词

  • vx 形式动词

  • vi 不及物动词(内动词)

  • vl 动词性惯用语

  • vg 动词性语素

标点符号(1个一类,16个二类)
  • w 标点符号

  • wkz 左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <

  • wky 右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >

  • wyz 左引号,全角:“ ‘ 『

  • wyy 右引号,全角:” ’ 』

  • wj 句号,全角:。

  • ww 问号,全角:? 半角:?

  • wt 叹号,全角:! 半角:!

  • wd 逗号,全角:, 半角:,

  • wf 分号,全角:; 半角: ;

  • wn 顿号,全角:、

  • wm 冒号,全角:: 半角: :

  • ws 省略号,全角:…… …

  • wp 破折号,全角:—— -- ——- 半角:--- ----

  • wb 百分号千分号,全角:% ‰ 半角:%

  • wh 单位符号,全角:¥ $ £ ° ℃ 半角:$

字符串(1个一类,2个二类)
  • x 字符串

  • xx 非语素字

  • xu 网址URL

语气词(1个一类)
  • y 语气词(delete yg)
状态词(1个一类)
  • z 状态词
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容