Python自然语言处理:jieba分词,词频统计

Python,自然语言处理 2018-08-14

一、实验目的

  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数据源,处理数组进行去重、统计。

四、数据

  实验数据为百度随意打开的新闻,请读者自行按下表格式准备(分隔符:"|")

idtitlecontent
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 结果

wordcount
Facebook31
用户21
平台13
音频13
互联网12
公司12
20199
交通9
出行9
增长9
服务9
滴滴9
亚马逊8
语音8

  7.2 总之,我们应根据我们的目标去选择适当的分词方法。

    - 对某一篇文章进行关键字Map,我们选择普通分词,并自行过滤关键词,或添加自定义词库。
    - 对采集的一批样本进行关键字分析,我们可以选择TF-IDF,对所有的关键字进行词频统计,并绘制出关键字云图。
    - 如果我们要分析一批样本中用户的分类,用户的行为,用户的目的,我们可以选择TextRank抽取指定词性的关键字进行统计分析。

文章转自:Python大数据:jieba分词,词频统计


===================== www.linguangling.com ========================

每一个成功的背后都有无数个无人知晓的黑夜。

因为

夜晚,是超越对手的最佳时机。

===================== www.linguangling.com ========================


本文由 蔺光岭 创作,采用 知识共享署名 4.0,可自由转载、引用,但需署名作者且注明文章出处。

只有地板了

  1. expex.ru

    expex.ru

添加新评论