数据小站
数据科学成长之路

jieba结巴分词使用 python3中文分词

在中文的自然语言处理中,需要对中文进行分词。在python3的中文分词中,可以使用jieba来进行中文分词。

jieba分词是一款免费的中文分词工具,既然是免费的,就凑合用吧。和不同领域专业的分词工具,区别在于词库上。像医疗中的很多名词,显然jieba是不认识的,用jieba进行分词,会将专业名词拆解,就比较外行了。但是应付日常的使用,是够用了。

jieba的分词主要是用jieba.cut() 和jieba.lcut()两种方法 ,使用参数一致,区别在于返回的对象,一个是可迭代对象,一个是返回的列表

jieba.cut() 分词使用

.cut()的方法使用

def cut(self, sentence, cut_all=False, HMM=True, use_paddle=False):
"""
The main function that segments an entire sentence that contains
Chinese characters into separated words.

Parameter:
- sentence: The str(unicode) to be segmented.
- cut_all: Model type. True for full pattern, False for accurate pattern.
- HMM: Whether to use the Hidden Markov Model.

查看.cut()的定义文档,cut方法有主要三个参数:sentence 中文字符串, cut_all 切割的模式,HMM 是否使用隐马模型。

cut_all 默认False,为accurate pattern精确分割。 精确分割和非精确分割的区别在于,分词的时候,对长尾词,是否进行来分的区分。

.cut()方法返回的是一个可迭代对象,不能直接打印。需要转换一下。

.lcut()方法,和.cut()方法的区别在于, .lcut()直接将分割的词返回成一个list,而不是迭代对象,使用方法和.cut()一致。

if __name__ == "__main__":

    # 非精确模式
    str = '今天天气真的是很好'
    split_list = jieba.cut(str, cut_all=True)

    print("全模式: ", "  ".join(split_list))

    # 精确模式
    split_list = jieba.cut(str, cut_all=False)
    print("精确模式: ", " ".join(split_list))

    split_list = jieba.cut_for_search(str)
    print("cut_for_search : ", " ".join(split_list))

全模式: 今天 今天天气 天天 天气 真的 是 很 好
精确模式: 今天天气 真的 是 很 好
cut_for_search: 今天 天天 天气 今天天气 真的 是 很 好

对文本今天天气真的是很好,用.cut分词时,非精确模式下,对文本来回切分,把可能的词都进行提取。精确模式下,将文本进行精确的划分,

.cut还有一种 cut_for_search() 方法,是在精确模式下,对长尾词进行继续划分

当然, .lcut()方法,也要配套的.lcut_for_search方法,返回的也是list而不是迭代对象。

自定义词库add_word,load_userdict

在大部分专业的领域,有专用的术语。在jieba结巴分词的语料库里,显然是涵盖不了专业的术语的。

例如在医学领域,有关电子烟的内容‘想戒烟吗?选择电子烟代替尼古丁贴片,更有可能获得成功呦’,直接用jieba分词时,专业的术语:电子烟、尼古丁贴片都不能识别,都被切分,显得不够专业。

text = "想戒烟吗?选择电子烟代替尼古丁贴片,更有可能获得成功呦"

split_list = jieba.cut(text, cut_all=True)
print("全模式: ", " ".join(split_list))

# 精确模式
split_list = jieba.cut(text, cut_all=False)
print("精确模式: ", " ".join(split_list))

split_list = jieba.cut_for_search(text)
print("cut_for_search : ", " ".join(split_list))

全模式: 想 戒烟 吗 ? 选择 电子 烟 代替 尼古丁 贴片 , 更 有 可能 获得 获得成功 得成 成功 呦
精确模式: 想 戒烟 吗 ? 选择 电子 烟 代替 尼古丁 贴片 , 更 有 可能 获得成功 呦
cut_for_search : 想 戒烟 吗 ? 选择 电子 烟 代替 尼古丁 贴片 , 更 有 可能 获得 得成 成功 获得成功 呦

要解决专业名词的问题,除了是更换专业领域的分词工具之外,jieba提供了自定义词库,可以加入特定的词。

.add_word() 添加关键词

jieba.add_word()可以手动添加一个关键词进入词库

jieba.add_word('尼古丁贴片')
jieba.add_word('电子烟')
text = "想戒烟吗?选择电子烟代替尼古丁贴片,更有可能获得成功呦"

# 精确模式
split_list = jieba.cut(text, cut_all=False)
print("精确模式: ", "  ".join(split_list))

精确模式: 想 戒烟 吗 ? 选择 电子烟 代替 尼古丁贴片 , 更 有 可能 获得成功 呦

通过用 .add_word() 添加了电子烟和尼古丁贴片后,在使用分词工具时jieba就认识这两个关键词,就不会对这两个词进行切割。

.load_userdict() 批量设置关键词

当然,用 .add_word() 是一个一个添加,如果是批量添加大量的关键词,就需要使用load_userdict

查看 load_userdict 的定义文档,寻找这个方法的使用方式:

def load_userdict(self, f):
    '''
    Load personalized dict to improve detect rate.

    Parameter:
        - f : A plain text file contains words and their ocurrences.
              Can be a file-like object, or the path of the dictionary file,
              whose encoding must be utf-8.

    Structure of dict file:
    word1 freq1 word_type1
    word2 freq2 word_type2
    ...
    Word type may be ignored
    '''

文档的描述说明,唯一的参数是一个类文件对象,必须是utf8编码格式。文本内容的格式是word1 freq1 word_type1:关键词 词频 词性 , 多个关键词每行一个。Word type may be ignored,词性可以忽略。

按照文档要求,制作一个文本文件,内容按格式写上:关键词 词频, 词性可以省略,起始词频也可以省略,直接一行写入一个关键词也可行。只是官方文档并没有这么写,就没有按照这种方式做。

jieba.load_userdict(r"C:\Users\abc\Desktop\a.txt")
text = "想戒烟吗?选择电子烟代替尼古丁贴片,更有可能获得成功呦"

# 精确模式
split_list = jieba.cut(text, cut_all=False)
print("精确模式: ", " ".join(split_list))

精确模式: 想 戒烟 吗 ? 选择 电子烟 代替 尼古丁贴片 , 更 有 可能 获得成功 呦

extract_tags关键词提取

用jieba对文本进行关键词切割之后,已经能获取到文本内的所有关键词。

如何衡量一个文本的关键词的重要程度,通常用到tf-idf的逆概词频方式,提取出最核心的关键词。

import jieba
import jieba.analyse

if __name__ == "__main__":
    text = "想戒烟吗?选择电子烟代替尼古丁贴片,更有可能获得成功呦"
    jieba.add_word('电子烟')
    jieba.add_word('尼古丁贴')
    split_list = jieba.lcut(text)
    print('lcut分词',split_list)
    tp10 = jieba.analyse.extract_tags(text, 5)
    print('提取关键词',tp10)

lcut分词 [‘想’, ‘戒烟’, ‘吗’, ‘?’, ‘选择’, ‘电子烟’, ‘代替’, ‘尼古丁贴’, ‘片’, ‘,’, ‘更’, ‘有’, ‘可能’, ‘获得成功’, ‘呦’]
提取关键词 [‘电子烟’, ‘尼古丁贴’, ‘戒烟’, ‘获得成功’, ‘代替’]

通过.lcut 查看结巴对文本的分词效果, 使用extract_tags查看最核心的关键词。

提取关键词 extract_tags 的用法:第一个参数为文本,第二个参数为提取排名靠前的N个关键词,默认是20个。 extract_tags 详细用法可以参考文档标注,可以对特定的名称、动词、虚词进行过滤,通过allowPOS这个参数设置。如果不想深入研究的话,withWeight=False, allowPOS=(), withFlag=False这三个参数忽略吧,没大的影响。

extract_tags 的定义文档:
def extract_tags(self, sentence, topK=20, withWeight=False, allowPOS=(), withFlag=False):
    """
    Extract keywords from sentence using TF-IDF algorithm.
    Parameter:
        - topK: return how many top keywords. `None` for all possible words.
        - withWeight: if True, return a list of (word, weight);
                      if False, return a list of words.
        - allowPOS: the allowed POS list eg. ['ns', 'n', 'vn', 'v','nr'].
                    if the POS of w is not in this list,it will be filtered.
        - withFlag: only work with allowPOS is not empty.
                    if True, return a list of pair(word, weight) like posseg.cut
                    if False, return a list of words
    """
赞(0) 打赏
未经允许不得转载:技术文档分享 » jieba结巴分词使用

评论 抢沙发