jieba库词频统计_自然语言处理基础2 -- jieba分词用法及原理

本文深入解析jieba分词的使用方法和原理,包括分词模式、自定义词典、关键词提取、词性标注等功能,并探讨其在处理新词时的HMM算法应用。通过对jieba源码的分析,有助于理解分词技术和HMM模型。
摘要由CSDN通过智能技术生成

cef4307ad8a721f256d0b7086adc30a2.png

1 概述

上篇文章我们分析了自然语言处理,特别是中文处理中,分词的几个主要难点。为了解决这些难点,我们提出了基于字符串匹配的算法和基于统计的分词算法。针对当前的几种分词引擎,我们对其分词准确度和速度进行了评估。jieba分词作为一个开源项目,在准确度和速度方面均不错,是我们平时常用的分词工具。本文将对jieba分词的使用方法以及原理进行讲解,便于我们在理解jieba分词原理的同时,加深对前文讲解的分词难点和算法的理解。

2 jieba分词用法

jieba分词是一个开源项目,地址为

https://github.com/fxsjy/jieba​github.com

它在分词准确度和速度方面均表现不错。其功能和用法如下。

2.1 分词

支持三种分词模式

# encoding=utf-8
import jieba
​
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式
​
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式
​
seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))
​
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))
​

输出为

【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
​
【精确模式】: 我/ 来到/ 北京/ 清华大学
​
【新词识别】:他, 来到, 了, 网易, 杭研, 大厦    (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)
​
【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
​

2.2 添加自定义词典

主要是为了解决新词问题,jieba分词基于HMM算法会自动识别新词,但用户如果能直接给出新词,则准确率会更高。 使用起来很简单,我们先创建一个文件,比如user_dict.txt,其中每一行代表一个新词,分别为词语,词频,词性。如下:

创新办 3 i
云计算 5
凱特琳 nz
台中
​

然后在代码中分词前,加载这个自定义词典即可。

jieba.load_userdict("user_dict.txt")
​

加载自定义词典的分词效果:

之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /
​
加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
​

2.3 调整词典

# 1 使用del_word()使得某个词语不会出现
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中将/出错/。
​
jieba.del_word("中将")
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中/将/出错/。
​
# 2 使用add_word()添加新词到字典中
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台/中/」/正确/应该/不会/被/切开
​
jieba.add_word("台中")
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台中/」/正确/应该/不会/被/切开
​
# 3 使用suggest_freq()调整某个词语的词频,使得其在设置的词频高是能分出,词频低时不能分出
jieba.suggest_freq('台中', True)
69
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台中/」/正确/应该/不会/被/切开
​

2.4 关键词提取

关键词提取,将文本中最能表达文本含义的词语抽取出来,有点类似于论文的关键词或者摘要。关键词抽取可以采取:

基于TF-IDF的关键词抽取算法,目标是获取文本中词频高,也就是TF大的,且语料库其他文本中词频低的,也就是IDF大的。这样的词可以作为文本的标志,用来区分其他文本。

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

基于TextRank的关键词抽取算法步骤为,

  1. 先将文本进行分词和词性标注,将特定词性的词(比如名词)作为节点添加到图中。
  2. 出现在一个窗口中的词语之间形成一条边,窗口大小可设置为2~10之间,它表示一个窗口中有多少个词语。
  3. 对节点根据入度节点个数以及入度节点权重进行打分,入度节点越多,且入度节点权重大,则打分高。
  4. 然后根据打分进行降序排列,输出指定个数的关键词。
from jieba import analyse
# 引入TextRank关键词抽取接口
textrank = analyse.textrank
​
# 原始文本
text = "线程是程序执行时的最小单位,它是进程的一个执行流,
        是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,
        线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。
        线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。
        同样多线程也可以实现并发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值