当前位置:   article > 正文

【自然语言处理】jieba分词模块主要

【自然语言处理】jieba分词模块主要

0.安装

法1:Anaconda Prompt下输入 conda install jieba
法2:Terminal下输入 pip3 install jieba

1.特点

  • 支持繁体分词
  • 支持自定义词典

2.主要功能

2.1分词

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

cut(sentence, cut_all=False, HMM=True) 返回生成器,遍历生成器即可获得分词的结果
lcut(sentence) 返回分词列表
jieba.cut:接受三个输参数:需要分词的字符串;cut_all参数来控制是否采用全模式(默认精确模式);HMM 参数用来控制是否使用 HMM 模型。
jieba.cut_for_search:接受两个参数:需要分词的字符串;使用使用 HMM 模型,该方法适合用于搜索引擎的构建倒排索引的分词,粒度比较细。
注意:

待分词的字符串可以是 unicode 、 UTF8 、GBK字符串 。
jieba.cutjieba.cut_for_search 返回的结构都是一个可迭代的 generator ,用for循环来获取分词后的词语(unicode)。
jieba.lcutjieba.lcut_for_search 直接返回list。

import jieba

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

打印结果

Full Mode:/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode:/ 来到/ 北京/ 清华大学
他, 来到,, 网易, 杭研, 大厦
小明, 硕士, 毕业,, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所,,,, 日本, 京都, 大学, 日本京都大学, 深造
  • 1
  • 2
  • 3
  • 4

2.2词性标注

​jieba.posseg
  • 1
import jieba.posseg as jp
sentence = '我爱Python数据分析'
posseg = jp.cut(sentence)
for i in posseg:
    print(i.__dict__)
    # print(i.word, i.flag)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

打印结果

{‘word’: ‘我’, ‘flag’: ‘r’}
{‘word’: ‘爱’, ‘flag’: ‘v’}
{‘word’: ‘Python’, ‘flag’: ‘eng’}
{‘word’: ‘数据分析’, ‘flag’: ‘l’}
  • 1
  • 2
  • 3
  • 4
标注解释标注解释标注解释
a形容词mq数量词tg时语素
ad副形词n名词u助词
ag形语素ng例:义 乳 亭ud例:得
an名形词nr人名ug例:过
b区别词nrfg也是人名uj例:的
c连词nrt也是人名ul例:了
d副词ns地名uv例:地
df例:不要nt机构团体uz例:着
dg副语素nz其他专名v动词
e叹词o拟声词vd副动词
f方位词p介词vg动语素
g语素q量词vi例:沉溺于 等同于
h前接成分r代词vn名动词
i成语rg例:兹vq例:去浄 去过 唸过
j简称略语rr人称代词x非语素字
k后接成分rz例:这位y语气词
l习用语s处所词z状态词
m数词t时间词zg例:且 丗 丟

2.3词语出现的位置

jieba.tokenize(sentence)

import jieba
sentence = '订单数据分析'
generator = jieba.tokenize(sentence)
for position in generator:
    print(position)
  • 1
  • 2
  • 3
  • 4
  • 5

打印结果

(‘订单’, 0, 2)
(‘数据分析’, 2, 6)
  • 1
  • 2

2、词典

2.1、默认词典
import jieba, os, pandas as pd
# 词典所在位置
print(jieba.__file__)
jieba_dict = os.path.dirname(jieba.__file__) + r'\dict.txt'
# 读取字典
df = pd.read_table(jieba_dict, sep=' ', header=None)[[0, 2]]
print(df.head())
# 转字典
dt = dict(df.values)
print(dt.get('暨南大学'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

2.2添词和删词

往词典添词 add_word(word, freq=None, tag=None)
往词典删词,等价于add_word(word, freq=0)
del_word(word)
使用add_worddel_word 可以动态修改词典。

2.3加载自定义词典

  • 指定自己自定义的词典,来补充jieba词库里没有的词。
  • 用法:jieba.load_userdict(file_name) file_name 文件对象或路径
  • 词典格式,一个词占一行;一行分为三部分:**词语、词频(可省略)、词性(可省略)**,用空格隔开,顺序不能颠倒。file_name 若为路径或二进制打开,文件必须为UTF-8编码。
# userdict.text文件
云计算 5
李小福 2 nr

import jieba
jieba.load_userdict("userdict.txt") # 加载字典
jieba.add_word('八一双鹿')  # 加载单词
demo = '李小福是创新办主任也是云计算方面的专家; 什么是八一双鹿'
words = jieba.cut(demo)
print('/'.join(words))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.4、使单词中的字符连接或拆分

suggest_freq(segment, tune=False)

import jieba
sentence = '上穷碧落下黄泉,两处茫茫皆不见'
print('修正前:', ' | '.join(jieba.cut(sentence)))
jieba.suggest_freq(('落', '下'), True)
print('修正后:', ' | '.join(jieba.cut(sentence)))
  • 1
  • 2
  • 3
  • 4
  • 5

打印结果

修正前: 上穷 || 落下 | 黄泉 || 两处 | 茫茫 || 不见
修正后: 上穷 | 碧落 || 黄泉 || 两处 | 茫茫 || 不见
  • 1
  • 2

3、jieba分词原理

  1. 基于词典,对句子进行词图扫描,生成所有成词情况所构成的有向无环图(Directed Acyclic Graph)
  2. 根据DAG,反向计算最大概率路径(动态规划算法;取对数防止下溢,乘法运算转为加法)
  3. 根据路径获取最大概率的分词序列
import jieba
sentence = '中心小学放假'
DAG = jieba.get_DAG(sentence)
print(DAG)
route = {}
jieba.calc(sentence, DAG, route)
print(route)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
DAG
{0: [0, 1, 3], 1: [1], 2: [2, 3], 3: [3], 4: [4, 5], 5: [5]}
最大概率路径
{6: (0, 0), 5: (-9.4, 5), 4: (-12.6, 5), 3: (-20.8, 3), 2: (-22.5, 3), 1: (-30.8, 1), 0: (-29.5, 3)}
  • 1
  • 2
  • 3
  • 4

4、识别【带空格的词】

示例:使Blade Master这类中间有空格的词被识别

import jieba, re
sentence = 'Blade Master疾风刺杀Archmage'
jieba.add_word('Blade Master')  # 添词
print('修改前:', jieba.lcut(sentence))
jieba.re_han_default = re.compile('(.+)', re.U)  # 修改格式
print('修改后:', jieba.lcut(sentence))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

打印结果

修改前: [‘Blade’, ’ ', ‘Master’, ‘疾风’, ‘刺杀’, ‘Archmage’]
修改后: [‘Blade Master’, ‘疾风’, ‘刺杀’, ‘Archmage’]
  • 1
  • 2

5.其他

5.1基于 TF-IDF 算法的关键词抽取

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence:待提取的文本
topK:为返回几个TF-IDF权重的关键词
withWeight:是否一并返回关键词权重
allowPOS:仅包括指定词性的词
jieba.analyse.TFIDF(idf_path=None) 新建TF-IDF实例,为IDF频率文件

import jieba.analyse as ja, jieba
text = '柳梦璃施法破解了狐仙的法术'
jieba.add_word('柳梦璃', tag='nr')
keywords1 = ja.extract_tags(text, allowPOS=('n', 'nr', 'ns', 'nt', 'nz'))
print('基于TF-IDF:', keywords1)
keywords2 = ja.textrank(text, allowPOS=('n', 'nr', 'ns', 'nt', 'nz'))
print('基于TextRank:', keywords2)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

打印结果

基于TF-IDF: [‘柳梦璃’, ‘狐仙’, ‘法术’]
基于TextRank: [‘狐仙’, ‘柳梦璃’, ‘法术’]
  • 1
  • 2

5.2 并行分词

运行环境:linux系统
开启并行分词模式,参数n为并发数:jieba.enable_parallel(n)
关闭并行分词模式:jieba.disable_parallel()

原理:将目标文件按行分隔后,把各行文本分配到多个Python进程,然后归并结果,从而获得分词速度提升
基于 Python 自带的 multiprocessing 模块

jieba.enable_parallel(4) 开启并行分词模式,参数为并行进程数
jieba.disable_parallel() 关闭并行分词模式
**注意:**并行分词仅支持默认分词器 jieba.dtjieba.posseg.dt

import time
import jieba

jieba.enable_parallel(1)    # 创建1个线程

content = open('./1.txt',"rb").read()

t1 = time.time()
words = "/ ".join(jieba.cut(content))
t2 = time.time()

log_f = open("1.log","wb")
log_f.write(words.encode('utf-8'))

print('speed %s bytes/second' % (len(content)/t2-t1))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

5.3、修改HMM参数

import jieba
text = '柳梦璃解梦C法'
print(jieba.lcut(text, HMM=False))  # ['柳', '梦', '璃', '解梦', 'C', '法']
print(jieba.lcut(text))  # ['柳梦璃', '解梦', 'C', '法']
jieba.finalseg.emit_P['B']['C'] = -1e-9  # begin
print(jieba.lcut(text))  # ['柳梦璃', '解梦', 'C', '法']
jieba.finalseg.emit_P['M']['梦'] = -100  # middle
print(jieba.lcut(text))  # ['柳', '梦璃', '解梦', 'C', '法']
jieba.finalseg.emit_P['S']['梦'] = -.1  # single
print(jieba.lcut(text))  # ['柳', '梦', '璃', '解梦', 'C', '法']
jieba.finalseg.emit_P['E']['梦'] = -.01  # end
print(jieba.lcut(text))  # ['柳梦', '璃', '解梦', 'C', '法']
jieba.del_word('柳梦')  # Force_Split_Words
print(jieba.lcut(text))  # ['柳', '梦', '璃', '解梦', 'C', '法']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

print

[‘柳’, ‘梦’, ‘璃’, ‘解梦’, ‘C’, ‘法’]
[‘柳梦璃’, ‘解梦’, ‘C’, ‘法’]
[‘柳梦璃’, ‘解梦’, ‘C’, ‘法’]
[‘柳’, ‘梦璃’, ‘解梦’, ‘C’, ‘法’]
[‘柳’, ‘梦’, ‘璃’, ‘解梦’, ‘C’, ‘法’]
[‘柳梦’, ‘璃’, ‘解梦’, ‘C’, ‘法’]
[‘柳’, ‘梦’, ‘璃’, ‘解梦’, ‘C’, ‘法’]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

词语在原文的位置

  • 只接受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]))
  • 1
  • 2
  • 3
  • 4
# 搜索模式
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]))
  • 1
  • 2
  • 3
  • 4

延迟加载

jieba 加载采用延迟加载,import jieba 和 jieba.Tokenizer() 不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。

import jieba
jieba.initialize()  # 手动初始化(可选)
  • 1
  • 2

命令分词

python -m jieba news.txt > cut_result.txt
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/379702
推荐阅读
相关标签
  

闽ICP备14008679号