在中文的自然语言处理中,需要对中文进行分词。在python3的中文分词中,可以使用jieba来进行中文分词。
jieba分词是一款免费的中文分词工具,既然是免费的,就凑合用吧。和不同领域专业的分词工具,区别在于词库上。像医疗中的很多名词,显然jieba是不认识的,用jieba进行分词,会将专业名词拆解,就比较外行了。但是应付日常的使用,是够用了。
jieba的分词主要是用jieba.cut() 和jieba.lcut()两种方法 ,使用参数一致,区别在于返回的对象,一个是可迭代对象,一个是返回的列表
jieba.cut() 分词使用
.cut()的方法使用
defcut(self, sentence, cut_all=False, HMM=True, use_paddle=False):
"""The main function that segments an entire sentence that containsChinese 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 的定义文档,寻找这个方法的使用方式:
defload_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的逆概词频方式,提取出最核心的关键词。
importjieba
importjieba.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 的定义文档:
defextract_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
"""