Hello,World!
从去年开始学习Python,在长久的学习过程中,发现了许多有趣的知识,不断充实自己。今天我所写的内容也是极具趣味性,关于优秀的中文分词库——jieba库。
1、jieba 是目前表现较为不错的 Python 中文分词组件,它主要有以下特性:
2、jieba库的分词原理:利用一个中文词库,确定汉字之间的关联概率,汉字间概率大的组成词组,形成分词结果。除了分词,用户还可以添加自定义的词组。【这一点是很有趣的!】
3、jieba库支持四种分词模式:精确模式、全模式、搜索引擎模式、paddle模式,并且支持繁体分词,以及自定义词典。具体介绍:
算法
正文来了!!!
1. 此次内容创作,我主要使用的软件有Anaconda,Jupyter Notebook,Pycharm等,看过我之前文章的大佬们,相信对Anaconda都有一个简单的了解,这里就不一一叙述了,直接安装。
因为jieba库不是Anaconda中自带的,所以需要我们自己下载,首先进入jieba库官网:jieba · PyPIhttps://pypi.org/project/jieba/#files
如下图:
点击官网中文件下载即可(如果下载速度比较慢,可以私聊我!)
2. 将压缩包解压到anaconda的pkgs目录。
3. 打开anaconda prompt,切换目录至比如我的D:/anaconda/pkgs/jieba-0.42,输入cmd进入命令行模式
执行 python setup.py install 即可。
4. 再次打开jupyter notebook 测试
import jieba,正常。pycharm中 import jieba ,正常。由此,我们的第一步安装完成!
pip install jieba
import jieba
将语句最精确的切分,不存在冗余数据,适合做文本分析。
#精确模式
jieba.cut(text, cut_all=False)
案例分析:
精确模式分析是不存在冗余数据的,把完整的text文本按照中文词库的标准完成拆分。如图所示:
import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
将语句中所有可能是词的词语都切分出来,速度很快,但是存在冗余数据。
#全模式
jieba.cut(text, cut_all=True)
案例分析:
全模式与精确模式的不同在于,全模式存在冗余数据,是将存在可能的词语全部切分出来,从第一个字到最后一个字遍历作为词语第一个字。例如:以“吉”开头的词语包括“吉林”,“吉林省”,以“长”开头的名词包括“长春”“长春市”等等。如图所示:
不难看出,输出的内容存在冗余数据。
seg_list = jieba.cut("我来到吉林省长春市高新技术产业开发区光谷大街1188号", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
在精确模式的基础上,对长词再次进行切分,提高召回率,适合用于搜索引擎分词。
#搜索引擎模式
jieba.lcut_for_search(text)
案例分析:
搜索引擎模式是将精确模式中的长词,再次按照全模式切分。如图所示:
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
print(", ".join(seg_list))
此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了。
在jieba自定义字典方面,目前我所了解到的常见的应用环境是各网络平台对违禁词的查询搜索处理,以及网站也对用户个人信息的处理,对购物方面评价信息的处理等等。因此,我同样也使用了jupyter notebook尝试了自定义词典的使用,text文本文件及运行结果如下图所示:
//自定义词典使用
import jieba
test_sent = "李小福是创新办主任也是云计算方面的专家"
jieba.load_userdict("E://userdict.txt")
words = jieba.cut(test_sent)
print(list(words))
可以看出,我的自定义词典在运行过程中,起到了具体的作用。可想而知,当我们在对一篇文章进行内容的分析处理是,也是可以使用jieba库的!可以通过用户自定义词典来增强歧义纠错能力!
部分文本解析语法:
def getext():
fname=input("请输入要打开的文件路径及名称,以txt结尾:")
fo=open(fname) #打开该文件,默认是文本文件,文本文件其实就是一个字符串
txt=fo.read() #<文件名>.read() 默认是读取文件全部内容
txt=txt.lower() #将文本所有字母小写
for ch in '!"#$%()*+<_>/:;<>=?@[\]\^_{}|~':
txt=txt.replace(ch,'') #将文本中含有的所有上述字符都变为空格
return txt
hamlettxt=getext()
words=hamlettxt.split() #默认值,是将文本中单词按照空格分成一个一个的单词,并将结果保存成列表类型
counts={} #定义一个空字典类型,因为我们希望单词和该单词出现的次数作为一个键值对
for word in words: #遍历words列表的每一个值
counts[word]=counts.get(word,0)+1
items=list(counts.items()) #将该字典转化成一个列表,其中的键值对是以元组的形式存在
items.sort(key=lambda x:x[1],reverse=True)
for i in range(10):
word,count=items[i] #items[i] 是个元组,元组可以带括号,可以不带括号;赋值
print("{:<10}{:>5}".format(word,count))
添加
str = "你好呀,我叫李华!多多关照!"
jieba.add_word("你")
print(jieba.lcut(str))
删除
str = "你好呀,我叫李华!多多关照!"
jieba.del_word("李华")
print(jieba.lcut(str))
调整词出现的频率
str = "你好呀,我叫李华!多多关照!"
jieba.suggest_freq(("李", "华"), True)
print(jieba.lcut(str))
TFIDF算法
import jieba.analyse # 导包
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False,
allowPOS=())
jieba.analyse.TFIDF(idf_path=None) # 创建一个新的 TFIDF 实例,idf_path是指指定 IDF 频率文件的路径
参数:
- sentence:要提取的文本
- topK:返回多少个具有最高TF/IDF权重的关键字。默认值为 20
- withWeight:是否返回关键字的TF/IDF权重。默认为假
- allowPOS:过滤包含POS(词性)的单词。空无过滤,可以选择
['ns', 'n', 'vn', 'v','nr']
TextRank算法
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) # 有默认词性
jieba.analyse.TextRank() # 新建自定义 TextRank 实例
jieba.posseg.POSTokenizer(tokenizer=None)
新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器
jieba.posseg.dt 为默认词性标注分词器
import jieba.posseg
str = "你好呀,我叫李华!多多关照!"
pt = jieba.posseg.POSTokenizer()
print(pt.lcut(str)) # 得到 pair键值对,使用遍历取值
# print(jieba.posseg.cut(str)) # 作用一样
for i, k in ps.lcut(str):
print(i, k)
默认模式
result = jieba.tokenize(u'永和服装饰品有限公司')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
搜索模式
result = jieba.tokenize(u'永和服装饰品有限公司', mode='search')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
如上文所示,关于Pyhton中文分词库——jieba库的介绍,暂时结束,如果后续学习到了新的内容,会再次进行介绍!各位大佬们,如果发现文章内容错误,希望可以指出,评论或私信都可
部分内容来源:GitHub - fxsjy/jieba: 结巴中文分词