一、实验目的
1.1、学习如何读取一个文件
1.2、学习如何使用DataFrame
1.3、学习jieba中文分词组件及停用词处理原理
1.4、了解Jupyter Notebook
二、概念
中文分词
在自然语言处理过程中,为了能更好地处理句子,往往需要把句子拆开分成一个一个的词语,这样能更好的分析句子的特性,这个过程叫就叫做分词。由于中文句子不像英文那样天然自带分隔,并且存在各种各样的词组,从而使中文分词具有一定的难度。
不过,中文分词并不追求完美,而是通过关键字识别技术,抽取句子中最关键的部分,从而达到理解句子的目的。
三、工具
3.1 Jupyter Notebook
Jupyter Notebook是一个交互式的笔记本工具,重点有两点
- “交互式” 让你随时随时运行并暂存结果,
- “笔记本” 记录你的研究过程
想象一下,在这之前你是如何使用Python的?
- 用一切可能的文本编辑工具编写代码
- 然后运行python xxx.py调试
- 当你写了一个9W条数据的处理程序之后,跑到一半报个错,又得重头开始
- 画图基本靠脑补
有了Jupyter Notebook之后,你可以:
- 直接在网页上编写代码
- 按Shift + Enter立即执行当前Cell的代码段
- Cell执行后的变量仍然生存,可以在下一个Cell继续使用,所以,我用第一个Cell加载9W条数据,第二个Cell开始预处理,第三个Cell进行运算等等
- 直接在网页上画出图片,即时调整参数Shift+Enter预览,麻麻再也不用担心我写错代码,美滋滋 ~~~
3.2 “结巴”中文分词:做最好的 Python 中文分词组件
特点
支持三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- 支持繁体分词
- 支持自定义词典
- MIT 授权协议
算法
- 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
- 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
- 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
另外它还自带有关键词摘取算法
- 基于 TF-IDF 算法的关键词抽取
- 基于 TextRank 算法的关键词抽取
3.2 Pandas
pandas 是基于NumPy 的大数据处理工具,基本数据结构有(二维表)DataFrame,(一维数组)Series。
本次实验中,我们主要使用pandas的DataFrame,加载、保存csv数据源,处理数组进行去重、统计。
四、数据
实验数据为百度随意打开的新闻,请读者自行按下表格式准备(分隔符:"|")
id | title | content |
---|---|---|
1 | 工信部发布2019年中国互联网企业100强榜单:阿里巴巴第一 | IT之家8月14日消息 工业和信息化部信息中心发布了2019年中国互联网企业100强榜单,阿里巴巴(中国)有限公司、深圳市腾讯计算机系统有限责任公司、百度公司、京东集团、浙江蚂蚁小微金融服务集团股份有限公司、网易集团、美团点评、北京字节跳动科技有限公司、三六零安全科技股份有限公司、新浪公司位列榜单前十名。 |
2 | 「PW早报」传网易考拉将以20亿美元“卖身”阿里 双方均不予置评 | 昨日晚间《晚点LatePost》发文称,阿里方面正在洽谈收购网易考拉,目前谈判结果基本确定,正在讨论具体细节。收购价格在几十亿美金,交易完成后,网易考拉将和天猫国际进行具体业务融合与合作。 |
3 | 继苹果谷歌亚马逊之后 FB也被曝雇人转录用户音频 | 8月14日消息,据外媒报道,据知情人士爆料称,与苹果、谷歌、亚马逊等科技巨头类似,Facebook也始终在雇佣数百名外部承包商,让他们转录其服务用户的音频片段。对此,Facebook已经承认存在这种行为,并称其已经停止这类工作。 |
五、思路(伪代码)
5.1、读取数据源
5.2、加载停用词库
5.3、循环对每一篇文章进行分词
- 普通分词,需要手工进行停用词过滤
- TF-IDF关键词抽取,需要使用停用词库
- textrank关键词抽取,只取指定词性的关键词
5.4、对结果进行词频统计
5.5、输出结果到csv文件
六、实验代码
# -*- coding: UTF-8 -*-
import numpy as np
import pandas as pd
import jieba
import jieba.analyse
import codecs
# 设置pd的显示长度
pd.set_option('max_colwidth',500)
# 载入数据
rows=pd.read_csv('test.csv', "|", header=0, encoding='utf-8', dtype=str)
# 对于普通分词,我们需要将停用词载入到一个数组中,在分词后逐一比较关键词是否为停用词
stopwords = [line.strip() for line in codecs.open('stop_words.txt', 'r', 'utf-8').readlines()]
# 对于TF-IDF,我们只需要告诉组件停用词库,它将自己载入词库并使用它
jieba.analyse.set_stop_words('stop_words.txt')
# 保存全局分词,用于词频统计
segments = []
# 方法一:普通分词及停用词判断
for index, row in rows.iterrows():
content = row[2]
# 分词
words = jieba.cut(content)
splitedStr = ''
for word in words:
# 停用词判断,如果当前的关键词不在停用词库中才进行记录
if word not in stopwords:
# 记录全局分词
segments.append({'word':word, 'count':1})
splitedStr += word + ' '
方法二:Text Rank 关键词抽取
for index, row in rows.iterrows():
content = row[2]
# TextRank 关键词抽取,只获取固定词性
words = jieba.analyse.textrank(content, topK=50,withWeight=False,allowPOS=('ns', 'n', 'vn', 'v'))
splitedStr = ''
for word in words:
# 记录全局分词
segments.append({'word':word, 'count':1})
splitedStr += word + ' '
dfSg = pd.DataFrame(segments)
# 词频统计
dfWord = dfSg.groupby('word')['count'].sum()
# 导出csv
dfWord.to_csv('keywords.csv',encoding='utf-8')
七、结果及总结
7.1 结果
word | count |
---|---|
31 | |
用户 | 21 |
平台 | 13 |
音频 | 13 |
互联网 | 12 |
公司 | 12 |
2019 | 9 |
交通 | 9 |
出行 | 9 |
增长 | 9 |
服务 | 9 |
滴滴 | 9 |
亚马逊 | 8 |
语音 | 8 |
7.2 总之,我们应根据我们的目标去选择适当的分词方法。
- 对某一篇文章进行关键字Map,我们选择普通分词,并自行过滤关键词,或添加自定义词库。
- 对采集的一批样本进行关键字分析,我们可以选择TF-IDF,对所有的关键字进行词频统计,并绘制出关键字云图。
- 如果我们要分析一批样本中用户的分类,用户的行为,用户的目的,我们可以选择TextRank抽取指定词性的关键字进行统计分析。
文章转自:Python大数据:jieba分词,词频统计
===================== www.linguangling.com ========================
每一个成功的背后都有无数个无人知晓的黑夜。
因为
夜晚,是超越对手的最佳时机。
===================== www.linguangling.com ========================
expex.ru