机器学习与数据挖掘

jieba分词

2018-02-24  本文已影响311人  领悟悟悟

参考:
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

代码示例 (关键词提取)

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 算法的关键词抽取

算法论文: 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.并行分词

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

形容词(1个一类,4个二类)
区别词(1个一类,2个二类)
连词(1个一类,1个二类)
副词(1个一类)
叹词(1个一类)
方位词(1个一类)
前缀(1个一类)
后缀(1个一类)
数词(1个一类,1个二类)
名词 (1个一类,7个二类,5个三类)

名词分为以下子类:

拟声词(1个一类)
介词(1个一类,2个二类)
量词(1个一类,2个二类)
代词(1个一类,4个二类,6个三类)
处所词(1个一类)
时间词(1个一类,1个二类)
助词(1个一类,15个二类)
动词(1个一类,9个二类)
标点符号(1个一类,16个二类)
字符串(1个一类,2个二类)
语气词(1个一类)
状态词(1个一类)
上一篇下一篇

猜你喜欢

热点阅读