上一章分享了IK Analyzer中文分词及词频统计基于Hadoop的MapReducer框架Java实现。这次将与大家分享Jieba中文分词Python简单实现,由于Jieba分词是基于词频最大切分组合,所以不用做词频统计,可以直接得到其关键字。
1、安装jieba
安装方式可以查看博主的中文分词工具(http://my.oschina.net/eager/blog/673013),此处不再赘述。
2、简单实例实现:
#导入jieba
import jieba# ---------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)) # 搜索引擎模式
3、采用精确模式对hong.txt做分词并写入文件hong2.txt
# coding:UTF8
'''
@author: ZD
'''
import sys
#修改编码之前,Python2.7系统默认编码是ascii
print(sys.getdefaultencoding())
#修改编码为utf-8
reload(sys)
sys.setdefaultencoding('utf-8')
print(sys.getdefaultencoding())import jieba, codecs
fpr = codecs.open("hong.txt","r")
lines = fpr.readlines()
resultStr=""
for line in lines:
resultStr += line#精确模式分词,但没有统计结果并排序
seg_list = jieba.cut(resultStr, cut_all=False)
fpr.close()print("开始写文件")
fpw = codecs.open("hong2.txt", "w")
result=""
for segStr in seg_list:
result=segStr+" \\ "
fpw.write(result)
fpw.close()
print("写文件结束")
一部分结果展示:
\ 上卷 \ \ 第一回 \ \ \ 甄士隐 \ 梦幻 \ 识通灵 \ \ 贾雨村 \ 风尘 \ 怀 \ 闺秀 \
\
\ \ \ 此 \ 开卷 \ 第一回 \ 也 \ . \ 作者 \ 自云 \ : \ 因曾 \ 历过 \ 一番 \ 梦幻 \ 之后 \ , \ 故 \ 将 \ 真事 \ 隐去 \ , \ 而 \ 借 \ " \ 通灵 \ " \ 之 \ 说 \ , \ 撰此 \ 《 \ 石头记 \ 》 \ 一书 \ 也 \ . \ 故曰 \ " \ 甄士隐 \ " \ 云云 \ . \ 但书中 \ 所记 \ 何事 \ 何人 \ ? \ 自又云 \ : \ “ \ 今 \ 风尘碌碌 \ , \ 一事无成 \ , \ 忽 \ 念及 \ 当日 \ 所有 \ 之 \ 女子 \ , \ 一一 \ 细考 \ 较 \ 去 \ , \ 觉其 \ 行止 \ 见识 \ , \ 皆 \ 出于 \ 我 \ 之上 \ . \ 何 \ 我 \ 堂堂 \ 须眉 \ , \ 诚不若 \ 彼 \ 裙钗 \ 哉 \ ? \ 实愧 \ 则 \ 有余 \ , \ 悔 \ 又 \ 无益 \ 之大 \ 无可如何 \ 之日 \ 也 \ ! \ 当 \ 此 \ , \ 则 \ 自欲 \ 将 \ 已往 \ 所赖 \ 天恩祖 \ 德 \ , \ 锦衣 \ 纨绔 \ 之 \ 时 \ , \ 饫甘餍肥 \ 之 \ 日 \ , \ 背 \ 父兄 \ 教育 \ 之恩 \ , \ 负 \ 师友 \ 规谈 \ 之德 \ , \ 以至 \ 今日 \ 一技无成 \ , \ 半生 \ 潦倒 \ 之罪 \ , \ 编述 \ 一集 \ , \ 以告 \ 天下人 \ : \ 我 \ 之 \ 罪固 \ 不免 \ , \ 然 \ 闺阁 \ 中本 \ 自 \ 历历 \ 有人 \ , \ 万 \ 不可 \ 因 \ 我 \ 之 \ 不肖 \ , \ 自护己 \ 短 \ , \ 一并 \ 使 \ 其 \ 泯灭 \ 也 \ . \ 虽 \ 今日 \ 之茅 \ 椽蓬 \ 牖 \ , \ 瓦灶 \ 绳床 \ , \ 其 \ 晨夕 \ 风露 \ , \ 阶柳庭花 \ , \ 亦 \ 未有 \ 妨 \ 我 \ 之 \ 襟怀 \ 笔墨 \ 者 \ . \ 虽 \ 我 \ 未学 \ , \ 下笔 \ 无文 \ , \ 又 \ 何妨 \ 用 \ 假语 \ 村言 \ , \ 敷 \ 演出 \ 一段 \ 故事 \ 来 \ , \ 亦可 \ 使 \ 闺阁 \ 昭传 \ , \ 复可悦 \ 世之目 \ , \ 破人 \ 愁闷 \ , \ 不 \ 亦 \ 宜乎 \ ? \ " \ 故曰 \ " \ 贾雨村 \ " \ 云云 \ . \
5、如果想得到出现频率最高的词语,则可以用 jieba.analyse.extract_tags(sentence, topK) 方法
PS:其中sentence为待提取的文本,topK为返回几个TF/IDF权重最大的关键词,默认值为20
# coding:UTF8
'''
@author: ZD
'''
import sys
#修改编码之前,Python2.7系统默认编码是ascii
print(sys.getdefaultencoding())
#修改编码为utf-8
reload(sys)
sys.setdefaultencoding('utf-8')
print(sys.getdefaultencoding())import jieba, codecs
fpr = codecs.open("hong.txt","r")
lines = fpr.readlines()
resultStr=""
for line in lines:
resultStr += line#精确模式分词,但没有统计结果并排序
seg_list = jieba.cut(resultStr, cut_all=False)
fpr.close()print("开始写文件")
fpw = codecs.open("hong2.txt", "w")
result=""
for segStr in seg_list:
result=segStr+" \\ "
fpw.write(result)
fpw.close()
print("写文件结束")
部分结果展示
宝玉
贾母
凤姐
王夫人
老太太
奶奶
那里
什么
贾琏
太太
姑娘
众人
平儿
说道
如今
一面
你们
袭人
宝钗
只见
黛玉
这里
我们
一个
听见
出来
凤姐儿
薛姨妈
分享踩过的坑
问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
原因:python2.7是基于ascii去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128))。
解决方案1:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
如果eclipse报错为undefined variable from import:setdefaultencoding,是因为eclipse的pydev插件原因,可以不管此错误,照样运行。
解决方案2:(http://blog.csdn.net/lgy807720302/article/details/7515743)
在Python安装目录下的Lib/site-packages目录中,新建一个sitecustomize.py文件
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
try:
import apport_python_hook
except ImportError:
pass
else:
apport_python_hook.install()
然后在eclipse中可以查看到改变已经生效
import sys
print(sys.getdefaultencoding())
写在最后:本人初学Python,也初次接触jieba分词工具,如有错误,望指出纠正。