jieba中文分词¶
中文与拉丁语言不同,不是以空格分开每个有意义的词,在我们处理自然语言处理的时候,大部分情况下,词汇是对句子和文章的理解基础。因此需要一个工具去把完整的中文分解成词。
jieba是一个分词起家的中文工具。
基本分词函数与用法¶
安装:pip install jieba(全自动安装方式成功,其他安装方式未尝试)
函数:
jieba.cut()三个参数
:需要分词的字符串
:cut_all参数用来控制是否采用全模式,默认是精确模式
:HMM参数用来控制是否使用HMM模型
jieba.cut_for_search()两个参数
:需要分词的字符串
:是否使用HMM模型
都返回一个可迭代的generator,可用for循环来遍历
In [1]:
import jieba
#全模式
jieba_list = jieba.cut("自然语言学习使我快乐",cut_all = True)
print(jieba_list)
print("Full Mode: " + "/".join(jieba_list))
#精确模式
jieba_list = jieba.cut("自然语言学习使我快乐",cut_all = False)
print("Default Mode: " + "/".join(jieba_list))
jieba_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")
print(",".join(jieba_list))
In [2]:
result_lcut = jieba.lcut("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")
print(result_lcut)
#精确模式
print(" ".join(result_lcut))
#全模式
print(" ".join(jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在哈佛大学深造")))
添加用户自定义词典¶
很多时候我们需要针对特殊场景进行分词,会有一些领域内的专有词汇。
1.可以用jieba.load_userdict(file_name)加载用户字典
2.少量的词汇可以手动添加
用add_word(word,freq = None,tag = None)和del_word(word)在程序中动态修改词典;
用suggest_freq(segment,tune = True)可调节单个词语的词频,使其能或不能被分出来。
In [3]:
print('/'.join(jieba.cut('安妮我不能失去你。',HMM = False)))
In [4]:
jieba.suggest_freq(('不','能'),True)
Out[4]:
In [5]:
print('/'.join(jieba.cut('安妮我不能失去你。',HMM=False)))
关键词提取¶
基于TF-IDF算法的关键词抽取¶
import jieba.analyse
jieba.analyse.extract_tags(sentence,topK = 20,withWeight = False,allowPOS=())
sentence:为待提取的文本
topK:为返回几个TF/IDF权重最大的关键词,默认值为20
withWeight:为是否一并返回关键词权重值,默认为FALSE
allowPOS:仅包括指定词性的词,默认为空
In [6]:
import jieba.analyse as analyse
lines = open('校园女神.txt','rb').read()
print(" ".join(analyse.extract_tags(lines,topK=20,withWeight=False,allowPOS=())))
In [7]:
lines = open('西游记.txt','rb').read()
print(' '.join(analyse.extract_tags(lines,topK = 20,withWeight = False,allowPOS=())))
基于TextRank算法的关键词抽取¶
jieba.anlayse.textrank(sentence,topK = 20,withWight = False,allowPOS = ('ns','n','vn','v'))直接使用,接口相同,注意默认过滤词性。
In [12]:
import jieba.analyse as analyse
lines = open('校园女神.txt',"rb").read()
print(" ".join(analyse.textrank(lines,topK=20,withWeight=False,allowPOS=('n','ns','vn','v'))))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print(" ".join(analyse.textrank(lines,topK=20,withWeight=False,allowPOS=('n','ns'))))
词性标注¶
jieba.posseg.POSTokenizer(tokenizer=None)新建自定义分词器,tokenizer参数可指定内部使用jieba.Tokenizer分词器。
jieba.posseg.dt为默认磁性标注分词器。 标注句子分词后每个词的词性,采用和ictclas兼容的标记法
In [14]:
import jieba.posseg as pseg
words = pseg.cut("一眼望不到边")
for word,flag in words:
print('%s%s'%(word,flag))
Tokenize:返回词语在原文的起止位置¶
In [15]:
###输入参数只接受Unicode###
print("默认模式的tokenize")
result = jieba.tokenize(u'自然语言处理非常有用')
for tk in result:
print('%s start:%d end:%d'%(tk[0],tk[1],tk[2]))
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print("搜索模式的tokenize")
result = jieba.tokenize(u'自然语言处理非常有用',mode='search')
for tk in result:
print('%s start:%d end:%d'%(tk[0],tk[1],tk[2]))