jieba 是一个python实现的分词库,对中文有着很强大的分词能力。
1. 支持三种分词模式
- 精确模式,试图将句子最精确地切开,不存在冗余单词,适合文本分析;
- 全模式,试图列出所有可能的单词,速度非常快,但是不能解决歧义,存在冗余;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
全自动安装
pip install jieba # 在目前所激活的环境下安装
[环境名] -m pip install jieba # 不需切换环境
pip install -i https://pypi.doubanio.com/simple/ jieba
半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行
python setup.py install
手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
通过 import jieba 来引用
函数 | 功能 | 参数说明 |
---|---|---|
jieba.cut(s) | 精确模式,返回一个可迭代的数据类型 | s:字符串 |
jieba.cut(s, cut_all = True) | 全模式,返回一个可迭代的数据类型 | s:字符串;cut_all = True/False:全模式/精确模式,默认为False |
jieba.cut_for_search(s) | 搜索引擎模式,返回一个可迭代的数据类型 | s:字符串 |
jieba.lcut(s) | 精确模式,返回一个数据列表类型 | s:字符串 |
jieba.lcut(s, cut_all = True) | 全模式,返回一个数据列表类型 | s:字符串;cut_all = True/False:全模式/精确模式,默认为False |
jieba.lcut_for_search(s) | 搜索引擎模式,返回一个数据列表类型 | s:字符串 |
代码示例:
import jieba
s = "中华人民共和国是一个伟大的国家"
r1 = jieba.cut(s)
print("【精确模式】:",type(r1),"\t", " / ".join(r1))
r2 = jieba.cut(s,cut_all=True)
print("【全模式】:",type(r2),"\t", " / ".join(r2))
r3 = jieba.cut_for_search(s)
print("【搜索引擎模式】:",type(r3),"\t", " / ".join(r3))
r4 = jieba.lcut(s)
print("【精确模式】:",type(r4),"\t", r4)
r5 = jieba.lcut(s,cut_all =True )
print("【全模式】:",type(r5),"\t", r5)
'''
out:
【精确模式】: 中华人民共和国 / 是 / 一个 / 伟大 / 的 / 国家
【全模式】: 中华 / 中华人民 / 中华人民共和国 / 华人 / 人民 / 人民共和国 / 共和 / 共和国 / 国是 / 一个 / 伟大 / 的 / 国家
【搜索引擎模式】: 中华 / 华人 / 人民 / 共和 / 共和国 / 中华人民共和国 / 是 / 一个 / 伟大 / 的 / 国家
【精确模式】: ['中华人民共和国', '是', '一个', '伟大', '的', '国家']
【全模式】: ['中华', '中华人民', '中华人民共和国', '华人', '人民', '人民共和国', '共和', '共和国', '国是', '一个', '伟大', '的', '国家']
【搜索引擎模式】: ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '一个', '伟大', '的', '国家']
'''
开发者可以指定自己自定义的词典,以便包含jieba词库里没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率
jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
自定义的词典格式要和jieba
中的词典格式一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name
若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
下图时jieba自带的分词词典dict.txt
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPv8gLLQ-1597476365768)(C:\Users\niubj\Desktop\how_to_use_jieba\jieba自带词库.PNG)]
注意:在保存userdict.txt
文件时应使用UTF-8的编码格式。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IDJqM6ma-1597476365787)(C:\Users\niubj\Desktop\how_to_use_jieba\自定义词典.PNG)]
代码示例:
import jieba
s = "真武七截阵和天罡北斗阵哪个更厉害呢?"
print("【用jieba自带的分词词典的分词结果】",jieba.lcut(s))
# 载入自定义分词词典
jieba.load_userdict("mydict.txt")
print("【载入自定义词典后的分词结果】",jieba.lcut(s))
'''
out:
【用jieba自带的分词词典的分词结果】 ['真武', '七截阵', '和', '天罡', '北斗', '阵', '哪个', '更', '厉害', '呢', '?']
【载入自定义词典后的分词结果】 ['真武七截阵', '和', '天罡北斗阵', '哪个', '更', '厉害', '呢', '?']
'''
其中,mydict.txt
为自定义字典,该文件与代码文件处于同一目录下。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHMS4SZ5-1597476365795)(C:\Users\niubj\Desktop\how_to_use_jieba\dict_content.PNG)]
函数 | 功能 |
---|---|
add_word(word, freq=None, tag=None) | 可在程序中动态修改词典,向字典中增加某个词 |
del_word(word) | 可在程序中动态修改词典,从字典中删除某个词 |
suggest_freq(segment, tune = True) | 可调节单个词语的词频,使其能(或不能)被分出来。 |
add_word(word, freq=None, tag=None)
和 jieba.load_userdict(file_name)
异同点:
都是向词典中添加新词,但是前者需要一个词一个词添加,效率抵;后者则解决了这样的难题。
注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
对字典进行调整示例:
import jieba
s = "真武七截阵和天罡北斗阵哪个更厉害呢?"
print("【用jieba自带的分词词典的分词结果】",jieba.lcut(s))
jieba.add_word("真武七截阵")
print("【在词典中加入‘真武七截阵’的分词结果】",jieba.lcut(s))
jieba.del_word("真武七截阵")
print("【在词典中删除‘真武七截阵’的分词结果】",jieba.lcut(s))
'''
out:
【用jieba自带的分词词典的分词结果】 ['真武', '七截阵', '和', '天罡', '北斗', '阵', '哪个', '更', '厉害', '呢', '?']
【在词典中加入‘真武七截阵’的分词结果】 ['真武七截阵', '和', '天罡', '北斗', '阵', '哪个', '更', '厉害', '呢', '?']
【在词典中删除‘真武七截阵’的分词结果】 ['真武', '七截阵', '和', '天罡', '北斗', '阵', '哪个', '更', '厉害', '呢', '?']
'''
import jieba
s1 = "上穷碧落下黄泉,两处茫茫皆不见"
print(jieba.lcut(s1))
print("------------【落下】应分开---------------")
jieba.suggest_freq(("落","下"),True)
print(jieba.lcut(s1))
print("\n")
s2 = "台中今晚将会下雨"
print(jieba.lcut(s2))
print("------------【台中】不应分开---------------")
jieba.suggest_freq("台中",True)
print(jieba.lcut(s2))
'''
out:
['上穷', '碧', '落下', '黄泉', ',', '两处', '茫茫', '皆', '不见']
------------【落下】应分开---------------
['上穷', '碧落', '下', '黄泉', ',', '两处', '茫茫', '皆', '不见']
['台', '中', '今晚', '将会', '下雨']
------------【台中】不应分开---------------
['台中', '今晚', '将会', '下雨']
'''
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK = 20, withWeight = False, allowPOS = ())
jieba.analyse.TFIDF(idf_path = None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件
代码示例:
import jieba.analyse as analyse
text = "征战四海只为今日一胜,我不会再败了。"
# TF-IDF
tf_result = analyse.extract_tags(text, topK=5) # topK指定数量,默认20
print(tf_result)
'''
out:
['一胜', '再败', '征战', '四海', '今日']
'''
import jieba.analyse
jieba.analyse.textrank(sentence, topK = 20, withWeight = False, allowPOS = ())
代码示例:
import jieba.analyse as analyse
text = "征战四海只为今日一胜,我不会再败了。"
# TextRank
tr_result = analyse.textrank(text, topK=5) # topK指定数量,默认20
print(tr_result)
'''
out:
['征战', '再败', '四海', '不会']
'''
标注句子分词后每个词的词性,采用ictclas兼容的标记法
代码示例:
import jieba.posseg as pseg
words = pseg.cut("我爱北京天安门")
for w in words:
print(w.word,w.flag)
'''
out:
我 r
爱 v
北京 ns
天安门 ns
'''