代码改变世界

jieba 分词库(python)

2020-02-02 18:11  默默不语  阅读(2164)  评论(0编辑  收藏  举报

安装jieba:pip install jieba

原理:

  基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)

  采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合

  对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

分词:

jieba支持三种分词模式:

  精确模式:试图将句子最精确地切开,适合文本分析

  全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义

  搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

示例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import jieba
strt = "我爱北京天安门!"
# 全模式
sl = jieba.cut(strt, cut_all=True)
print("全模式:", ",".join(sl))

# 精确模式,默认为精确模式,所以可以不指定cut_all=False
sl = jieba.cut(strt, cut_all=False)
print("精确模式:", ",".join(sl))

# 搜索引擎模式
sl = jieba.cut_for_search(strt)
print("搜索引擎模式:", ",".join(sl))

 

 

  关键词抽取算法主要有以下两种:

  有监督学习算法:将关键词抽取过程视为二分类问题,先抽出候选词,然后对于每个候选词划定标签,其要么是关键词,要么不是关键词。然后训练关键词抽取分类器,当对一段新的文本进行抽取关键词时,先抽取出所有的候选词,然后利用训练好的关键词抽取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词。

  无监督学习算法:先抽取出候选词,然后对各个候选词进行打分,然后输出topN个分值最高的候选词作为关键词。根据打分的策略不同,有不同的算法,例如TF-IDF,TextRank等算法。

jieba分词实现了基于TF-IDF关键词抽取算法和基于TextRank关键词抽取算法,两类算法均是无监督学习的算法。以下对这两种算法进行介绍:

  1.基于TF-IDF算法进行关键词提取

  如果某个词在一篇文档中出现的频率高,也即TF(词频)高;并且在语料库中其他文档中很少出现,即DF的低,也即IDF高,则认为这个词具有很好的类别区分能力。TF-IDF算法中,将TF与IDF相乘。

  代码示例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import jieba
import jieba.analyse
# jieba.analyse.extract_tags(sentence,topK) 有两个参数,第一个为要提取的文本,第二个为要获取的按TF-IDF排序的词的个数
sentence = "有监督学习算法将关键词抽取过程视为二分类问题,先抽出候选词,然后对于每个候选词划定标签,其要么是关键词,要么不是关键词。然后训练关键词抽取分类器," \
           "当对一段新的文本进行抽取关键词时,先抽取出所有的候选词,然后利用训练好的关键词抽取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词。"
topK = 5
result=jieba.analyse.extract_tags(sentence,topK)
print(result)

  运行结果:

  

 

  2.基于TextRank算法进行关键词提取

  代码示例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import jieba
from jieba import analyse
textrank = analyse.textrank

sentence = "有监督学习算法将关键词抽取过程视为二分类问题,先抽出候选词,然后对于每个候选词划定标签,其要么是关键词,要么不是关键词。然后训练关键词抽取分类器," \
           "当对一段新的文本进行抽取关键词时,先抽取出所有的候选词,然后利用训练好的关键词抽取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词。"
# sentence为要提取的文本,topK为要获取的关键词的个数,withWeight为是否显示权重,allowPOS为要提取关键词的词性
result=textrank(sentence, topK=5, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v'))

print(result)

  运行结果:

  

 

jieba动态添加自定义词

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import jieba

content = "韩国东大门单鞋女方头绒面一脚蹬韩版休闲2020春季新款平底毛毛鞋"
result = jieba.cut(content)
print("自定义前:",",".join(result))

jieba.add_word("东大门")
jieba.add_word("一脚蹬")
jieba.add_word("毛毛鞋")
result = jieba.cut(content)
print("自定义后:",",".join(result))

  运行结果:

  

 

jieba自定义词库

jieba支持自定义词库,需要使用时把自定义的词库load进来后jieba就会同时使用 jieba初始化时加载的词库自定义词库,词典格式和dict.txt一样,一个词占一行,每一行分三部分,第一部分为词语,第二部分为词频,最后为词性(可省略),并用空格隔开。

用法:jieba.load_userdict(file_name) #file_name为自定义词典的路径

自定义词库:

  

工程目录:

   

代码示例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import jieba

content = "韩国东大门单鞋女方头绒面一脚蹬韩版休闲2020春季新款平底毛毛鞋"
result = jieba.cut(content)
print("自定义前:",",".join(result))

jieba.load_userdict("./shoes")
result = jieba.cut(content)
print("加载自定义库后:",",".join(result))

运行结果: