jieba中文处理[分词、关键词抽取(TF-IDF 算法)(TextRank 算法)]_CodingPark编程公园

文章介绍

jieba是一个非常好用的中文工具,是以分词起家的,但是功能比分词要强大很多。
本文讲述 jieba 的一些用法 包括:分词、关键词抽取(TF-IDF 算法)(TextRank 算法)等

知识扩充

jieba支持繁体字
比jieba更准确更高端的库 :NLPIR
工业界自然语言处理库 :spaCy

知识讲解

import jieba

'''
<h1>        分词        </h1>
'''

'''
📒
jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)

jieba.cut 方法接受三个输入参数:

需要分词的字符串
cut_all 参数用来控制是否采用全模式
HMM 参数用来控制是否使用 HMM 模型
jieba.cut_for_search 方法接受两个参数

需要分词的字符串
是否使用 HMM 模型。

一般切词: .cut      .lcut

搜索引擎切词:.cut_for_search    .lcut_for_search (粒度比较细)(该方法适合用于搜索引擎构建倒排索引的分词)

⚠️ print('s1 ---> ',st1) 给出的不是真实文字内容;print("默认模式 : " + '/'.join(st1))才是;
'''
st1 = jieba.cut("我爱学习自然语言处理", cut_all = True)

# ' '.join() : 将序列中的元素以指定的字符连接生成一个新的字符串
print('s1 ---> ',st1)
print('s1Type ---> ',type(st1)) # Python高级特性 生成器(generator)
print("全模式 : " + "/ ".join(st1))                                  # 全模式

st1 = jieba.cut("我爱学习自然语言处理", cut_all=False)
print("精确模式 : " + "/ ".join(st1))                                # 精确模式

st2 = jieba.cut("我爱学习自然语言处理")                               # 默认是精确模式
print("默认模式 : " + '/'.join(st2))

st3 = jieba.cut_for_search('我爱学习自然语言处理')                     # 搜索引擎模式
print("搜索引擎模式 方法1 :" + '/'.join(st3))
print("搜索引擎模式 方法2 :" + '/'.join(jieba.cut_for_search('我爱学习自然语言处理')))


'''
📒   jieba.lcut以及jieba.lcut_for_search直接返回 list

'''
st1_list = jieba.lcut('我爱学习自然语言处理')
print('st1_list ---> ', st1_list)
print('st1_listType ---> ', type(st1_list))
print('st1_list 使用 .join ---> ', '/'.join(st1_list))


结果显示:
…/PycharmProjects/PyTorch/RegularExpression/jieba_test.py
Building prefix dict from the default dictionary …
s1 —> <generator object Tokenizer.cut at 0x110f2f850>
s1Type —> <class ‘generator’>
Loading model from cache /var/folders/0x/jdlslqrx4bxfqgzbxww5tp680000gn/T/jieba.cache
Loading model cost 0.782 seconds.
Prefix dict has been built succesfully.
全模式 : 我/ 爱/ 学习/ 自然/ 自然语言/ 语言/ 处理
精确模式 : 我/ 爱/ 学习/ 自然语言/ 处理
默认模式 : 我/爱/学习/自然语言/处理
搜索引擎模式 方法1 :我/爱/学习/自然/语言/自然语言/处理
搜索引擎模式 方法2 :我/爱/学习/自然/语言/自然语言/处理
st1_list —> [‘我’, ‘爱’, ‘学习’, ‘自然语言’, ‘处理’]
st1_listType —> <class ‘list’>
st1_list 使用 .join —> 我/爱/学习/自然语言/处理

Process finished with exit code 0


添加用户自定义词典

HMM 模型 <简短介绍>

HMM 模型,即隐马尔可夫模型(Hidden Markov Model, HMM),是一种基于概率的统计分析模型,用来描述一个系统隐性状态的转移和隐性状态的表现概率。建议一般情况下开启HHM,但动态添加自定义用户词典时,需关闭HMM 否则可能会出现添加信息被忽略,也就是起不到作用。

'''
添加用户自定义词典

📒很多时候我们需要针对自己的场景进行分词,会有一些领域内的专有词汇。
1.可以用jieba.load_userdict(file_name)加载用户字典
2.少量的词汇可以自己用下面方法手动添加:
用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程序中动态修改词典
用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
'''
import jieba

or_diy_st1 = '这句话如果放在旧字典中将出错'
diy_st1 = jieba.cut(or_diy_st1)
print('diy_st1 ---> ',diy_st1)
print('diy_st1没有加用户字典 ---> ', '/'.join(diy_st1))

# 添加用户字典
jieba.suggest_freq(('中', '将'), True)
diy_st2 = jieba.cut(or_diy_st1,HMM=True)
diy_st3 = jieba.cut(or_diy_st1,HMM=False)
print('diy_st1 佩戴用户字典 & HMM=True ---> ', '/'.join(diy_st2))
print('diy_st1 佩戴用户字典 & HMM=False ---> ', '/'.join(diy_st3))

结果显示:
diy_st1 —> <generator object Tokenizer.cut at 0x110da9e50>
diy_st1没有加用户字典 —> 这句/话/如果/放在/旧/字典/中将/出错
diy_st1 佩戴用户字典 & HMM=True —> 这句/话/如果/放在/旧/字典/中/将/出错
diy_st1 佩戴用户字典 & HMM=False —> 这/句/话/如果/放在/旧/字典/中/将/出错


关键词提取

基于 TF-IDF 算法的关键词抽取

词频(Term Frequency,缩写为TF):出现次数最多的词
在这里插入图片描述
如果某个词比较少见,但是它在这篇文章中多次出现,
那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。
“逆文档频率”(IDF)
在这里插入图片描述
TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比


'''
关键词提取

📒基于 TF-IDF 算法的关键词抽取
import jieba.analyse

用法:jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选

关于TF-IDF 算法的关键词抽取补充
关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径
用法: jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径
关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径
用法: jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径

⚠️具体的词性对照表参见  计算所汉语词性标记集
'''
import jieba
import jieba.analyse as analyse

NBAreadTF = open('NBA.txt').read()
print("NBAreadTF ---> "+" ".join(analyse.extract_tags(NBAreadTF, topK=20, withWeight=False, allowPOS=())))
print()
GameofThronesreadTF = open('GameofThrones.txt').read()
jieba.del_word('自己')
print("GameofThronesreadTF ---> "+" ".join(analyse.extract_tags(GameofThronesreadTF, topK=20, withWeight=False, allowPOS=())))


结果显示:
NBAreadTF —> 韦少 杜兰特 全明星 全明星赛 MVP 威少 正赛 科尔 投篮 勇士 球员 斯布鲁克 更衣柜 NBA 三连庄 张卫平 西部 指导 雷霆 明星队

GameofThronesreadTF —> … 萧恩 萧雪 什么 维克多 韦斯特 … 老雷 一个 洛城 我们 现在 佩妮 知道 萧世平 这个 就是 贝克 唐纳德 可以


基于 TextRank 算法的关键词抽取
'''
基于 TextRank 算法的关键词抽取

📒 jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
jieba.analyse.TextRank() 新建自定义 TextRank 实例
算法论文: TextRank: Bringing Order into Texts

基本思想:
将待抽取关键词的文本进行分词
以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
计算图中节点的PageRank,注意是无向带权图

'''
import jieba.analyse as analyse
NBAreadTR = open('NBA.txt').read()
print("NBAreadTR ---> "+" ".join(analyse.textrank(NBAreadTR, topK=20, withWeight=False, allowPOS=('ns', 'n'))))


结果显示:
NBAreadTR —> 勇士 正赛 全明星赛 指导 投篮 玩命 时间 对方 现场 结果 球员 嘉宾 时候 全队 主持人 照片 全程 目标 快船队 肥皂剧


词性标注

'''
词性标注

jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。

'''
import jieba.posseg as pseg

st = pseg.cut("我爱自然语言处理")
for word,flag in st:
    print(word,flag)

结果显示:
我 r
爱 v
自然语言 l
处理 v


并行分词

原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升 基于 python 自带的 multiprocessing 模块。

用法:
jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数
jieba.disable_parallel() # 关闭并行分词模式

import sys
import time
import jieba

jieba.enable_parallel()
content = open(u'西游记.txt',"r").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))
t2 = time.time()
tm_cost = t2-t1
print('并行分词速度为 %s bytes/second' % (len(content)/tm_cost))

jieba.disable_parallel()
content = open(u'西游记.txt',"r").read()
t1 = time.time()
words = "/ ".join(jieba.cut(content))
t2 = time.time()
tm_cost = t2-t1
print('非并行分词速度为 %s bytes/second' % (len(content)/tm_cost))

结果显示:
并行分词速度为 830619.50933 bytes/second
非并行分词速度为 259941.448353 bytes/second’


ChineseAnalyzer for Whoosh 搜索引擎

from __future__ import unicode_literals		# 必须在第一行
import jieba
import sys, os
from jieba.analyse import ChineseAnalyzer
sys.path.append("../")
from whoosh.index import create_in, open_dir
from whoosh.fields import *
from whoosh.qparser import QueryParser

analyzer = jieba.analyse.ChineseAnalyzer()
schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT(stored=True, analyzer=analyzer))

if not os.path.exists("tmp"):
    os.mkdir("tmp")

ix = create_in("tmp", schema)  # for create new index
# ix = open_dir("tmp") # for read only
writer = ix.writer()

writer.add_document(
    title="document1",
    path="/a",
    content="This is the first document we’ve added!"
)

writer.add_document(
    title="document2",
    path="/b",
    content="The second one 你 中文测试中文 is even more interesting! 吃水果"
)

writer.add_document(
    title="document3",
    path="/c",
    content="买水果然后来世博园。"
)

writer.add_document(
    title="document4",
    path="/c",
    content="工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
)

writer.add_document(
    title="document4",
    path="/c",
    content="咱俩交换一下吧。"
)

writer.commit()
searcher = ix.searcher()
parser = QueryParser("content", schema=ix.schema)

for keyword in ("水果世博园", "你", "first", "中文", "交换机", "交换"):
    print(keyword + "的结果为如下:")
    q = parser.parse(keyword)
    results = searcher.search(q)
    for hit in results:
        print(hit.highlights("content"))
    print("\n--------------我是神奇的分割线--------------\n")

for t in analyzer("我的好朋友是李明;我爱北京天安门;IBM和Microsoft; I have a dream. this is intetesting and interested me a lot"):
    print(t.text)


结果显示:
水果世博园的结果为如下:
水果然后来世博园

--------------我是神奇的分割线--------------

你的结果为如下:
second one 中文测试中文 is even more interesting

--------------我是神奇的分割线--------------

first的结果为如下:
first document we’ve added

--------------我是神奇的分割线--------------

中文的结果为如下:
second one 你 中文测试中文 is even more interesting

--------------我是神奇的分割线--------------

交换机的结果为如下:
干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作

--------------我是神奇的分割线--------------

交换的结果为如下:
咱俩交换一下吧
干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作

--------------我是神奇的分割线--------------



朋友

李明


北京
天安
天安门
ibm
microsoft
dream
intetest
interest
me
lot

在这里插入图片描述

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2020 CSDN 皮肤主题: 鲸 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值