当前位置:   article > 正文

自然语言处理之中文分词(基于Python)_《白鹿原》词频统计

《白鹿原》词频统计

人生苦短,我用python

除了给你生孩子,python都能给你做到。
这句话所言不假,python拥有丰富的库,能完成各种各样的的功能。
只有你想不到的,没有python做不到的。下面我们来看看python在自然语言处理中的应用吧!

自然语言处理(NLP)

自然语言处理(NLP)是计算机科学人工智能语言学关注计算机和人类(自然)语言之间的相互作用的领域。
这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。
自然语言理解系统把自然语言转化为计算机程序更易于处理的形式即让电脑“懂”人类的语言,自然语言生成系统把计算机数据转换为自然语言。

python之中文分词

中文分词 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。

在自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,许多西文的处理方法中文不能直接采用,就是因为中文必需有分词这道工序。
中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。其他的比如机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。
因为中文需要分词,可能会影响一些研究,但同时也为一些企业带来机会,因为国外的计算机处理技术要想进入中国市场,首先也是要解决中文分词问题。

现在常用的分词方法有以下三种:

  1. 基于字符串匹配的分词方法
  2. 基于理解的分词方法
  3. 基于统计的分词方法

基于字符串匹配的分词方法

基于字符串匹配的分词方法又称机械分词方法
它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。

  1. 按照扫描方向的不同,字符串匹配分词方法可以分为正向匹配和逆向匹配
  2. 按照不同长度优先匹配的情况,可以分为最大匹配和最小匹配
  3. 按照是否与词性标注过程相结合,可以分为单纯分词方法和分词与词性标注相结合的一体化方法

由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。
-------取自《百度百科》

正向最大匹配:在这里插入图片描述

逆向最大匹配:
在这里插入图片描述

基于理解的分词方法

基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。
其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。
它通常包括三个部分:分词子系统、句法语义子系统、总控部分。
在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。

困境
由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段
-------取自《百度百科》

基于统计的分词方法

基于统计的分词方法是在给定大量已经分词的文本的前提下,利用统计机器学习模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。
例如最大概率分词方法和最大熵分词方法等。
随着大规模语料库的建立,统计机器学习方法的研究和发展,基于统计的中文分词方法渐渐成为了主流方法主要的统计模型有:N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),条件随机场模型(Conditional Random Fields,CRF)等
-------取自《百度百科》
优势
在实际的应用中,基于统计的分词系统都需要使用分词词典来进行字符串匹配分词,同时使用统计方法识别一些新词,即将字符串频率统计和字符串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。

环境配置

  1. 联想 Win 10 企业版 64位操作系统
  2. IDE:JetBrains Pycharm社区版+VS2017
    JetBrains Pycharm社区版用于执行程序,查看运行结果
    VS2017用于交互式编程
  3. 所需要的库:
    1.jieba库
    2.snowNLP库

中文分词之战斗机--------jieba库

正所谓“前人种树,后人乘凉”,中文分词的原理并不简单,但前人已为我们开好了路,为我们创造了许许多多用于分词的库,简化了很多操作,为我们的学习提供了许许多多好的工具,下面我们来学习学习号称中文分词战斗机的“jieba”库吧!
jieba顾名思义即结巴,结巴说话,不就像是将中文句子分词开来说么?不得不说,这个名字真有中国味!

jieba库有三种模式:

  1. 精确模式: jieba.lcut(text, cut_all=Flase) 试图将句子最精确地切开,适合文本分析
  2. 全模式: jieba.lcut(text, cut_all=True) 把句子中所有的可以成词的词语都扫描出来(速度快)
  3. 搜索引擎模式: jieba.lcut_for_search(text) 在精确模式的基础上,对长词再次切分,适合用于搜索引擎分词

**1.**精确模式,返回一个列表类型的分词结果

word=jieba.lcut(“我们生而破碎,用活着来修修补补。”) >>>print(word)可得: [‘我们’, ‘生而’, ‘破碎’, ‘,’, ‘用’, ‘活着’, ‘来’, ‘修修补补’, ‘。’]

2. 全模式,返回一个列表类型的分词结果,存在冗余

word=jieba.lcut("我们生而破碎,用活着来修修补补。“,cut_all=True) >>>[‘我们’, ‘生’, ‘而’, ‘破碎’, ‘’, ‘’, ‘用活’, ‘活着’, ‘来’, ‘修修’, ‘修修补补’, ‘修补’, ‘补补’, ‘’, ‘’]

3. 搜索引擎模式,返回一个列表类型的分词结果,存在冗余

word=jieba.lcut_for_search(“我们生而破碎,用活着来修修补补。”)
[‘我们’, ‘生而’, ‘破碎’, ‘,’, ‘用’, ‘活着’, ‘来’, ‘修修’, ‘修补’, ‘补补’, ‘修修补补’, ‘。’]

备忘:记得先import jieba

探究jieba库的原理

简单理解

  1. 利用一个中文词库,确定汉字之间的关联概率
  2. 汉字间概率大的组成词组,形成分词结果
  3. 除了分词,用户还可以添加自定义词组

jieba库涉及的算法

  1. 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG);
  2. 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;
  3. 对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。

不得不说,这些算法不仅在中文分词中应用广泛,同时在语音识别,无人驾驶这些领域也有相当大的应用。
涉及的算法比较复杂,感兴趣的同学可以参考相关书籍。
这里推荐一本书《数学之美》,里面讲述了许多数学知识在现实生活中的应用,将复杂的原理,简单化地描述出来,是一本科普数学应用的很不错的书籍,相信这本书会提升你对数学的兴趣!

中文分词之词频统计

先来看一个问题,如果有人问你,《清朝那些事儿》中出场次数最多的前十大人物是谁,你会怎么办呢?
如果没有学过编程,可能大部分都会想,天呐,我怎么知道?可能只能去百度,或者傻傻地挨个数。
可python却可以简单地解决这种问题,我们来试试吧。

  1. 首先,安装jieba库。 这个比较简单,可用pip或者在IDE内部便可简单地安装成功。

  2. 在pycharm中对应文件夹中存入文本 清朝那些事儿.txt

  3. 利用指令,在程序中读取文件,格式为“utf-8”。
    代码如下:txt=open(“清朝那些事儿.txt”,“r”,encoding=“utf-8”).read()

  4. 利用精确模式进行分词,有words=jieba.lcut(txt) 此时分好的词,存在words中

  5. 创建空字典counts 代码如下:counts={}

  6. 对words里的词进行遍历,筛选掉长度为一的字,剩下的词语,以键对应词语,值对应出现次数 统计代码如下: counts[word]=counts.get(word,0)+1

  7. 再将字典转换成列表,便于排序。排序后输出,即可得到。

完整代码如下:

import jieba
txt=open("清朝那些事儿.txt","r",encoding="utf-8").read()
words = jieba.lcut(txt)
counts={}
for word in words:
    if len(word)==1:
        continue
    else:
        counts[word]=counts.get(word,0)+1
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(10):
    word,count=items[i]
    print("{0:<10}{1:>5}".format(word,count))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输出结果是:
在这里插入图片描述

此时,大家可能发现,统计出来频数最高的很多并不是人物,这时候就需要我们对数据进行筛选清洗了。

这时可利用字典的 del d[k] 函数对不需要的函数进行删除。即如添加以下语句

excludes={"一个","皇帝","自己","没有","他们","当时","于是","大臣","太监","中国","非常","就是","时候","清朝","皇上","什么","这个","之后","如果","知道","官员","后来","已经","以后","这样","可以"}
#筛选除去不需要的词语
for word in words:
    if len(word)==1:
        continue
    counts[word]=counts.get(word,0)+1
    for word in excludes:
    del counts[word]
    #删除需要屏蔽的词语
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这样逐步筛选,便可得到想要的结果

结果如下图:
在这里插入图片描述

还可以利用绘图功能做出直方图,使数据更加直观。
在这里插入图片描述

同时还可以利用wordcloud库制作词云,以词的大小和颜色表现出现的次数,十分直观。
在这里插入图片描述
只需添加以下代码即可得到:

w = wordcloud.WordCloud(   width = 1000, height = 700,    background_color = "white",     font_path = "msyh.ttc")
w.generate(txt)
w.to_file("hanchao.png")
  • 1
  • 2
  • 3

由此可得出场次数最多的是乾隆,慈禧,康熙,雍正,光绪,康有为等人。一个浩大工作量,便在python谈笑间,灰飞烟灭。不得不对python感到无比地佩服,也对许许多多计算机从业者,表示深深的敬重,因为他们,才有了我们的方便。

附上完全代码一份,方便大家实战。

import jieba
txt=open("清朝那些事儿.txt","r",encoding="utf-8").read()#打开文件,读取文本,注意得是utf-8格式
excludes={"一个","皇帝","自己","没有","他们","当时","于是","大臣","太监","中国","非常","就是","时候","清朝","皇上","什么","这个","之后","如果","知道","官员","后来","已经","以后","这样","可以"}
#筛选除去不需要的词语
words = jieba.lcut(txt)#即利用jieba库对文本进行分词
counts={}
for word in words:
    if len(word)==1:
        continue
    counts[word]=counts.get(word,0)+1
for word in excludes:
    del counts[word]#删除需要屏蔽的词语
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)#进行排序
for i in range(11):
    word,count=items[i]
    print("{0:<12}{1:>-5}".format(word,count))#输出结果
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

同时,这种思路还可以拓展,我们不一定只能分析《清朝那些事儿》,还可以分析《三国演义》,还有《白鹿原》,而且仅仅需要改变读取的文件即可。可参考下图。
实例分析之《白鹿原》
源代码

运行结果
相信大家对jieba库都有了很深的印象,并且都会学会使用了吧,下面我们来瞅瞅一个功能更为强大更加丰富的库吧!

中文文本分析之导弹-------SnowNLP

SnowNLP – 一个用来处理中文文本的库
正如——“在自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,许多西文的处理方法中文不能直接采用,就是因为中文必需有分词这道工序。”故中国无数辛勤研究者,夜以继日地研究出这个专注于中文文本分析的snowNLP库,这是一个比jieba库还要强大的库,在此,再次对他们表示深深的谢意。下面我们来学习学习这个库吧!

SnowNLP库介绍
SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。

关于SnowNLP的安装
snownlp库的安装比常规库较为繁琐,往往在IDE,或者pip方法中安装,会报错,而且下载速度极慢,这无疑使人望而却步。
所以如何下载安装这个库呢?经过多次试验,发现如下方法最快且成功率高

  1. 先从官网下载这个库的文件
  2. 下载下来是一个压缩包,将其解压,然后再解压文件里按住Shiift+右键 打开命令行窗口,输入python setup.py install
  3. 再输入python
  4. 再输入import snownlp即可发现安装成功

在此,附一段SnowNLP库的下载链接:
链接:https://pan.baidu.com/s/1mkV3M8GWzn-QF9f6aFtTLQ
提取码:itan

SnowNLP库的基本功能

以下是SnowNLP库常用的几个函数功能:

  1. s.words 分词
  2. s.pinyin 转拼音
  3. s.sentiments 情感系数
  4. s.keywords(3) 关键词提取
  5. s.summary(3) 自动文摘
  6. s.sentences 句子切分

以下是一段实例
用久了pycharm,不如再试试用VS2017在python交互式窗口下编程。

from snownlp import SnowNLP
text=u'''愿你出走半生,归来仍是少年。'''
s=SnowNLP(text)
  • 1
  • 2
  • 3

分词

s.words
[‘愿’, ‘你’, ‘出’, ‘走’, ‘半生’, ‘,’, ‘归来’, ‘仍’, ‘是’, ‘少年’, ‘。’]

转拼音

s.pinyin
[‘yuan’, ‘ni’, ‘chu’, ‘zou’, ‘ban’, ‘sheng’, ‘,’, ‘gui’, ‘lai’, ‘reng’, ‘shi’, ‘shao’, ‘nian’, ‘。’]

情感系数

s.sentiments
0.996543694570181

关键词提取

s.keywords(3)
[‘出’, ‘半生’, ‘走’]

自动文摘

s.summary(2)
[‘愿你出走半生’, ‘归来仍是少年’]

句子切分

s.sentences
[‘愿你出走半生’, ‘归来仍是少年’]

相信大家也发现了,SnowNLP库的功能相当丰富,不仅能做文本分词,还能够进行文本分析,有时候甚至能代替一些人类的行为,这也是比jieba库更为优秀的一点,这也为中文信息处理做了巨大贡献,再次对SnowNLP作者表示感谢!

下面是另一段实例:

>>> from snownlp import SnowNLP
>>> text=u'''雄伟壮观的长城,横亘在我国北部河山,它是人类建筑史上罕见的古军事防御工程。修筑长城的目的是为了积极防御,它并非简单孤立的一线城墙,而是由点到线、由线到面地把长城沿线的城墙、关城、隘口、墩堡、营城、卫所、烽火台和军事重镇连接成一张严密的网,形成一个完整的防御体系。'''
>>> s=SnowNLP(text)
>>> s.keywords(3)
['长城', '军事', '防御']
>>> s.summary(3)
['修筑长城的目的是为了积极防御', '而是由点到线、由线到面地把长城沿线的城墙、关城、隘口、墩堡、营城、卫所、烽火台和军事重镇连接成一张严密的网', '它是人类建筑史上罕见的古军事防御工程']
>>> s.pinyin
['xiong', 'wei', 'zhuang', 'guan', 'de', 'chang', 'cheng', ',', 'heng', 'gen', 'zai', 'wo', 'guo', 'bei', 'bu', 'he', 'shan', ',', 'ta', 'shi', 'ren', 'lei', 'jian', 'zhu', 'shi', 'shang', 'han', 'jian', 'de', 'gu', 'jun', 'shi', 'fang', 'yu', 'gong', 'cheng', '。', 'xiu', 'zhu', 'chang', 'cheng', 'de', 'mu', 'di', 'shi', 'wei', 'le', 'ji', 'ji', 'fang', 'yu', ',', 'ta', 'bing', 'fei', 'jian', 'dan', 'gu', 'li', 'de', 'yi', 'xian', 'cheng', 'qiang', ',', 'er', 'shi', 'you', 'dian', 'dao', 'xian', '、', 'you', 'xian', 'dao', 'mian', 'di', 'ba', 'chang', 'cheng', 'yan', 'xian', 'de', 'cheng', 'qiang', '、', 'guan', 'cheng', '、', 'ai', 'kou', '、', 'dun', 'bu', '、', 'ying', 'cheng', '、', 'wei', 'suo', '、', 'feng', 'huo', 'tai', 'huo', 'jun', 'shi', 'zhong', 'zhen', 'lian', 'jie', 'cheng', 'yi', 'zhang', 'yan', 'mi', 'de', 'wang', ',', 'xing', 'cheng', 'yi', 'ge', 'wan', 'zheng', 'de', 'fang', 'yu', 'ti', 'xi', '。']
>>> s.words
['雄伟', '壮观', '的', '长城', ',', '横亘', '在', '我国', '北部', '河山', ',', '它', '是', '人类', '建筑', '史', '上', '罕见', '的古', '军事', '防御', '工程', '。', '修筑', '长城', '的', '目的', '是', '为了', '积极', '防御', ',', '它', '并', '非', '简单', '孤立', '的', '一线', '城墙', ',', '而', '是', '由', '点', '到线', '、', '由线', '到', '面', '地', '把', '长城', '沿线', '的', '城墙', '、', '关', '城', '、', '隘', '口', '、', '墩', '堡', '、', '营', '城', '、', '卫', '所', '、', '烽火台', '和', '军事', '重镇', '连接', '成', '一', '张', '严密', '的', '网', ',', '形成', '一个', '完整', '的', '防御', '体系', '。']
>>> s.sentences
['雄伟壮观的长城', '横亘在我国北部河山', '它是人类建筑史上罕见的古军事防御工程', '修筑长城的目的是为了积极防御', '它并非简单孤立的一线城墙', '而是由点到线、由线到面地把长城沿线的城墙、关城、隘口、墩堡、营城、卫所、烽火台和军事重镇连接成一张严密的网', '形成一个完整的防御体系']
>>> s.sentiments
0.9999999995020346
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

SnowNLP库功能远不止此,有兴趣的同学可以查阅官方网站:
https://github.com/isnowfy/snownlp

总结

不管黑猫白猫,能抓住老鼠的就是好猫。
同理,能完成自己需求的库,便是好库。
中文分词是很多技术的基础,只有掌握了分词技术,才能做更多更复杂更现实的项目,比如机器翻译、语音合成、自动分类、自动摘要、自动校对都需要用到分词技术。
而科研院校研究的技术,大部分不能很快产品化,而一个专业公司的力量毕竟有限,中文分词技术要想更好的服务于更多的产品,更有效地应用与实际,还有很长一段路。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号