分词模式
import jieba
text = "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
str = '/'
# 精确模式:试图将句子最精确地切开,适合文本分析
pattern_1 = jieba.cut(text,cut_all = False)
print('精确模式:',str.join(pattern_1))
pattern_2 = jieba.cut(text)
print('默认精确模式:',str.join(pattern_2))
# 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义
pattern_3 = jieba.cut(text,cut_all = True)
print('全模式:',str.join(pattern_3))
# 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词
pattern_4 = jieba.cut_for_search(text)
print('搜索引擎模式:',str.join(pattern_4))
运行结果如下:
精确模式: 工信处/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作
默认精确模式: 工信处/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作
全模式: 工信处/处女/女干事/干事/每月/月经/经过/下属/科室/都/要/亲口/口交/交代/24/口交/交换/交换机/换机/等/技术/技术性/性器/器件/的/安装/安装工/装工/工作
搜索引擎模式: 工信处/干事/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换/换机/交换机/等/技术/技术性/器件/的/安装/工作
基于HMM模型的中文分词
隐马尔可夫模型(Hidden Markov Model, HMM)是一种基于概率的统计分析模型,用来描述一个系统隐性状态的转移和隐性状态的表现概率。到目前为止,HMM模型被认为是解决大多数自然语言处理问题最为快速、有效的方法之一。它成功解决了语义识别、机器翻译等问题。
在Jieba工具中,对于未登录到词库的词,使用了基于汉字成词能力的 HMM 模型和 Viterbi 算法,其大致原理是采用四个隐含状态,分别表示为单字成词、词组的开头、词组的中间和词组的结尾。通过标注好的分词训练集,可以得到 HMM的各个参数,然后使用 Viterbi 算法来解释测试集,得到分词结果。
import jieba
sentence = "他来到了网易杭研大厦工作,我继续去北理读研"
str = '/'
pattern_1 = jieba.cut(sentence,HMM=False)
print('精确模式:',str.join(pattern_1))
pattern_2 = jieba.cut(sentence,HMM=True)
print('精确模式+HMM:',str.join(pattern_2))
运行结果
精确模式: 他/来到/了/网易/杭/研/大厦/工作/,/我/继续/去/北/理/读研
精确模式+HMM: 他/来到/了/网易/杭研/大厦/工作/,/我/继续/去/北理/读研
自定义词典
在进行中文分词过程中,通常会遇到一些专用词语无法精准的切分,比如“乾清宫”会被分割为“乾”、“清宫”,“黄果树瀑布”会被分割为“黄果树”、“瀑布”,“云计算”会被分割为“云”、“计算”,“贵州财经大学”会被分割为“贵州”、“财经大学”等。虽然Jieba工具有新词识别能力,但也无法识别出所有Jieba词库里没有的词语,但它为开发者提供了添加自定义词典功能,从而保证更好的分词正确率。其函数原型如下:
load_userdict(f)
该函数只有一个参数,表示载入的自定义词典路径,f 为文件类对象或自定义词典路径下的文件。词典的格式为:一个词占一行,每行分为三部分:
word freq word_type
其中,word为对应的词语,freq为词频(可省略),word_type为词性(可省了),中间用空格隔开,顺序不可以改变。注意,文件必须为UTF-8编码。
示例:
导入自定义词典,其本地词典命名为“dict.txt”,如图所示,包括设置“贵州财经大学”的词性为机构名词“nt”,“大数据”、“云计算”的词性为名词“n”,也有省略词性和词频的“乾清宫”。
import jieba
text = "杨秀璋在贵州财经大学工作,擅长大数据、云计算,喜欢乾清宫、黄果树瀑布等景区。"
# 原始精确模式
data_1 = jieba.cut(text,cut_all=False)
print("精确模式: ", " ".join(data_1))
#导入自定义词典
jieba.load_userdict("dictionaries.txt")
#精确模式
data_2 = jieba.cut(text, cut_all=False)
print("导入词典后的精确模式: ", " ".join(data_2)
运行结果
精确模式: 杨秀璋 在 贵州 财经大学 工作 , 擅长 大 数据 、 云 计算 , 喜欢 乾 清宫 、 黄果树 瀑布 等 景区 。
导入词典后的精确模式: 杨秀璋 在 贵州财经大学 工作 , 擅长 大数据 、 云计算 , 喜欢 乾清宫 、 黄果树 瀑布 等 景区 。
动态修改词典
#添加自定义词语
jieba.add_word("小杨")
jieba.add_word("黄果树瀑布")
jieba.add_word("自然语言处理", freq=10, tag="nz")
#删除自定义词语
jieba.del_word("北理工")
词性标注
词性标注(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工具的各个词性及含义。
代码示例:
import jieba.posseg as pseg
sentence = "我们喜欢支付宝,苹果"
keywords = pseg.cut(sentence)
for kw in keywords:
print('%s %s' % (kw.word, kw.flag))
运行结果:
我们 r
喜欢 v
支付宝 nr
, x
苹果 n
提取关键字
基于TF-IDF算法进行关键词抽取
关于TF-IDF算法介绍,这篇文章写的很好,不赘述https://blog.csdn.net/asialee_bird/article/details/81486700,我们只探讨jieba分词实现TF-IDF算法
from jieba import analyse
# 基于TF-IDF算法进行关键词抽取
# 引入TF-IDF关键词抽取接口
tfidf =analyse.extract_tags
# 原始文本
text = "线程是程序执行时的最小单位,它是进程的一个执行流,\
是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,\
线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。\
线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。\
同样多线程也可以实现并发操作,每个请求分配一个线程来处理。"
# 基于TF-IDF算法进行关键词抽取
keywords = tfidf(text)
for keyword in keywords:
print(keyword)
运行结果:
线程
CPU
进程
调度
多线程
程序执行
每个
执行
堆栈
局部变量
单位
并发
分派
一个
共享
请求
最小
可以
允许
分配
词频统计
import jieba
text = "线程是程序执行时的最小单位,它是进程的一个执行流,\
是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,\
线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。\
线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。\
同样多线程也可以实现并发操作,每个请求分配一个线程来处理。"
words = jieba.lcut(text)
counts = {}
for word in words:
if len(word) == 1:
continue
else:
counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True)
for i in range(15):
word, count = items[i]
print("{0:<10}{1:>5}".format(word, count))
运行结果:
线程 7
进程 3
一个 3
CPU 3
单位 2
执行 2
调度 2
可以 2
每个 2