写在前面

入坑自然语言处理,最基本的就是要做文本挖掘,而首先要做的就是文本的预处理。自然语言处理的主要流程可以表示为:

文本->分句->分词->词性标注->短语分析->句法分析->语义分析->语篇分析->理解

分句这部分一般有标点符号分割,便于处理。于是首先要做的就是分词。英文单词天然有空格隔开容易按照空格分词,但是也有时候需要把多个单词做为一个分词,比如一些名词如“New York”,需要做为一个词看待。而中文由于没有空格,分词就是一个需要专门去解决的问题了。无论是英文还是中文,分词的原理都是类似的,本文就对文本挖掘时的分词原理做一个总结。

1.分词的基本原理

现代分词都是基于统计的分词,而统计的样本内容来自于一些标准的语料库。从统计学角度考虑,如果有一个句子S,它有m种分词选项如下:

其中下标ni代表第i种分词的词个数。如果我们从中选择了最优的第r种分词方法,那么这种分词方法对应的统计分布概率应该最大,即:

但是我们的概率分布P(Ai1,Ai2,...,Aini)并不好求出来,因为它涉及到ni个分词的联合分布。在NLP中,为了简化计算,我们通常使用马尔科夫假设,即每一个分词出现的概率仅仅和前一个分词有关,即:

而通过我们的标准语料库,我们可以近似的计算出所有的分词之间的二元条件概率,比如任意两个词w1,w2,它们的条件概率分布可以近似的表示为:

其中freq(w1,w2)表示w1,w2在语料库中相邻一起出现的次数,而其中freq(w1),freq(w2)分别表示w1,w2在语料库中出现的统计次数。

利用语料库建立的统计概率,对于一个新的句子,我们就可以通过计算各种分词方法对应的联合分布概率,找到最大概率对应的分词方法,即为最优分词。

2.N元模型

当然,你会说,只依赖于前一个词太武断了,我们能不能依赖于前两个词呢?即:

这样也是可以的,只不过这样联合分布的计算量就大大增加了。我们一般称只依赖于前一个词的模型为二元模型(Bi-Gram model),而依赖于前两个词的模型为三元模型。以此类推,我们可以建立四元模型,五元模型,...一直到通用的N元模型。越往后,概率分布的计算复杂度越高。当然算法的原理是类似的。

在实际应用中,N一般都较小,一般都小于4,主要原因是N元模型概率分布的空间复杂度为O(|V|N),其中|V|为语料库大小,而N为模型的元数,当N增大时,复杂度呈指数级的增长。

N元模型的分词方法虽然很好,但是要在实际中应用也有很多问题,首先,某些生僻词,或者相邻分词联合分布在语料库中没有,概率为0。这种情况我们一般会使用拉普拉斯平滑,即给它一个较小的概率值,这个方法在朴素贝叶斯算法原理小结也有讲到。第二个问题是如果句子长,分词有很多情况,计算量也非常大,这时我们可以用下一节维特比算法来优化算法时间复杂度。

3.维特比算法与分词

维特比算法采用的是动态规划来解决这个最优分词问题的,动态规划要求局部路径也是最优路径的一部分,很显然我们的问题是成立的。首先我们看一个简单的分词例子:"人生如梦境"。它的可能分词可以用下面的概率图表示:

图中的箭头为通过统计语料库而得到的对应的各分词位置BEMS(开始位置,结束位置,中间位置,单词)的条件概率。比如P(生|人)=0.17。有了这个图,维特比算法需要找到从Start到End之间的一条最短路径。对于在End之前的任意一个当前局部节点,我们需要得到到达该节点的最大概率δ,和记录到达当前节点满足最大概率的前一节点位置Ψ。

我们先用这个例子来观察维特比算法的过程。首先我们初始化有:

δ(人)=0.26      Ψ(人)=Start

δ(人生)=0.44      Ψ(人生)=Start

对于节点"生",它只有一个前向节点,因此有:

δ(生)=δ(人)P(生|人)=0.0442         Ψ(生)=人

对于节点"如",就稍微复杂一点了,因为它有多个前向节点,我们要计算出到“如”概率最大的路径:

δ(如)=max{δ(生)P(如|生),δ(人生)P(如|人生)}=max{0.01680,0.3168}=0.3168         Ψ(如)=人生

类似的方法可以用于其他节点如下:

δ(如梦)=δ(人生)P(如梦|人生)=0.242        Ψ(如梦)=人生
δ(梦)=δ(如)P(梦|如)=0.1996             Ψ(梦)=如
δ(境)=max{δ(梦)P(境|梦),δ(如梦)P(境|如梦)}=max{0.0359,0.0315}=0.0359         Ψ(境)=梦
δ(梦境)=δ(梦境)P(梦境|如)=0.1585       Ψ(梦境)=如
最后我们看看最终节点End:
δ(End)=max{δ(梦境)P(End|梦境),δ(境)P(End|境)}=max{0.0396,0.0047}=0.0396      Ψ(End)=梦境

由于最后的最优解为“梦境”,现在我们开始用Ψ反推:

Ψ(End)=梦境→Ψ(梦境)=如→Ψ(如)=人生→Ψ(人生)=start

从而最终的分词结果为"人生/如/梦境"。是不是很简单呢。

4.常用分词工具

对于文本挖掘中需要的分词功能,一般我们会用现有的工具。简单的英文分词不需要任何工具,通过空格和标点符号就可以分词了,而进一步的英文分词推荐使用NLTK。对于中文分词,则推荐用结巴分词(jieba)。这些工具使用都很简单。你的分词没有特别的需求直接使用这些分词工具就可以了。

以上~

Python自然语言处理之分词原理相关推荐

  1. 《自然语言处理实战入门》 ---- 第4课 :中文分词原理及相关组件简介 之 语言学与分词技术简介...

    <自然语言处理实战入门> ---- 第4课 :中文分词原理及相关组件简介 之 语言学与分词技术简介 https://edu.csdn.net/course/play/20769/25954 ...

  2. 《自然语言处理实战入门》 ---- 第4课 :中文分词原理及相关组件简介 之 汉语分词领域主要分词算法、组件、服务(上)...

    目录 0.内容梗概 1. 基于传统统计算法的分词组件 1.1 hanlp : Han Language Processing 1.2 语言技术平台(Language Technology Platfo ...

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

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

  4. 【Python自然语言处理】中文分词技术——规则分词

    中文分词方法 本文参考自书籍<Python自然语言处理实战:核心技术与算法> 用做个人的学习笔记和分享 1. 规则分词 规则分词是一种机械分词方法,主要通过维护词典,在切分语句时将语句的每 ...

  5. python自然语言处理 分词_Python 自然语言处理(基于jieba分词和NLTK)

    Python 自然语言处理(基于jieba分词和NLTK) 发布时间:2018-05-11 11:39, 浏览次数:1038 , 标签: Python jieba NLTK ----------欢迎加 ...

  6. 《自然语言处理实战入门》 第三章 :中文分词原理及相关组件简介 ---- 语言学与分词技术简介

    文章大纲 0.内容梗概 1. 汉语语言学简介 1.1 汉语与汉字的起源 1.2 汉字的统一与演变 1.3 印欧语系与汉藏语系 1.4 语言区别对于NLP 的影响 2. 词汇与分词技术简介 2.1 汉语 ...

  7. 自然语言处理实验—分词算法(含python代码及详细例子讲解)

    自然语言处理实验-分词算法 最近在学自然语言处理,这是第一个上机实验自然语言处理的分词算法,也是自然语言处理比较入门的算法.和大家分享一下. 首先,自然语言处理,英文是(Nature Language ...

  8. 《自然语言处理实战入门》第三章 :中文分词原理及相关组件简介 ---- 汉语分词领域主要分词算法、组件、服务(上)

    文章大纲 0.内容梗概 1. 基于传统统计算法的分词组件 1.1 hanlp : Han Language Processing 1.1.1 pyhanlp 安装 1.1.2 功能及分词样例 1.1. ...

  9. python自然语言处理书籍推荐-自然语言处理有哪些好的入门书籍推荐?入门首先应该有哪些实践?...

    自然语言处理入门书籍推荐: /><数学之美(第二版)> 由原谷歌自然语言处理专家吴军博士将原谷歌黑板报内容重新编辑整理而成,让非专业人士也能了解到算法与常见应用的背后数学原理. 介绍 ...

最新文章

  1. ECMAScript 6 模板字面量的常见用法
  2. LeetCode 140. 单词拆分 II
  3. SpringMVC 学习-异常处理 SimpleMappingExceptionResolver 类
  4. python零基础怎么学-python 零基础该怎么学?
  5. python爬取豆瓣电影并分析_Python爬取豆瓣电影的短评数据并进行词云分析处理
  6. 关于数组的 slice() 和 splice() 方法
  7. LeetCode(463)——岛屿的周长(JavaScript)
  8. 对/boot/grub/grub.conf的理解
  9. mac 中的 zip 和 unzip 命令
  10. 基于E4A的手机蓝牙串口助手app制作
  11. 服务器虚拟内存会导致卡顿吗,win7设置虚拟内存后导致电脑卡怎么办
  12. JAVA基础---函数式接口、Stream流
  13. 帆软通过js删除数据库表中的数据
  14. go语言连接远程服务器
  15. python怎么判断真假_Python不超过10行代码就可实现人脸识别,教你辨别真假
  16. 如何通过maven官网查询相关依赖的具体代码和版本?
  17. ResNet实战:单机多卡DDP方式、混合精度训练
  18. Android TextView垂直滚动,并精准定位到最后一行
  19. win10电脑添加惠普打印机,实现远程打印。
  20. url的post请求 Content-Type:application/json类型 Java后端接收(^_^)

热门文章

  1. 单链表的基本操作及尝试-插入排序
  2. oracle 不支持虚拟化,如何解决 surface book win10 系统下不支持虚拟化的问题 (无法运行虚拟设备)...
  3. enclosing的意思_enclosing class是什么意思
  4. 双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,)
  5. CBD家居健康生命的守护者
  6. 电大计算机应用基础win7操作,2018年电大专科计算机应用基础win7系统上机操作题操作.pdf...
  7. html隐藏的英文单词,html简单英文单词
  8. MATLAB·提取图像中多个目标
  9. Linux 虚拟机和主机互通 [万能方法]
  10. 上海外资银行总资产达1.5万亿元 较中国入世初期增近7倍