疫情宅在家,只能静下心来弄毕设~

话不多说,直接上干货,本篇博客包含:

  • 中文分词
  • 添加自定义词典
  • 词性标注
  • 关键词抽取

环境:

  • Python3.5
  • Jieba-0.39
  • Pycharm2018

一、安装jieba

在安装有python3 和 pip 的机子上,安装jieba库很简单,使用pip即可:

pip install jieba

二、Jieba分词特性

1、支持三种分词模式:

  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

2、支持繁体分词

3、支持自定义词典

4、代码对Python2和Python3均兼容

5、支持多种编程语言,包括Java、C++、Rust、PHP、R、Node.js等

Jieba工具主要使用的算法包括:

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

(2)采用动态规划查找最大概率路径,寻找基于词频的最大切分组合;

(3)对于未登录词,采用基于汉字成词能力的HMM模型结合Viterbi算法。

三、主要功能

参考:https://blog.csdn.net/Eastmount/article/details/97612578

1、中文分词(jieba.cut)

① 何为分词?

由于中文词语之间是紧密联系的,一个汉语句子是由一串前后连续的汉字组成,词与词之间没有明显的分界标志,所以需要通过一定的分词技术把句子分割成空格连接的词序列,这就是所谓的中文分词技术。

中文分词(Chinese Word Segmentation)指将汉字序列切分成一个个单独的词或词串序列,它能够在没有词边界的中文字符串中建立分隔标志,通常采用空格分隔。中文分词是数据分析预处理、数据挖掘、文本挖掘、搜索引擎、知识图谱、自然语言处理等领域中非常基础的知识点,只有经过中文分词后的语料才能转换为数学向量的形式,继续进行后面的分析。同时,由于中文数据集涉及到语义、歧义等知识,划分难度较大,比英文复杂很多。

② 基本用法

首先看一段简单的结巴分词代码,主要调用两个函数实现。

  • jieba.cut(text,cut_all=True) ——分词函数,第一个参数是需要分词的字符串,第二个参数表示是否为全模式。分词返回的结果是一个可迭代的生成器(generator),可使用for循环来获取分词后的每个词语,更推荐读者转换为list列表再使用。
  • jieba.cut_for_search(text)——搜索引擎模式分词,参数为分词的字符串,该方法适合用于搜索引擎构造倒排索引的分词,粒度比较细。
    #encoding=utf-8
    import jieba
    text = "小杨毕业于北京理工大学,从事Python人工智能相关工作。"data = jieba.cut(text,cut_all=True)
    print("【全模式】:","/".join(data)) #全模式data = jieba.cut(text,cut_all=False)
    print("【精确模式】:","/".join(data)) #精确模式data = jieba.cut(text) # 默认是精确模式
    print("【默认模式】:","/".join(data))data = jieba.cut_for_search(text)  # 搜索引擎模式
    print("【搜索引擎模式】:","/".join(data))#返回列表
    seg_list = jieba.lcut(text, cut_all=False)
    print("【返回列表】: {0}".format(seg_list))

    输出结果如下所示

最终的分词结果比较理想,其中精确模式输出的“小/杨/毕业/于/北京理工大学/,/从事/Python/人工智能/相关/工作/。”比较精准。下面简单比较一下结巴中文分词的三种分词模式。

  1. 全模式:该模式将语料中所有可以组合成词的词语都构建出来,其优点是速度非常快,缺点是不能解决歧义问题,并且分词结果不太准确。
  2. 精确模式:该模式利用其算法将句子最精确地分隔开,适合文本分析,通常采用这种模式进行中文分词。其分词结果为“小/杨/毕业/于/北京理工大学/,/从事/Python/人工智能/相关/工作/。”,其中“北京理工大学”、“人工智能”这些完整的名词被精准识别,但也有部分词未被识别,后续导入词典可以实现专有词汇识别。
  3. 搜索引擎模式:该模式是在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

③ 基于HMM模型的中文分词
     隐马尔可夫模型(Hidden Markov Model, HMM)是一种基于概率的统计分析模型,用来描述一个系统隐性状态的转移和隐性状态的表现概率。到目前为止,HMM模型被认为是解决大多数自然语言处理问题最为快速、有效的方法之一。它成功解决了语义识别、机器翻译等问题。

在Jieba工具中,对于未登录到词库的词,使用了基于汉字成词能力的 HMM 模型和 Viterbi 算法,其大致原理是采用四个隐含状态,分别表示为单字成词、词组的开头、词组的中间和词组的结尾。通过标注好的分词训练集,可以得到 HMM的各个参数,然后使用 Viterbi 算法来解释测试集,得到分词结果。

  • jieba.cut : 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
  • jieba.cut_for_search : 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  • 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut 以及jieba.lcut_for_search 直接返回 list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT) : 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
# encoding=utf-8
import jiebatext = "他来到了网易杭研大厦工作,我继续去北理读研。"
# 精确模式
data = jieba.cut(text, cut_all=False, HMM=False)
print("[精确模式]: ", "/".join(data))
# 精确模式+HMM
data = jieba.cut(text, cut_all=False, HMM=True)
print("[精确模式]: ", "/".join(data))

输出结果如下图所示,未启用HMM模型时,它无法识别“杭研”、“北理”词语,将其拆分成了“杭”、“研”和“北”、“理”,而启用HMM模型时,它有效识别了新词“杭研”、“北理”。

 ④繁体中文分词

Jieba工具支持中文繁体字的识别,将前面示例转换为繁体字,即“小楊畢業於北京理工大學,從事Python人工智能相關工作。”,调用Jieba分词的代码如下所示。

# encoding=utf-8
import jiebatext = "小楊畢業於北京理工大學,從事Python人工智能相關工作。"# 全模式
data = jieba.cut(text, cut_all=True)
print("【全模式】: ", "/".join(data))# 精确模式
data = jieba.cut(text, cut_all=False)
print("【精确模式】: ", "/".join(data))# 搜索引擎模式
data = jieba.cut_for_search(text)
print("【搜索引擎模式】: ", "/".join(data))

输出结果如下所示:

2、添加自定义词典()

①添加词典

在进行中文分词过程中,通常会遇到一些专用词语无法精准的切分,比如“云计算”会被分割为“云”、“计算”,“贵州财经大学”会被分割为“贵州”、“财经大学”等。虽然Jieba工具有新词识别能力,但也无法识别出所有Jieba词库里没有的词语,但它为开发者提供了添加自定义词典功能,从而保证更好的分词正确率。其函数原型如下:

load_userdict(f)——该函数只有一个参数,表示载入的自定义词典路径,f 为文件类对象或自定义词典路径下的文件。词典的格式为:一个词占一行,每行分为三部分:

word  freq  word_type

其中,word为对应的词语freq为词频(可省略),word_type为词性(可省了),中间用空格隔开,顺序不可以改变。注意,文件必须为UTF-8编码。

下面举例讲解,第一个代码是未导入自定义词典的中文分词。

# encoding=utf-8
import jiebatext = "小杨在贵州财经大学工作,擅长大数据、云计算,喜欢乾清宫、黄果树瀑布等景区。"# 精确模式
data = jieba.cut(text, cut_all=False)
print(u"[原始文本]: ", text)
print(u"[精确模式]: ", "/".join(data))

输出结果未将“贵州财经大学”、“大数据”、“云计算”、“乾清宫”、“黄果树瀑布”等词汇正确分割。

接着导入自定义词典,其本地词典命名为“dict.txt”,如图所示,包括设置“贵州财经大学”的词性为机构名词“nt”,“大数据”、“云计算”的词性为名词“n”,,也有省略词性和词频的“乾清宫”。

文件保存为utf-8格式:

完整代码如下:

#encoding=utf-8
import jiebatext = "杨秀璋在贵州财经大学工作,擅长大数据、云计算,喜欢乾清宫、黄果树瀑布等景区。"#导入自定义词典
jieba.load_userdict("dict.txt")
#精确模式
data = jieba.cut(text, cut_all=False)
print("[原始文本]: ", text)
print("[精确模式]: ", "/".join(data))

此时的输出结果有效地提取了“贵州财经大学”、“云计算”、“乾清宫”。但也有两个未识别出的词语,“黄果树瀑布”不在词典中,故被拆分成了“黄果树”和“瀑布”,“大数据”虽然在词典中,却仍然拆分成了“大”和“数据”。

②动态修改词典

在Jieba工具中,可以在程序中动态修改词典,通过add_word(word, freq=None, tag=None)函数添加新词语,通过del_word(word)函数删除自定义词语。

#encoding=utf-8
import jiebatext = "小杨在贵州财经大学工作,擅长大数据、云计算,喜欢乾清宫、黄果树瀑布等景区。"#导入自定义词典
jieba.load_userdict("dict.txt")#添加自定义词语
jieba.add_word("小杨")
jieba.add_word("黄果树瀑布")
jieba.add_word("自然语言处理", freq=10, tag="nz")#删除自定义词语
jieba.del_word("北理工")#精确模式
data = jieba.cut(text, cut_all=False)
print("[原始文本]: ", text, "\n")
print("[精确模式]: ", "/".join(data))

该代码增加了新词语“小杨”、“黄果树瀑布”和“自然语言处理”,删除了“北理工”,其运行结果如下所示,它有效地将“小杨”和“黄果树瀑布”进行了精准识别。

此时,我们可能会有一个疑问,为什么“大数据”被拆分成了“大”和“数据”呢?这是因为Jieba词库中“大”和“数据”的重要程度更高,我们可以使用suggest_freq(segment, tune=True)函数调节单个词语的词频,使其被分割出来。

代码如下所示:

#encoding=utf-8
import jiebatext = "小杨在贵州财经大学工作,擅长大数据、云计算,喜欢乾清宫、黄果树瀑布等景区。"#导入自定义词典
jieba.load_userdict("dict.txt")#添加自定义词语
jieba.add_word("小杨")
jieba.add_word("黄果树瀑布")
jieba.add_word("自然语言处理", freq=10, tag="nz")#删除自定义词语
jieba.del_word("北理工")#调节词频
jieba.suggest_freq('大数据', True)#精确模式
data = jieba.cut(text, cut_all=False)
print("[原始文本]: ", text, "\n")
print("[精确模式]: ", "/".join(data))

最终的输出结果为“小杨/在/贵州财经大学/工作/,/擅长/大数据/、/云计算/,/喜欢/乾清宫/、/黄果树瀑布/等/景区/。”

终于将“小杨”、“贵州财经大学”、“大数据”、“云计算”、“乾清宫”、“黄果树瀑布”等专有词语识别出来。同时,如果自定义词典存在很多专用名词,并且需要设置它们的高权重,可以使用下面的代码循环设置每一个词语的词频。

#循环设置词频重要程度
fp = open("dict.txt", 'r', encoding='utf8')
for line in fp:line = line.strip()
jieba.suggest_freq(line, True)#第二种方法
[jieba.suggest_freq(line.strip(), True) for line in open("dict.txt",'r',encoding='utf8')]

3、词性标注(jieba.posseg.cut())

词性标注(Part-Of-Speech Tagging, POS Tagging)也被称为语法标注(Grammatical Tagging)或词类消疑(Word-category Disambiguation),是将语料库内单词的词性按其含义和上下文内容进行标记的文本数据处理技术。通过词性标注处理,可以将分词得到的词序列中每个单词标注一个正确的词性。

在Jieba工具中,调用jieba.posseg.POSTokenizer(tokenizer=None)函数新建自定义分词器。tokenizer参数可指定内部使用的jieba.Tokenizer分词器,jieba.posseg.dt为默认词性标注分词器。Jieba工具采用和Ictclas 兼容的标记法,标注句子分词后每个词的词性通过循环输出。Jieba工具的各个词性及含义如下表:

巧记词性对照表
名词 (1个一类,7个二类,5个三类)
名词分为以下子类:

时间词(1个一类,1个二类)

处所词(1个一类)

方位词(1个一类)

动词(1个一类,9个二类)

形容词(1个一类,4个二类)

区别词(1个一类,2个二类)

状态词(1个一类)

代词(1个一类,4个二类,6个三类)

数词(1个一类,1个二类)

量词(1个一类,2个二类)

副词(1个一类)

介词(1个一类,2个二类)

连词(1个一类,1个二类)

助词(1个一类,15个二类)

叹词(1个一类)

语气词(1个一类)

拟声词(1个一类)

前缀(1个一类)

后缀(1个一类)

字符串(1个一类,2个二类)

标点符号(1个一类,16个二类)

官方文档给出的示例如下所示,通过“import jieba.posseg as pseg”语句导入扩展包,接着循环输出word(词语)和flag(词性)值。

#官方例程
#encoding=utf-8
import jieba.posseg as pseg#词性标注
words = pseg.cut("我爱北京天安门")
for word, flag in words:print('%s %s' % (word, flag))

输出结果如图所示,其中“我”表示代词,对应“r”;“爱”对应动词,对应“v”,“北京”和“天安门”对应地点名词,对应“ns”。

上面小节的示例对应的词性标注代码如下所示。

#encoding=utf-8
import jieba
import jieba.posseg
import jieba.analysetext = "小杨在贵州财经大学工作,擅长大数据、云计算,喜欢乾清宫、黄果树瀑布等景区。"#导入自定义词典
jieba.load_userdict("dict.txt")#添加自定义词语
jieba.add_word("小杨")
jieba.add_word("黄果树瀑布")
#调节词频
jieba.suggest_freq('大数据', True)#精确模式
data = jieba.cut(text, cut_all=False)
print("[原始文本]: ", text, "\n")
print("[精确模式]: ", "/".join(data), "\n")#词性标注
sentence_seged = jieba.posseg.cut(text)
outstr = ' '
for x in sentence_seged:outstr += '\n'+"{}/{}  ".format(x.word, x.flag)
print('[词性标注]:', outstr)

输出结果如图所示:

4、 关键词提取(jieba.analyse.extract_tags)

关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来。这个可以追溯到文献检索初期,当时还不支持全文搜索的时候,关键词就可以作为搜索这篇论文的词语。因此,目前依然可以在论文中看到关键词这一项。

除了这些,关键词还可以在文本聚类、分类、自动摘要等领域中有着重要的作用。比如在聚类时将关键词相似的几篇文档看成一个团簇,可以大大提高聚类算法的收敛速度;从某天所有的新闻中提取出这些新闻的关键词,就可以大致了解那天发生了什么事情;或者将某段时间内几个人的微博拼成一篇长文本,然后抽取关键词就可以知道他们主要在讨论什么话题。

总之,关键词就是最能够反映出文本主题或者意思的词语。但是网络上写文章的人不会像写论文那样告诉你本文的关键词是什么,这个时候就需要利用计算机自动抽取出关键词,算法的好坏直接决定了后续步骤的效果。

关键词抽取从方法来说大致有两种:

目前大多数领域无关的关键词抽取算法(领域无关算法的意思就是无论什么主题或者领域的文本都可以抽取关键词的算法)和它对应的库都是基于后者的。从逻辑上说,后者比前着在实际使用中更有意义。

从算法的角度来看,关键词抽取算法主要有两类:

jieba分词系统中实现了两种关键词抽取算法,分别是基于TF-IDF关键词抽取算法和基于TextRank关键词抽取算法,两类算法均是无监督学习的算法,下面将会通过实例讲解介绍如何使用jieba分词的关键词抽取接口以及通过源码讲解其实现的原理。

①基于TF-IDF:jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
②基于TextRank:jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))

 TF-IDF算法应用到关键词抽取:

1. 预处理,首先进行分词和词性标注,将满足指定词性的词作为候选词;
2. 分别计算每个词的TF-IDF值;
3. 根据每个词的TF-IDF值降序排列,并输出指定个数的词汇作为可能的关键词;

TextRank算法应用到关键词抽取:

1. 预处理,首先进行分词和词性标注,将单个word作为结点添加到图中;
2. 设置语法过滤器,将通过语法过滤器的词汇添加到图中;出现在一个窗口中的词汇之间相互形成一条边;
3. 基于上述公式,迭代直至收敛;一般迭代20-30次,迭代阈值设置为0.0001;
4. 根据顶点的分数降序排列,并输出指定个数的词汇作为可能的关键词;
5. 后处理,如果两个词汇在文本中前后连接,那么就将这两个词汇连接在一起,作为关键短语;

<1>基于TF-IDF算法进行关键词抽取的示例代码如下所示,

from jieba import analyse# 引入TF-IDF关键词抽取接口
tfidf = analyse.extract_tags# 原始文本
text = "线程是程序执行时的最小单位,它是进程的一个执行流,\是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,\线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。\线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。\同样多线程也可以实现并发操作,每个请求分配一个线程来处理。"# 基于TF-IDF算法进行关键词抽取
keywords = tfidf(text,topK=20,withWeight=True)
print("keywords by tfidf:")
# 输出抽取出的关键词
for keyword in keywords:print(keyword[0],keyword[1])

控制台输出,

<2>基于TextRank算法进行关键词抽取的示例代码如下所示,

from jieba import analyse# 引入TextRank关键词抽取接口
textrank = analyse.textrank# 原始文本
text = "线程是程序执行时的最小单位,它是进程的一个执行流,\是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,\线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。\线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。\同样多线程也可以实现并发操作,每个请求分配一个线程来处理。"# 基于TextRank算法进行关键词抽取
keywords = textrank(text,topK=20, withWeight=True)
print("\nkeywords by textrank:")
# 输出抽取出的关键词
for keyword in keywords:print(keyword[0], keyword[1])

控制台输出,

手把手教你Python3使用Jieba工具相关推荐

  1. 手把手教你查看常用理财工具

    手把手教你查看常用理财工具 同学们好,这节课我们来学习下如何查看理财工具的信息. 了解理财工具,最快捷的方法就是在行情软件或者网站上查看.不过里面的信息太多,很容易让刚开始接触理财的同学眼花缭乱.其实 ...

  2. python广州地图_手把手教你用Python+可视化工具制作漂亮地图

    作者:J哥 这次呢,我想讲讲地图可视化的内容,以前我也写过用Python的内置库绘制地图,但总感觉不够美观.如何才能在短时间内制作漂亮的可视化地图呢,我觉得Python+可视化工具是不错的选择. 以下 ...

  3. 手把手教你用Python+可视化工具制作漂亮地图

    这次呢,我想讲讲地图可视化的内容,以前我也写过用Python的内置库绘制地图,但总感觉不够美观.如何才能在短时间内制作漂亮的可视化地图呢,我觉得Python+可视化工具是不错的选择. 以下动态可视化地 ...

  4. 动态规划python_手把手教你用Python+可视化工具制作漂亮地图

    公众号后台回复"图书",了解更多号主新书内容 作者:J哥 来源:菜J学Python 这次呢,我想讲讲地图可视化的内容,以前我也写过用Python的内置库绘制地图,但总感觉不够美观. ...

  5. js制定一个单选按钮_【下】每个月整理发票太头疼?手把手教你快速开发一个工具解决!...

    "NightTeam",一个值得加星标的公众号. 在上篇中,我们已经将我们的发票管理工具开发到了能一键导入发票.能看到效果.能仍然不太方便地管理的状态,接下来我们来继续将还没有加进 ...

  6. 软件测试 | 手把手教你快速掌握 Monkey 工具,指令参数+APK集合测试

    做过压力测试的同朋友应该对monkey工具都不陌生! Monkey是AndroidSDK中附带的一个工具.可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流,实现对正在开发的应用进行压力( ...

  7. 手把手教你静态代码检查工具TscanCode安装与使用

    下载地址: 链接:https://pan.baidu.com/s/1c04UZvwRrPGpoei2Js8tkA  提取码:gen8  --来自百度网盘超级会员V5的分享 一.安装 1.通过以上下载链 ...

  8. 手机上的便签怎么用 手把手教你使用便签工具

    不少使用智能手机的人,都会发现手机里有一个便签小工具.便签工具是干嘛的,怎么使用呢?现在小编就来告诉你,便签的基本作用和一些不为人知的作用,现在一起来看看便签该怎么使用吧! 便签的主要作用就是记事.备 ...

  9. 手把手教你Charles抓包工具使用(建议收藏)

    目录:导读 Charles简介 Charles主要功能 开始抓包 安装 web抓包 Charles下配置 App抓包 抓取手机HTTPS协议 Charles过滤 弱网测试 Charles配置弱网设置 ...

最新文章

  1. debian10 chrony简单配置
  2. Java知多少(29)覆盖和重载
  3. python【力扣LeetCode算法题库】836- 矩形重叠
  4. 利用PowerDesigner比较2个数据库
  5. torch Dataset类
  6. 以Java的视角来聊聊BIO、NIO与AIO的区别
  7. 通过改进视频质量评估提升编码效率
  8. Linux底层网络编程--ARP,PING等
  9. Android UI ActionBar功能-ActionBarProvider的使用
  10. python中怎么取整数案例题_python中如何取整数
  11. 使用 matlab 数字图像处理(二)—— 直方图均衡化(极简实现)
  12. python通讯录管理程序的用户可行性_通讯录管理系统可行性分析报告
  13. 教你记录借还款,查看收支账户记录
  14. deepin20.7安装mysql8.0.30教程
  15. 2014南京甲骨文实习生面试
  16. UE4-4.26蓝图功能实现:按键升降电梯
  17. ORACLE EBS常用标准表结构
  18. Web前端期末大作业-网上订餐系统网站设计模板(HTML+CSS+JS)
  19. 数学建模第一讲:层次分析法
  20. 2021 CCF CSP-J2

热门文章

  1. vue部署到nginx--history路由方式
  2. 火柴棍等式(NOIP)
  3. excel打印预览在哪里_Excel中如何设置自动分页打印
  4. 华为笔记本MateBook D14 开箱
  5. MySQL开发技巧 第二禅(子查询中匹配两个值、解决同属性多值过滤的问题、计算累进税的问题)
  6. Linux环境工作笔记(一)
  7. 如何做好网络品牌推广?
  8. U盘安装CentOS 6.4及修改默认启动顺序
  9. 【国科GK6525】OTA全包升级调试经过
  10. 利用VDP实现vsphere虚拟机备份