基于python的NLP入门——jieba库的使用

基于python的NLP入门——jieba库的使用

一、什么是jieba库?

jieba 是一个python实现的分词库,对中文有着很强大的分词能力。

二、jieba库的优点

1. 支持三种分词模式
   - 精确模式,试图将句子最精确地切开,不存在冗余单词,适合文本分析;
   - 全模式,试图列出所有可能的单词,速度非常快,但是不能解决歧义,存在冗余;
   - 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  1. 支持繁体分词
  2. 支持自定义词典
  3. MIT授权协议

三、jieba库的安装(windows)

  1. 全自动安装

    pip install jieba # 在目前所激活的环境下安装
    [环境名] -m pip install jieba # 不需切换环境
    pip install -i https://pypi.doubanio.com/simple/ jieba
    
  2. 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行

    python setup.py install
    
  3. 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录

  4. 通过 import jieba 来引用

四、jieba库的使用

1. 分词


函数 功能 参数说明
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:

【精确模式】:  	 中华人民共和国 / 是 / 一个 / 伟大 / 的 / 国家
【全模式】:  	 中华 / 中华人民 / 中华人民共和国 / 华人 / 人民 / 人民共和国 / 共和 / 共和国 / 国是 / 一个 / 伟大 / 的 / 国家
【搜索引擎模式】:  	 中华 / 华人 / 人民 / 共和 / 共和国 / 中华人民共和国 / 是 / 一个 / 伟大 / 的 / 国家
【精确模式】:  	 ['中华人民共和国', '是', '一个', '伟大', '的', '国家']
【全模式】:  	 ['中华', '中华人民', '中华人民共和国', '华人', '人民', '人民共和国', '共和', '共和国', '国是', '一个', '伟大', '的', '国家']
【搜索引擎模式】:  	 ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '一个', '伟大', '的', '国家']
	
'''

2. 添加自定义字典


2.1 载入词典

开发者可以指定自己自定义的词典,以便包含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)]

2.2 调整词典
函数 功能
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:
    
    ['上穷', '碧', '落下', '黄泉', ',', '两处', '茫茫', '皆', '不见']
    ------------【落下】应分开---------------
    ['上穷', '碧落', '下', '黄泉', ',', '两处', '茫茫', '皆', '不见']
    
    
    ['台', '中', '今晚', '将会', '下雨']
    ------------【台中】不应分开---------------
    ['台中', '今晚', '将会', '下雨']
    '''
    

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 频率文件

    代码示例:

    import jieba.analyse as analyse
    
    text = "征战四海只为今日一胜,我不会再败了。"
    # TF-IDF
    tf_result = analyse.extract_tags(text, topK=5) # topK指定数量,默认20
    print(tf_result)
    
    '''
    out:
    	['一胜', '再败', '征战', '四海', '今日']
    '''
    
基于TextRank

import jieba.analyse

  • jieba.analyse.textrank(sentence, topK = 20, withWeight = False, allowPOS = ())

    • sentence:为待提取的文本
    • topK :为返回 几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight :为是否一并返回关键词权重值,默认值为 False
    • allowPOS:仅包括指定词性的词,默认值为空,即不筛选

    代码示例:

    import jieba.analyse as analyse
    
    text = "征战四海只为今日一胜,我不会再败了。"
    # TextRank
    tr_result = analyse.textrank(text, topK=5) # topK指定数量,默认20
    print(tr_result)
    
    '''
    out:
    	['征战', '再败', '四海', '不会']
    '''
    

4. 词性标注

标注句子分词后每个词的词性,采用ictclas兼容的标记法

代码示例:

import jieba.posseg as pseg
words = pseg.cut("我爱北京天安门")
for w in words:
    print(w.word,w.flag)
    
'''
out:
	我 r
	爱 v
	北京 ns
	天安门 ns
'''

你可能感兴趣的:(python)