jieba分词学习记录

jieba分词

分词

import jieba

str = '贾跃亭来到北京清华大学'

a = jieba.cut(str,cut_all=False,HMM=True)
b = jieba.cut(str,cut_all=True ,HMM=True) # cut_all=True 全模式
c = jieba.cut(str,cut_all=False,HMM=False)
d = jieba.cut(str,cut_all=True ,HMM=False)
e = jieba.lcut(str,cut_all=True ,HMM=False)
f = jieba.cut_for_search(str) #搜索引擎模式

print (a) #返回的是一个生成器(这对大数据量数据的分词尤为重要)
print (e) #lcut返回的是一个列表
print ("/ ".join(a))
print ("/ ".join(b))
print ("/ ".join(c))
print ("/ ".join(d))
print ("/ ".join(e))
print ("/ ".join(f))
<generator object Tokenizer.cut at 0x7f5d6d6d1518>
['贾', '跃', '亭', '来到', '北京', '清华', '清华大学', '华大', '大学']
贾跃亭/ 来到/ 北京/ 清华大学
贾/ 跃/ 亭/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
贾/ 跃/ 亭/ 来到/ 北京/ 清华大学
贾/ 跃/ 亭/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
贾/ 跃/ 亭/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
贾跃亭/ 来到/ 北京/ 清华/ 华大/ 大学/ 清华大学

三个参数:

  • 需要分词的字符串;
  • cut_all 参数用来控制是否采用全模式;>>>>cut_all=False 默认模式,不使用全模式
  • HMM 参数用来控制是否使用 HMM 模型;
全模式默认模型(精确模型)搜索引擎模式
试图将句子最精确地切开,适合文本分析,输出的是所有可能的分词组合比如清华大学,会被分成:清华,清华大学,华大,大学把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义,比如清华大学,只会输出清华大学在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

- cut_all=True, HMM=_对应于全模式,即所有在词典中出现的词都会被切分出来,实现函数为__cut_all
- cut_all=False, HMM=False对应于精确模式且不使用HMM;按Unigram语法模型找出联合概率最大的分词组合,实现函数为__cut_DAG
- cut_all=False, HMM=True对应于精确模式且使用HMM;在联合概率最大的分词组合的基础上,HMM识别未登录词,实现函数为__cut_DAG_NO_HMM

添加自定义词典/动态调整词典

import jieba

print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
print(jieba.suggest_freq(('中', '将'), True))
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))

print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
print(jieba.suggest_freq('台中', True))
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
如果/放到/post/中将/出错/。
494
如果/放到/post/中/将/出错/。
「/台/中/」/正确/应该/不会/被/切开
69
「/台中/」/正确/应该/不会/被/切开

关键词提取

import jieba
import jieba.analyse

s = "鉴于这个设定,可以看到出门问问的设计团队在小心围绕着功能多又不能跟AirPods完全撞车的这么个理念来做这款产品。它的盒子是一个胶囊形状,耳机横放在其中充电,打开进入配对状态,外形则是入耳款,官方强调怎么甩都不掉;还有IP5X级别的防水功能;打开瞬间启动耳机;带上放歌,拿下暂停,再带上继续。"
for x, w in jieba.analyse.extract_tags(s, withWeight=True):
    print('%s %s' % (x, w))#TF-IDF

for x, w in jieba.analyse.textrank(s, withWeight=True):
    print('%s %s' % (x, w))#TextRank
#TF-IDF
耳机 0.3611468517484615
带上 0.2969484999353846
放歌 0.24619356467884618
打开 0.23331866727192307
AirPods 0.2298993750557692
IP5X 0.2298993750557692
功能 0.21199124926384616
入耳 0.2012825086057692
撞车 0.1959058766403846
配对 0.18646125062653846
防水 0.17914827256365384
胶囊 0.1785684064448077
充电 0.1772797389394231
盒子 0.16421895165903846
拿下 0.15994579506134615
设定 0.15472318711096153
这款 0.15439538197115385
瞬间 0.15370374449634616
问问 0.14996382802615385
暂停 0.1460813240298077
#TextRank
打开 1.0
耳机 0.9423677601733221
功能 0.863821618000734
带上 0.7836900471038877
设计 0.7192470995546825
出门 0.6225588459319535
团队 0.5992280618842792
启动 0.5894828446592968
配对 0.5830656424801997
进入 0.5816762307781237
充电 0.567067915542485
级别 0.5481829479772666
形状 0.5393498034396065
防水 0.5191169691281164
看到 0.5164778443892695
外形 0.5125561990157166
放歌 0.50381092985838
强调 0.5010854647352813
问问 0.49912969745860775
小心 0.4894394602293442

获得词性|词性标注

import jieba
import jieba.posseg

str = "可以看到出门问问的设计团队在小心围绕着功能多又不能跟AirPods完全撞车的这么个理念来做这款产品。"
words = jieba.posseg.cut(str)
for word, flag in words:
    print('%s %s' % (word, flag))
可以 c
看到 v
出门 v
问问 n
的 uj
设计 vn
团队 n
在 p
小心 n
围绕 v
着 uz
功能 n
多 m
又 d
不能 v
跟 p
AirPods eng
完全 ad
撞车 v
import jieba
import jieba.posseg

str = "可以看到出门问问的设计团队在小心围绕着功能多又不能跟AirPods完全撞车的这么个理念来做这款产品。"
words = jieba.posseg.cut(str)
# for word, flag in words:
#     print('%s %s' % (word, flag))

for x in words:
    if x.flag.startswith('v'):#筛选只输出其中的名词
        print (x.word,x.flag)
看到 v
出门 v
设计 vn
围绕 v
不能 v
撞车 v
来 v
做 v

使用用户字典提高分词准确性

import jieba

txt = u'欧阳建国是创新办主任也是欢聚时代公司云计算方面的专家'
print (','.join(jieba.cut(txt)))

f = open('/home/sun/Python_learn/Learn_jieba/a.txt', 'rb') #注意路径
jieba.load_userdict(f)
print (','.join(jieba.cut(txt)))
#a.txt
云计算 5
创新办 3 i
easy_install 3 eng
好用 300
韩玉赏鉴 3 nz
八一双鹿 3 nz
欢聚时代 2
欧阳建国 1

#用户字典每行一个词,格式为:
#词语 词频 词性
#其中词频是一个数字,词性为自定义的词性,要注意的是词频数字和空格都要是半角的。
欧阳,建国,是,创新,办,主任,也,是,欢聚,时代,公司,云,计算,方面,的,专家
欧阳建国,是,创新办,主任,也,是,欢聚时代,公司,云计算,方面,的,专家

并行分词

import jieba

#txt = open('/home/sun/Python_learn/Learn_jieba/589965.txt', 'rb')
txt = open('/home/sun/Python_learn/Learn_jieba/589965.txt').read()
print (len(txt))

jieba.enable_parallel(100)
txt_words = [x for x in jieba.cut(txt) if len(x) >= 2]
jieba.disable_parallel()

from collections import Counter
c = Counter(txt_words).most_common(20)#获取出现频率Top n的词
print (c)
241132
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.657 seconds.
Prefix dict has been built succesfully.
[('神南', 1394), ('战车', 1309), ('无双', 421), ('有些', 420), ('什么', 357), ('一个', 353), ('比赛', 343), ('知道', 322), ('对方', 316), ('他们', 304), ('就是', 271), ('没有', 255), ('直接', 251), ('自己', 241), ('云衣', 238), ('说道', 229), ('感觉', 224), ('不是', 223), ('瞬间', 222), ('这个', 221)]


如果词的长度改为>=1
[(' ', 19143), (',', 14393), ('\n', 9710), ('的', 7498), ('。', 3714), ('了', 3554), ('“', 2263), ('”', 2260), ('是', 1584), ('神南', 1394), ('!', 1331), ('他', 1325), ('战车', 1309), ('…', 1168), ('在', 1087), ('也', 981), ('你', 916), ('就', 902), ('我', 839), ('不', 739)

New

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

import jieba.analyse

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 为待提取的文本
    • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight 为是否一并返回关键词权重值,默认值为 False
    • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件

代码示例 (关键词提取)

https://github.com/fxsjy/jieba/blob/master/test/extract_tags.py

关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径

关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径

关键词一并返回关键词权重值示例

基于 TextRank 算法的关键词抽取

  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,接口相同,注意默认过滤词性。
  • jieba.analyse.TextRank() 新建自定义 TextRank 实例

算法论文: TextRank: Bringing Order into Texts

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

test/demo.py

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值