jieba
与英文不同,在中文中,词与词之间不以空格来隔开。所以这时候,需要进行分词。那么,jieba
就是一个分词工具,而且开源。
我们主要介绍这些内容
- 分词
- 自定义词典
- 关键词提取
分词
分词模式
网上很多过时的资料都是说jieba
一共有三种分词模式,但其实根据官网的描述,从v0.40
开始,一共有四种分词模式。
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词;
- paddle模式。(paddle是百度的一款深度学习框架)
当然,一般常用的还是前面3种。
分词方法
我们介绍两种分词方法
- cut()
- cut_for_search()
cut
1 | jieba.cut() |
该方法传入四个参数:
- sentence: 分词句子
- cut_all: 是否分词所有,默认False
- HMM: 是否使用隐马可夫模型,默认True
- use_paddle: 是否使用paddle,默认False
说明:
- 当
cut_all
为False
的时候,就是精准模式;当cut_all
为True
的时候,就是全模式。 - 当
HMM
为True
的时候,会添加其学习到新词;当HMM
为False
的时候,不会添加其学习到新词。
示例代码:
1 | import jieba |
运行结果:
1 | 当亚平宁的微风,吹过飘逸的长发,当地中海的湛蓝,照进深邃的眼神。 |
cut_for_search
1 | jieba.cut_for_search |
该方法传入两个参数:
- sentence: 分词句子
- HMM: 是否使用隐马可夫模型,默认True
示例代码:
1 | import jieba |
运行结果:
1 | 当亚平宁的微风,吹过飘逸的长发,当地中海的湛蓝,照进深邃的眼神。 |
自定义词典
jieba
有自己的词库,还可以通过HMM去学习新词。而且我们还可以新增、删除或者修改词语。
新增词语
jieba
中新增词语有两种方法。
- add_word()
- load_userdict()
add_word
1 | jieba.add_word() |
该方法传入三个三个参数:
- word:需要新增的单词
- freq:词频(非必须)
- tag:词性(非必须)
示例代码:
1 | import jieba |
运行结果:
1 | 当亚平宁的微风,吹过飘逸的长发,当地中海的湛蓝,照进深邃的眼神。 |
load_userdict
1 | jieba.load_userdict() |
该方法传入一个参数
- f:自定义字典文件
一般用该方法批量添加自定义词。
其字典文件格式如下
1 | word1 freq1 tag1 |
一个词语一行,词语、词频和词性之间用空格隔开。同样,词频和词性非必须。
删除词语
1 | jieba.del_word() |
该方法传入一个参数:
- word:要被删除的词语
示例代码:
1 | import jieba |
运行结果:
1 | 当亚平宁的微风,吹过飘逸的长发,当地中海的湛蓝,照进深邃的眼神。 |
查看和修改词频
查看词频
1 | jieba.get_FREQ() |
该方法有一个参数:
- word:词语
修改词频
1 | jieba.suggest_freq() |
特别注意:修改词频,只能修改大。
该方法有两个参数:
- segment:要被修改的词
- tune:是否调整词频,默认为False
示例代码:
1 | import jieba |
运行结果:
1 | 706 |
关键词提取
jieba
中的关键词提取有两种方法:
- 基于 TF-IDF 算法的关键词抽取
- 基于 TextRank 算法的关键词抽取
基于TF-IDF算法的关键词抽取
1 | jieba.analyse.extract_tags() |
传入4个参数:
- sentence 为待提取的文本
- topK 为返回几个权重最大的关键词,默认值为 20
- withWeight 为是否一并返回关键词权重值,默认值为 False
- allowPOS 仅包括指定词性的词,默认值为空,即不筛选
示例代码:
1 | import jieba.analyse |
运行结果:
1 | 当亚平宁的微风,吹过飘逸的长发,当地中海的湛蓝,照进深邃的眼神。 |
基于TextRank算法的关键词抽取
1 | jieba.analyse.textrank() |
传入4个参数:
- sentence 为待提取的文本
- topK 为返回几个权重最大的关键词,默认值为 20
- withWeight 为是否一并返回关键词权重值,默认值为 False
- allowPOS 仅包括指定词性的词,默认值为空,即不筛选
wordcloud
wordcloud
,顾名思义,词云。这个工具包也和jieba
一样,开源。
如图,这是金庸《射雕英雄传》的词云。
我们以这个为例。
步骤为
- 基于TF-IDF算法的抽取关键词
- 生成词云对象
- 根据词云对象绘图
基于TF-IDF算法的抽取关键词
示例代码:
1 | import jieba.analyse |
运行结果:
1 | 郭靖 黄蓉 洪七公 欧阳锋 黄药师 周伯通 甚么 黄蓉道 武功 丘处机 郭靖道 师父 欧阳克 梅超风 说道 柯镇恶 裘千仞 爹爹 两人 功夫 完颜洪烈 心中 只见 铁木真 穆念慈 杨康 咱们 心想 完颜康 当下 一声 自己 陆冠英 彭连虎 不知 杨铁心 成吉思汗 叫化 一个 梁子翁 六怪 桃花岛 拖雷 朱聪 帮主 这时 王处一 之中 左手 身子 眼见 丐帮 弟子 只是 靖哥哥 包惜弱 九阴真经 不是 华筝 黄蓉笑 韩小莹 不敢 知道 地下 原来 却是 韩宝驹 右手 侯通海 老顽童 他们 不禁 一招 沙通天 喝道 双手 众人 二人 蒙古 出来 如此 哪里 铁掌 老毒物 心下 兄弟 一阵 伸手 怎么 突然 黄老邪 郭靖心 马钰 只怕 尹志平 你们 正是 性命 傻姑 鲁有脚 |
生成词云对象
1 | wordcloud.WordCloud() |
该方法有多个参数,其中比较常用的有:
- font_path:字体文件路径
- background_color:背景颜色
- max_words:最大词数
- max_font_size:最大字体
- min_font_size:最小字体
- random_state:随机数种子
- width:图片的宽
- height:图片的高
- margin:图片的边距
- mask:遮挡
注意:wordcloud的默认字体不支持中文,所以如果需要中文,必须设置支持中文的字体文件路径。
示例代码:
1 | from wordcloud import WordCloud |
运行结果:
1 | <wordcloud.wordcloud.WordCloud object at 0x04257590> |
根据词云对象绘图
我们调用matplotlib
根据词云对象进行绘图。
示例代码:
1 | from matplotlib import pyplot as plt |
运行结果:
完整的代码已经PUSH到了我的GitHub上
https://github.com/KakaWanYifan/SheDiaoYingXiongZhuan-JiebaWordcloud
wordninja
连续英文字符串的分割
如果是用下划线_
来拼接的话,那么非常简单。
例如user_name
、price_earnings_ratio
、html_a_content
,我们通过下划线_
分割,然后从第二个项开始,首字母大写。
示例代码:
1 | l = ['user_name', 'price_earnings_ratio', 'html_a_content'] |
运行结果:
1 | user_name |
解释说明:
.title()
:首字母大写。
分词
但,如果是连续的呢?
例如,username
、priceearningsratio
、htmlacontent
这个时候,就需要借助第三方的包wordninja
。
分词的方法为:wordninja.split(被分词的对象)
示例代码:
1 | import wordninja |
运行结果:
1 | ['i', 'love', 'china'] |
小驼峰
将连续的英文字符串转成小驼峰(Python),示例代码:
1 | import wordninja |
运行结果:
1 | username |
修改词库
我们看到username
,结果依旧是username
。
wordninja是基于维基百科语料的频率来进行分词的,如果想对特有名词进行正确分割,需要修改词库,将特有名词加入词库中。
我们可以通过如下的地址 https://github.com/keredson/wordninja/ ,找到词库,在wordninja
目录下,wordninja_words.txt.gz
。
解压后,我们添加单词user
,并删去username
,然后重新打成.gz
包,再使用LanguageModel
加载。
示例代码:
1 | import wordninja |
运行结果:
1 | username |
关于打成.gz
包:
- 在macOS和Linux中,系统都自带了压缩成
.gz
包的命令。macOS和Linux都可以参考《Linux操作系统使用入门:2.命令》中"压缩和解压"部分的"gzip gunzip"。 - Windows需要借助第三方的工具。