中文分词

中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组。英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文分词难度高很多。

分词主要用于NLP 自然语言处理(Natural Language Processing),使用场景有:

  • 搜索优化,关键词提取(百度指数)
  • 语义分析,智能问答系统(客服系统)
  • 非结构化文本媒体内容,如社交信息(微博热榜)
  • 文本聚类,根据内容生成分类(行业分类)

分词库

Python的中文分词库有很多,常见的有:

  • jieba(结巴分词)
  • pkuseg(北京大学语言计算与机器学习研究组)
  • THULAC(清华大学自然语言处理与社会人文计算实验室)
  • SnowNLP
  • pynlpir
  • CoreNLP
  • pyltp

通常前三个是比较经常见到的,主要在易用性/准确率/性能都还不错。个人常用的一直都是结巴分词(比较早接触),最近使用pkuseg,两者的使用后面详细讲。

结巴分词

简介

“结巴”中文分词:做最好的Python中文分词组件

  • 支持三种分词模式:

    • 精确模式,试图将句子最精确地切开,适合文本分析;
    • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
    • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • 支持繁体分词
  • 支持自定义词典

实例

我们使用京东商场的美的电器评论来看看结巴分词的效果。如果你没有安装结巴分词库则需要在命令行下输入pip install jieba,安装完之后即可开始分词之旅。

评论数据整理在文件meidi_jd.csv文件中,读取数据前先导入相关库。因为中文的文本或文件的编码方式不同编码选择gb18030,有时候是utf-8gb2312gbk自行测试。

# 导入相关库import pandas as pdimport jieba

# 读取数据data = pd.read_csv('meidi_jd.csv', encoding='gb18030')

# 查看数据data.head()

图1
# 生成分词data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x)))

data.head()

图2

到这里我们仅仅通过一行代码即可生成中文的分词列表,如果你想要生成分词后去重可以改成这样。

data['cut'] = data['comment'].apply(lambda x : list(set(jieba.cut(x))))

自定义词典

经过前面的分词后,我们可以通过查看分词是否准确,会发现实际上有些词被分隔成单独的汉字,例如:

print(data['cut'].loc[14])

['很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好', '很', '好']

这时候我们就需要导入自定义的词典,以便包含jieba词库里没有的词。虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率。自定义词典采用一词一行,为了演示添加了 “很好” 并保存在dict.txt文件中,让我们开始用自定义的词典吧!

data['cut'] = data['comment'].apply(lambda x : list(jieba.cut(x)))

data.head()

print(data['cut'].loc[14])

['很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好', '很好']

现在已经按照我们计划的正确分词出来了!很好!

停用词

分词的过程中我们会发现实际上有些词实际上意义不大,比如:标点符号、嗯、啊等词,这个时候我们需要将停用词去除掉。首先我们需要有个停用词词组,可以自定义也可以从网上下载词库,这里我们使用网上下载的停用词文件StopwordsCN.txt

# 读取停用词数据stopwords = pd.read_csv('StopwordsCN.txt', encoding='utf8', names=['stopword'], index_col=False)

stopwords.head()

图3

接下里我们只要适当更改分词的代码即可在分词的时候去掉停用词:

# 转化词列表stop_list = stopwords['stopword'].tolist()

# 去除停用词data['cut'] = data['comment'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list])

data.head()

图4

pkuseg

pkuseg简单易用,支持细分领域分词,有效提升了分词准确度。

简介

pkuseg具有如下几个特点:

  1. 多领域分词。不同于以往的通用中文分词工具,此工具包同时致力于为不同领域的数据提供个性化的预训练模型。根据待分词文本的领域特点,用户可以自由地选择不同的模型。我们目前支持了新闻领域,网络文本领域和混合领域的分词预训练模型,同时也拟在近期推出更多的细领域预训练模型,比如医药、旅游、专利、小说等等。
  2. 更高的分词准确率。相比于其他的分词工具包,当使用相同的训练数据和测试数据,pkuseg可以取得更高的分词准确率。
  3. 支持用户自训练模型。支持用户使用全新的标注数据进行训练。

注:pkuseg目前仅支持Python3,目前已经很多主流库开始不支持Python2,建议使用Python3版本,如需使用Python2可创建虚拟环境来搭建。

实例

pkuseg的使用跟结巴分词有一点不一样,pkuseg需要先创建模型实例再使用实例方法cut。前面有提到pkuseg是支持加载与训练模型的,这也大大提高了分词准确性,特别是对细分领域数据集进行分词,详细查看GitHub文档。

import pkuseg

# 以默认配置加载模型seg = pkuseg.pkuseg() 

# 进行分词data['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list])

data.head()

图5

自定义词典

同样的,pkuseg也支持自定义词典来提高分词准确率。

# 使用默认模型,并使用自定义词典seg = pkuseg.pkuseg(user_dict='dict.txt') 

# 进行分词data['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list])

print(data['cut'].loc[14])

自定义预训练模型

分词模式下,用户需要加载预训练好的模型。pkuseg提供三种不同数据类型训练得到的模型。

  • MSRA: 在MSRA(新闻语料)上训练的模型。下载地址
  • CTB8: 在CTB8(新闻文本及网络文本的混合型语料)上训练的模型。下载地址
  • WEIBO: 在微博(网络文本语料)上训练的模型。下载地址
  • MixedModel: 混合数据集训练的通用模型。随pip包附带的是此模型。下载地址
# 下载后解压出来,并复制文件夹路径file_path = '/Users/user_name/anaconda3/lib/python3.6/site-packages/pkuseg/ctb8'

# 加载其他预训练模型seg = pkuseg.pkuseg(model_name=file_path)text = seg.cut('京东商城信得过,买的放心,用的省心、安心、放心!')

print(text)

性能对比

结巴的分词速度说明比较简单,描述中也没有性能对比,更像是分词内容和环境。。

  • 1.5 MB / Second in Full Mode
  • 400 KB / Second in Default Mode
  • 测试环境: Intel(R) Core(TM) i7-2600 CPU @ 3.4GHz;《围城》.txt

相比之下pkuseg选择jieba、THULAC等国内代表分词工具包与pkuseg做性能比较。以下是在不同数据集上的对比结果:

图6

从结果看pkuseg在精确度、召回率和F分数上表现得相当不错。性能方面使用jupyter notebook进行简单测试。

%%timeitdata['cut'] = data['comment'].apply(lambda x : [i for i in jieba.cut(x) if i not in stop_list])
%%timeitdata['cut'] = data['comment'].apply(lambda x: [i for i in seg.cut(x) if i not in stop_list])

输出结果:

结巴:
2.54 s ± 3.77 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

pkuseg:
7.45 s ± 68.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

从数据结果上看,pkuseg分词的时间要高于结巴分词的时间,当然pkuseg提供多进程来进行分词,性能方面也是可以提高的。

词频统计

到这里我们基本是已经学会用Python库进行分词,关于词频统计的方式也很多,我们先将所有分词合并在一起方便统计。

# 将所有的分词合并words = []

for content in data['cut']:    words.extend(content)

方式一:

# 创建分词数据框corpus = pd.DataFrame(words, columns=['word'])corpus['cnt'] = 1

# 分组统计g = corpus.groupby(['word']).agg({'cnt': 'count'}).sort_values('cnt', ascending=False)

g.head(10)

图7

方式二:

# 导入相关库from collections import Counterfrom pprint import pprint

counter = Counter(words)

# 打印前十高频词pprint(counter.most_common(10))

[('不错', 3913), ('安装', 3055), ('好', 2045), ('很好', 1824), ('买', 1634), ('热水器', 1182), ('挺', 1051), ('师傅', 923), ('美', 894), ('送货', 821)]

结尾

个人的使用建议,如果想简单快速上手分词可以使用结巴分词,但如果追求准确度和特定领域分词可以选择pkuseg加载模型再分词。另外jieba和THULAC并没有提供细分领域预训练模型,如果想使用自定义模型分词需使用它们提供的训练接口在细分领域的数据集上进行训练,用训练得到的模型进行中文分词。

python统计词频_Python中文分词及词频统计相关推荐

  1. python 小说词频统计_Python中文分词及词频统计

    中文分词 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组.英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文 ...

  2. python字频统计软件_python结巴分词以及词频统计实例

    python结巴分词以及词频统计实例 发布时间:2018-03-20 14:52, 浏览次数:773 , 标签: python # coding=utf-8 ''' Created on 2018年3 ...

  3. python的拼音_python 中文分词和拼音首字母

    昨天的算法课老师以中文分词为例讲了DP,换了种简单的方式(求分词后频率和最大)实现了一下,效果不错,频率词典是从这里找的: http://download.csdn.net/source/347899 ...

  4. Python中文分词及词频统计

    Python中文分词及词频统计 中文分词 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组.英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是 ...

  5. 基于python的几种中文分词-词性获取

    基于python的几种中文分词-词性获取 1.测试环境 2.安装与使用 2.1 jieba分词 2.2 清华大学的THULAC 2.3 HanLP 2.4 pynlpir 基于python的几种中文分 ...

  6. python实现中文分词和词频统计

    python2.7中实现中文分词,是引入了jieba中文分词库.再进行简单的词频统计. import sys reload(sys) sys.setdefaultencoding('utf-8') i ...

  7. Python大数据:jieba分词,词频统计

    实验目的 学习如何读取一个文件 学习如何使用DataFrame 学习jieba中文分词组件及停用词处理原理 了解Jupyter Notebook 概念 中文分词 在自然语言处理过程中,为了能更好地处理 ...

  8. python 中文分词_python中文分词,使用结巴分词对python进行分词(实例讲解)

    在采集 中文分词是中文文本处理的一个基础性工作,结巴分词利用进行中文分词. 其基本实现原理有三点: 1.基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) ...

  9. 【Python自然语言处理】中文分词技术——统计分词

    中文分词方法 本文参考自书籍<Python自然语言处理实战:核心技术与算法> 用做个人的学习笔记和分享 1. 规则分词 规则分词的详细笔记 2. 统计分词 2.1 一般步骤 建立统计语言模 ...

最新文章

  1. 小白也能看懂:一文学会入门推荐算法库 surprise
  2. JSP复习笔记——第10章 连接数据库 之 jsp+DAO实现留言管理程序
  3. 持续集成实践小结[2] —单元测试
  4. Linux之查看ubuntu版本
  5. java抽象工厂设计模式_23种经典设计模式的java实现_1_抽象工厂模式
  6. 快速开发后台不用太多代码的 tp5_小程序·云开发优劣简述
  7. WordPress企业一号主题模板
  8. 红橙Darren Android视频笔记 自定义view的三个构造方法以及一种实现换肤的方案 测量mode
  9. easyui 的 toolbar配合图标使用
  10. php autoload 性能,PHP __autoload()方法真的影响性能吗?
  11. 教妹学Java(十七):do-while 循环
  12. RabbitMQ消息队列(九):Publisher的消息确认机制
  13. 一张纸对折多少次后能达到珠穆朗玛峰的高度
  14. sed修炼系列(一):花拳绣腿之入门篇
  15. ftp linux 推送文件_Linux文件传输FTP详解
  16. 再一次和新同事们谈谈看法
  17. TOM企业邮箱注册流程是什么,如何开通邮箱
  18. 搭建机器人电控系统——PID算法——位置式、增量式、模糊式PID
  19. SAP se11透明表添加字段时报错:字段级的结构更改(转换表xxxxxx)
  20. android按字母数字排序,android 实现字母排序

热门文章

  1. php分类程序,PHP无限分类实现程序_PHP教程
  2. java实验指导答案华软_Java核心编程技术实验指导教程
  3. 清华大学python视频_涨见识了,清华大学全套Python579集视频教程泄露,拿走学去吧...
  4. php网站mysql数据库导入工具_phpstudy通过phpMyAdmin导入mysql数据库方法
  5. 声谱图,梅尔语谱,倒谱,梅尔倒谱系数
  6. 印花对花不准(错花)形态及成因
  7. 亿级流量系统架构之如何支撑百亿级数据的存储与计算
  8. React.js 小书 Lesson1-2 - 前端组件化(一):从一个简单的例子讲起
  9. AMD授权GPU给Intel?苏姿丰:没有的事
  10. NetSuite ERP软件系统特点介绍!