jieba分词
jieba分词是python写成的一个算是工业界的分词开源库,其github地址为:https://github.com/fxsjy/jieba,在Python里的安装方式: pip install jieba
简单示例:
import jieba as jb
seg_list = jb.cut("我来到北京清华大学", cut_all=True)
print("全模式: " + "/ ".join(seg_list)) # 全模式
seg_list = jb.cut("我来到北京清华大学", cut_all=False)
print("精确模式: " + "/ ".join(seg_list)) # 精确模式
seg_list = jb.cut("他来到了网易杭研大厦")
print("默认模式: " + "/ ".join(seg_list)) # 默认是精确模式
seg_list = jb.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")
print("搜索引擎模式: " + "/ ".join(seg_list)) # 搜索引擎模式
执行结果:
全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
精确模式: 我/ 来到/ 北京/ 清华大学
默认模式: 他/ 来到/ 了/ 网易/ 杭研/ 大厦
搜索引擎模式: 小明/ 硕士/ 毕业/ 于/ 中国/ 科学/ 学院/ 科学院/ 中国科学院/ 计算/ 计算所/ ,/ 后/ 在/ 日本/ 京都/ 大学/ 日本京都大学/ 深造
jieba分词的基本思路
jieba分词对已收录词和未收录词都有相应的算法进行处理,其处理的思路很简单,主要的处理思路如下:
- 加载词典dict.txt
- 从内存的词典中构建该句子的DAG(有向无环图)
- 对于词典中未收录词,使用HMM模型的viterbi算法尝试分词处理
- 已收录词和未收录词全部分词完毕后,使用dp寻找DAG的最大概率路径 输出分词结果
案例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import jieba
import requests
from bs4 import BeautifulSoup
def extract_text(url):
# 发送url请求并获取响应文件
page_source = requests.get(url).content
bs_source = BeautifulSoup(page_source, "lxml")
# 解析出所有的p标签
report_text = bs_source.find_all('p')
text = ''
# 将p标签里的所有内容都保存到一个字符串里
for p in report_text:
text += p.get_text()
text += '\n'
return text
def word_frequency(text):
from collections import Counter
# 返回所有分词后长度大于等于2 的词的列表
words = [word for word in jieba.cut(text, cut_all=True) if len(word) >= 2]
# Counter是一个简单的计数器,统计字符出现的个数
# 分词后的列表将被转化为字典
c = Counter(words)
for word_freq in c.most_common(10):
word, freq = word_freq
print(word, freq)
if __name__ == "__main__":
url = 'http://www.gov.cn/premier/2017-03/16/content_5177940.htm'
text = extract_text(url)
word_frequency(text)
执行结果:
Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/dp/wxmmld_s7k9gk_5fbhdcr2y00000gn/T/jieba.cache
Loading model cost 0.843 seconds.
Prefix dict has been built succesfully.
发展 134
改革 85
经济 71
推进 66
建设 59
社会 49
人民 47
企业 46
加强 46
政策 46
流程介绍
首先,我们从网上抓取政府工作报告的全文。我将这个步骤封装在一个名叫extract_text的简单函数中,接受url作为参数。因为目标页面中报告的文本在所有的p元素中,所以我们只需要通过BeautifulSoup选中全部的p元素即可,最后返回一个包含了报告正文的字符串。
然后,我们就可以利用jieba进行分词了。这里,我们要选择全模式分词。jieba的全模式分词,即把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义。之所以这么做,是因为默认的精确模式下,返回的词频数据不准确。
分词时,还要注意去除标点符号,由于标点符号的长度都是1,所以我们添加一个len(word) >= 2的条件即可。
最后,我们就可以利用Counter类,将分词后的列表快速地转化为字典,其中的键值就是键的出现次数,也就是这个词在全文中出现的次数。