1.Jieba
- 相信大多数知道NLP的人都知道什么是Jieba,但对于像我这样的新手而言,也仅限于知道而已,并没有学习过它,使用过它,打算用几天的时间来记录自己学习、使用Jieba的过程。
- jieba是一款开源的中文分词工具 github ,“结巴”中文分词:做最好的 Python 中文分词组件 "Jieba" (Chinese for "to stutter") Chinese text segmentation: built to be the best Python Chinese word segmentation module.
2. 特点
- 支持三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- 支持繁体分词
- 支持自定义词典
- MIT 授权协议
3.功能
- 分词
- 添加自定义词典
- 关键字提取
- 词性标注
- 并行分词
- Tokenize:返回词语在原文的起止位置
- ChineseAnalyzer for Whoosh 搜索引擎
- 命令行分词
4.安装
本机环境:
代码语言:javascript复制windos10 python3.6
* 全自动安装:`easy_install jieba` 或者 `pip install jieba` / `pip3 install jieba`
* 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 `python setup.py install`
* 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
* 通过 `import jieba` 来引用
5.使用
1.问题描述
使用Jieba生成词云图
2.学习相关API
1.分词
- jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
- jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
- jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用
- jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
- jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
#! /usr/bin/python3
# -*- coding: utf-8 -*-
import jieba
def word_partition():
'''
分词
'''
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("今天是个好日子", cut_all=False, HMM=True) # 默认
print(",".join(seg_list))
seg_list = jieba.cut("今天是个好日子女", cut_all=True, HMM=True)
print(",".join(seg_list))
# 返回一个generator
seg_list = jieba.cut("今天是个好日子女", cut_all=True, HMM=False)
print(",".join(seg_list), type(seg_list))
# 返回一个generator
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
print(",".join(seg_list), type(seg_list))
# 返回一个list
seg_list = jieba.lcut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")
print(",".join(seg_list), type(seg_list))
# 返回一个list
seg_list = jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")
print(",".join(seg_list), type(seg_list))
2.载入字典
- 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
- 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
- 词频省略时使用自动计算的能保证分出该词的词频。
self_dict.txt
代码语言:javascript复制中二病 2 n
萝莉 2 n
正太 400 n
鬼畜 50 n
创新办 3 i
代码语言:javascript复制#! /usr/bin/python3
# -*- coding: utf-8 -*-
import jieba
def add_self_dict():
'''
添加自定义字典
'''
test_sentence=(
"小明好高中二病了n"
"小红爱萝莉n"
"魔鬼畜生都走开n"
"大中午的正太阳在头顶n"
"李小福是创新办主任也是云计算方面的专家"
)
words = jieba.cut(test_sentence)
print('/'.join(words))
jieba.load_userdict("self_dict.txt")
words = jieba.cut(test_sentence)
print('/'.join(words))
#调整
jieba.add_word('石墨烯')
jieba.add_word('凱特琳')
jieba.del_word('中二病')
test_sentence=(
"小明好高中二病了n"
"例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类n"
"「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
)
words=jieba.cut(test_sentence)
print("/".join(words))
#调节词频
jieba.suggest_freq("台中",tune=True)
words=jieba.cut("「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。")
print("/".join(words))
3.提取关键字
代码语言:javascript复制基于 TF-IDF 算法的关键词抽取 基于 TextRank 算法的关键词抽取
def keyword_extract():
'''
提取关键字
'''
#基于 TF-IDF 算法的关键词抽取
import sys
from optparse import OptionParser
USAGE = "usage: python extract_tags.py [file name] -k [top k]"
print("USAGE:",USAGE)
parser = OptionParser(USAGE)
parser.add_option("-k", dest="topK")
opt, args = parser.parse_args()
if len(args) < 1:
print(USAGE)
sys.exit(1)
file_name = args[0]
if opt.topK is None:
topK = 10
else:
topK = int(opt.topK)
content = open(file_name, 'rb').read()
tags = jieba.analyse.extract_tags(content, topK=topK)
print(",".join(tags))
#基于 TextRank 算法的关键词抽取
content = open(file_name, 'rb').read()
tags=jieba.analyse.textrank(content,topK=topK)
print(",".join(tags))
补充: TF-IDF TextRank optparse
3.源代码
数据
代码语言:javascript复制新华社北京2月10日电 (记者隋笑飞)中共中央政治局常委、中央书记处书记刘云山2月8日和9日,代表习近平总书记和党中央看望文化界知名人士,向他们致以诚挚问候,向广大文化工作者致以新春祝福。刘云山首先来到中国人民大学教授、著名马克思主义哲学专家陈先达家中,关切询问陈先达的生活和工作情况,对他为党的思想理论建设作出的贡献给予肯定,陈先达就深化马克思主义理论研究、加强哲学社会科学教材教学工作提出建议。在中国文联荣誉委员、著名书法家沈鹏家中,刘云山悉心了解书法艺术传承发展情况,希望老一辈书法家继续发挥传帮带作用、为弘扬中华优秀传统文化贡献力量。在看望中国舞协名誉主席、著名芭蕾舞表演艺术家白淑湘时,刘云山赞赏她为芭蕾舞民族化进行的探索,白淑湘建议加强青年艺术人才培养、加大对代表国家水准的艺术门类扶持力度。在看望原新闻出版署署长、著名出版家宋木文时,刘云山与他就出版业现状和前景进行交流,认真听取他关于提高出版质量、加强版权保护、重视社会效益等建议。在中国作协名誉委员、著名少数民族作家玛拉沁夫家中,刘云山赞扬玛拉沁夫为民族文学发展做出的成绩,并与他就加强少数民族文艺创作、繁荣中华民族文艺园地进行探讨。文化界知名人士对习近平总书记和党中央的亲切关怀表示感谢,对党的十八大以来党治国理政的新举措新局面高度赞誉,对党和政府重视弘扬优秀传统文化、提升国家文化软实力等部署深表赞同,一致认为文化工作者赶上了好时代,文化发展展示出更加美好的前景。刘云山指出,国运兴、文运兴,文化是民族生存和发展的重要力量,实现中华民族伟大复兴的中国梦需要文化的繁荣兴盛。推进“四个全面”战略布局,赋予当代文化工作者重要责任和使命。希望广大文化工作者深入学习贯彻习近平总书记在文艺工作座谈会上的重要讲话精神,增强文化自信,坚守文化追求,树立正确创作导向,用更多更好的文化作品讲好中国故事、反映时代进步。要强化精品意识,学习老一辈文化工作者的优良传统,努力在扎根生活、扎根群众中丰富生活积淀,在深化艺术实践、积极探索创新中提高文艺表现力,为推动文化繁荣发展、建设社会主义文化强国作出积极贡献。各级党委、政府和有关部门要重视文化建设、关心文化人才,加强扶持引导、多办实事好事,为文化工作者施展才华创造良好条件。中共中央政治局委员、中宣部部长刘奇葆陪同看望。中宣部、教育部、文化部、新闻出版广电总局、中国文联、中国作协有关负责同志参加看望活动。《 人民日报 》( 2015年02月11日 01 版)
背景
代码语言:javascript复制#! /usr/bin/python3
# -*- coding: utf-8 -*-
import os
import jieba
import jieba.analyse
from PIL import Image, ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
def load_data(file_path):
'''
输入文件路径,返回文件内容
'''
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
except Exception as e:
print("something wrong in load_data()")
return content
def load_image(file_path):
image = Image.open(file_path)
graph = np.array(image)
return graph
def generate_wordcloud(content, graph):
result = jieba.analyse.textrank(content, topK=50, withWeight=True)
keywords = dict()
for i in result:
keywords[i[0]] = random.randint(1, 10)
wc = WordCloud(font_path='C:/Windows/Fonts/simhei.ttf',
background_color='White', max_words=50, mask=graph)
wc.generate_from_frequencies(keywords)
image_color = ImageColorGenerator(graph)
plt.imshow(wc)
plt.imshow(wc.recolor(color_func=image_color))
plt.axis("off")
plt.show()
if __name__ == '__main__':
data_file = input('Please enter a data file path:')
content = load_data(data_file)
image_file = input('Please enter a image file path:')
graph = load_image(image_file)
generate_wordcloud(content, graph)
4.结果
6.其他中文分词工具
- LTP
- NLPIR
- THULAC
- SnowNLP
- Hanlp
- Stanfordnlp
- NLPIR