Python jieba切词基础实战

#coding=utf-8
'''
Created on 2017-12-11

jieba的主要功能
1.主要用于中文文本切词,如果碰到英文单词,也会以英文的默认形式切分
2.可以使用collections中的Counter对切词后的list进行一个topN操作获取最频繁词
3.提取关键词,提供了tf-idf和TextRank
切词注意事项:
1.使用jieba切词,如果发现有些词需要合并或者分开,则进行相应的操作。
2.在提取关键词时,需要注意停用词和过滤哪些词等。
'''

import jieba

# 结巴分词分为三种模式:精确模式(默认)、全模式和搜索引擎模式
# jieba.cut(cut_all=Flase, HMM=_)
# HMM表示是否使用HMM模型识别未登录的词,默认为Flase
# 精确模式,能解决歧义,把文本精确的分词(这里玉龙雪山完美分词,但是丽江古城并不能)
s = "我去云南旅游,不仅去了玉龙雪山,还去丽江古城,很喜欢丽江古城,I am learning SVM_model"
cut = jieba.cut(s)
# print type(cut)
# <type 'generator'>,返回的是一个生成器
print ','.join(cut)
# 我,去,云南旅游,,,不仅,去,了,玉龙雪山,,,还,去,丽江,古城,,,很,喜欢,丽江,古城,,,I, ,am, ,learning, ,SVM,_,model

# 全模式,把文本分成尽可能多的词
s = "我去云南旅游,不仅去了玉龙雪山,还去丽江古城,很喜欢丽江古城"
cut = jieba.cut(s,cut_all = True)
# print ','.join(cut)
# 我,去,云南,云南旅游,旅游,,,不仅,去,了,玉龙,玉龙雪山,雪山,,,还,去,丽江,古城,,,很,喜欢,丽江,古城

# 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词
s = "我去云南旅游,不仅去了玉龙雪山,还去丽江古城,很喜欢丽江古城"
cut = jieba.cut_for_search(s)
# print ','.join(cut)
# 我,去,云南,旅游,云南旅游,,,不仅,去,了,玉龙,雪山,玉龙雪山,,,还,去,丽江,古城,,,很,喜欢,丽江,古城

# 获取词性
import jieba.posseg as psg
s = "我去云南旅游,不仅去了玉龙雪山,还去丽江古城,很喜欢丽江古城"
words = psg.cut(s)
# for word in words:
#     print word.word,word.flag

# 并行分词
#  基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows。
# 开启并行分词模式,参数为并行进程数
# jieba.enable_parallel(4) 
# 关闭并行分词模式
# jieba.disable_parallel() 

# 返回词语在原文的起止位置
# result = jieba.tokenize(u"玉龙雪山")
# for tk in result:
#     print("%s \t start at: %d \t end at: %d" %(tk[0], tk[1], tk[2]))

# 自定义词典
# jieba的自带词典位置例如D:\Python27\Lib\site-packages\jieba\dict.txt,内容格式为词语,次数(优先级,可省略),词性(可省略)
# 不知道为啥在dict.txt中自定义自己一个词无效,所以自定义一个词典custom.txt,添加"丽江古城"后
# 可以使用jieba.load_userdict("D:\\Python27\\Lib\\site-packages\\jieba\\custom.txt")
# 如果想单独使用自己定义的词典,使用jieba.set_dictionary("D:\\Python27\\Lib\\site-packages\\jieba\\custom.txt"),这里在custom.txt中加了丽江古城
jieba.load_userdict("D:\\Python27\\Lib\\site-packages\\jieba\\custom.txt")
s = "我去云南旅游,不仅去了玉龙雪山,还去丽江古城,很喜欢丽江古城"
cut = jieba.cut(s)
# print ','.join(cut)
# 我,去,云南旅游,,,不仅,去,了,玉龙雪山,,,还,去,丽江古城,,,很,喜欢,丽江古城

# 动态增加和删除词典
s = "我喜欢看最强大脑"
jieba.add_word("最强大脑", freq = 20000, tag = None)
# jieba.del_word("最强")
cut = jieba.cut(s)
# print ','.join(cut)
# 我,喜欢,看,最强大脑

# 获取出现频率Top n的词
from collections import Counter
s = "我去云南旅游,不仅去了玉龙雪山,还去丽江古城,很喜欢丽江古城"
cut = jieba.cut(s)
words = list(cut)
topns = Counter(words).most_common(20)
for top in topns:
    print top[0],top[1]
# , 3
# 去 3
# 丽江古城 2
# 不仅 1
# 了 1
# 很 1
# 云南旅游 1
# 我 1
# 玉龙雪山 1
# 喜欢 1
# 还 1   

# 关键词提取,TF-IDF,TextRank
import jieba.analyse

# TF-IDF
# jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
# –sentence 为待提取的文本
# –topK 为返回几个 TF*IDF 权重最大的关键词,默认值为 20
# –withWeight 为是否一并返回关键词权重值,默认值为 False
# –allowPOS 仅包括指定词性的词,默认值为空,即不筛选
# extract_tags方法是通过计算tf*idf返回关键词权重,其中
# tf为sentence中的词频
# jieba.analyse.idf为D:\Python27\Lib\site-packages\jieba\analyse\idf.txt中记录的数据,(而没有出现在idf.txt中的词,默认值目前博主也没有明白,总之也比较大)
seg = jieba.analyse.extract_tags(s, topK = 20, withWeight = True)
for tag, weight in seg:
    print "%s %s" %(tag, weight)
cut = jieba.cut(s)
words = list(cut)
print len(words)
# , 3
# 去 3
# 丽江古城 2
# 不仅 1
# 了 1
# 很 1
# 云南旅游 1
# 我 1
# 玉龙雪山 1
# 喜欢 1
# 还 1   
# 丽江古城 3.98492250097
# 云南旅游 2.31677960867
# 玉龙雪山 1.8174908964
# 喜欢 0.950431400503
# 不仅 0.836983596712
# 16
# 虽然分词后的数量为16,但是在计算tf值(词频)的时候,会先将停用词(',','去','了','很','我','还')去掉,
# 原因在源代码tfidf.py中有一句if len(wc.strip()) < 2 or wc.lower() in self.stop_words:,这些字符都小于2
# 然后再计算tf值,所以这里云南旅游2.31677960867 = 1/6 * 13.900677652

# 把丽江古城的idf=0.11111111加入idf.txt文件,然后再使用
jieba.analyse.set_idf_path("D:\\Python27\\Lib\\site-packages\\jieba\\analyse\\newidf.txt")
seg = jieba.analyse.extract_tags(s, topK = 20, withWeight = True)
for tag, weight in seg:
    print "%s %s" %(tag, weight)
# 云南旅游 2.31677960867
# 玉龙雪山 1.8174908964
# 喜欢 0.950431400503
# 不仅 0.836983596712
# 丽江古城 0.0370370366667

# 还可以设置停用词进行过滤
# 默认的过滤可以在源代码D:\Python27\Lib\site-packages\jieba\analyse\tfidf.py中查看,
# 英文有默认的停用词STOP_WORDS变量,还有if len(wc.strip()) < 2 or wc.lower() in self.stop_words:的过滤
# 也可以将过滤词写入文件中,然后调用
# jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径

# jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件,还不知实际用法


# # TF-IDF和TextRank关键词提取比较,在网上随便找了一片机器学习的文章,感觉差不多
# print "TF-IDF"
# f = open("D:\\tempFiles\\xiaoshuo\\xiaoshuo\\333.txt", "r").read()
# seg = jieba.analyse.extract_tags(f, topK = 20, withWeight = True,allowPOS=('ns', 'n', 'vn', 'v'))
# for tag, weight in seg:
#     print "%s %s" %(tag, weight)
# # TF-IDF
# # 机器学习 0.561256690277
# # 程序员 0.252703836526
# # 定义 0.225158538822
# # 垃圾邮件 0.144009795045
# # 学习 0.108490512994
# # 领域 0.101639352909
# # 决策 0.0961011211044
# # 计算机科学 0.0916201213669
# # 数据 0.0897907357444
# # 需要 0.0747876167113
# # 模型 0.074580168313
# # 度量 0.070503353081
# # 邮件 0.0699910062157
# # 程序 0.0693735607599
# # 性能 0.0690830592581
# # 计算机程序 0.0682625688789
# # 问题 0.0682294981281
# # 经验 0.0626888909498
# # 训练 0.0624350485315
# # 方法 0.0621947421601
# 
# 
# # TextRank
# # allowPOS词性参数必须要指定
# # jieba.analyse.TextRank() 新建自定义 TextRank 实例
# print "TextRank"
# f = open("D:\\tempFiles\\xiaoshuo\\xiaoshuo\\333.txt", "r").read()
# seg = jieba.analyse.textrank(f, topK = 20, withWeight = True,allowPOS=('ns', 'n', 'vn', 'v'))
# for tag, weight in seg:
#     print "%s %s" %(tag, weight)
# # TextRank
# # 机器学习 1.0
# # 定义 0.535912275932
# # 领域 0.530605296708
# # 程序员 0.490406514764
# # 数据 0.459853876866
# # 需要 0.438028010056
# # 学习 0.413631251573
# # 问题 0.387826660578
# # 方法 0.345708808183
# # 决策 0.32013868787
# # 能够 0.317290835203
# # 模型 0.281383871087
# # 作为 0.275006501042
# # 垃圾邮件 0.267333473619
# # 经验 0.264095802056
# # 训练 0.237613073156
# # 程序 0.235826580463
# # 性能 0.218489306116
# # 角度 0.201835769997
# # 邮件 0.195625709773

#  延迟加载机制
# jieba 采用延迟加载,import jieba 和 jieba.Tokenizer() 不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。
# import jieba
# jieba.initialize()  # 手动初始化(可选)
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值