Datawhale | 自然语言和处理(3)

写在前面:

由于是初次接触NLP,对这方面没有什么自己的见解,所以都是按照助教给的框架来总结,目前也在学习
stanford的cs224N,也打算之后再开一个分类专门学习cs224N,希望自己能够在NLP这条路上越走越远!

一.基本文本处理技能

1.分词

1.1 概述

  • 词是自然语言中能够独立运用的最小单位,是信息处理的基本单位。自然语言处理的对象是一个个的句子,拿到句子之后一般要对句子进行分词。分词就是利用计算机识别出文本中词的过程。大部分的印欧语言,词与词之间有空格之类的显示标志指示词的边界。因此,利用很容易切分出句子中的词。而与大部分的印欧语言不同,中文语句中词与词之间没有空格标志指示,所以,需要专门的方法去实现中文分词
  • 我的理解就是“分词”就是给你一个句子,你如何把他分成很多个词语的组合。例如“我爱自然语言处理!”这句话,你可以分为“我 爱 自然语言处理!”或者“我爱 自 然语言 处理!”这两种分法在计算机看来是完全一样的,但是意思却完全不同。不同的分词会造成完全不同的语义理解,所以如何把词从句子中正确的切分出来就显得尤其重要。
  • 中文分词技术已经非常成熟,大致可以分为三类,第一类是基于字符串匹配的,即扫描字符串,如果发现字符串的子串和词典中的词相同,就算匹配,比如机械分词方法。这类分词方法通常会加入一些启发式规则,例如,正向最大匹配、反向最大匹配、长词优先等。第二类时基于统计的分词方法,它们基于人工标注的词性和统计特征,对中文进行建模,即根据观测到的数据(标注好的语料)对模型参数进行训练,在分词阶段再通过模型计算各种分词出现的概率,将概率最大的分词结果作为最终结果。常见的序列标注模型有HMM和CRF。这类分词算法能够很好的处理歧义和未登录词问题,效果要比前一类效果好,但是需要大量的人工标注数据,且分词速度较慢。第三类是理解分词,通过让计算机模拟人对句子的理解,达到识别词的效果。由于汉语语义的复杂性,难以将各种语言信息组织成机器能够识别的形式,目前这种分词系统还处于试验阶段。
  • 接下来主要就是介绍一下基于字符串匹配的方法,这一类方法也叫基于词表的分词方法,基本思路是首先存在一份字典,对于要分词的文本从左至右或从右至左扫描一遍,遇到字典里有最长的词就标识出来,遇到不认识的字串就分割成单字词。

1.2 正向最大匹配法(forward maximum matching method,FMM)

算法步骤:

  • 从左向右取待切分汉语句的m个字符作为匹配字段,m为大机器词典中最长词条个数
  • 查找大机器词典并进行匹配,若匹配成功,则将这个匹配字段作为一个词切分出来;若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程直到切分出所有词为止

到底什么意思等我说完反向最大匹配算法的定义后举个例子就明白了

1.3 逆向最大匹配法(backward maximum matching method, BMM)

  • 是正向最大匹配的逆向思维(最大匹配的顺序不是从首字母开始,而是从末尾开始,由右向左),匹配不成功,将匹配字段的最前一个字去掉
  • 实践证明,逆向最大匹配算法要优于正向最大匹配算法

举个栗子:

要分词的句子:我爱自然语言处理
字典中的内容:我 爱自 然 自然语 言 语言 处理

正向最大匹配法:
(1)字典中最长的词语是4个字符,所以从左往右去4个字符进行匹配,也就是“我爱自然”这四个字;
(2)开始与字典进行匹配,“我爱自然”,发现字典中没有这个词,就把最后一个字去了再次匹配,也就是“我爱自”和字典进行匹配,发现也没有,在减少一个,“我爱”和字典匹配,发现还是没有,最后只剩一个“我了,扫描后发现”匹配上了,找到第一个词了;
(3)继续匹配剩下的句子,仍然是取4个字符,即 “爱自然语”和词典匹配,重复(2)的操作后找到第二个词“爱自”;
(4)重复操作,直到句子分解完毕,匹配结束。
故正向匹配的结果就是我 爱自 然 语言 处理

反向匹配算法:
(1)反向匹配算法流程和正向基本一样,只不过是从后往前匹配
(2)反向匹配的结果最终也是 我 爱自 然 语言 处理

这个句子举得不好,正方反向的结果是一样的,但是大家懂我的意思就行了

1.4 双向匹配算法(Bi-directction Matching method,BM)

将正向最大匹配法得到的分词结果和逆向最大匹配法的到的结果进行比较,从而决定正确的分词方法

中文中90.0%左右的句子,正向最大匹配法和逆向最大匹配法完全重合且正确,只有大概9.0%的句子两种切分方法得到的结果不一样,但其中必有一个是正确的(歧义检测成功),只有不到1.0%的句子,或者正向最大匹配法和逆向最大匹配法的切分虽重合却是错的,或者正向最大匹配法和逆向最大匹配法切分不同但两个都不对(歧义检测失败)。这正是双向最大匹配法在实用中文信息处理系统中得以广泛使用的原因所在。

2.词、字符频率统计

一般使用python中的collections.Counter模块,collections模块包含了dict、set、list、tuple以外的一些特殊的容器类型,分别是:

  • OrderedDict类:排序字典,是字典的子类
  • namedtuple()函数:命名元组,是一个工厂函数
  • Counter类:为hashable对象计数,是字典的子类
  • deque:双向队列
  • defaultdict:使用工厂函数创建字典,使不用考虑缺失的字典键

其中Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
想知道更多关于Counter类的信息参考下面链接:http://www.pythoner.com/205.html

二. 语言模型

2.1 概述

  • 语言模型就是用来计算一个句子的概率的模型,也就是判断一句话是否是人话的概率,通俗来说就是看一句话能不能读通的概率。
  • 在这里我们引入了马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的一个或者几个词有关,如果一个词的出现与它周围的词是独立的,那么我们就称之为unigram也就是一元语言模型;如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为bigram;假设一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为trigram;一般来说,N元模型就是假设当前词的出现概率只与它前面的N-1个词有关。而这些概率参数都是可以通过大规模语料库来计算。在实践中用的最多的就是bigram和trigram了,高于四元的用的非常少,由于训练它须要更庞大的语料,并且数据稀疏严重,时间复杂度高,精度却提高的不多。

2.2 一元语言模型(unigram)

一元语言模型中,我们的句子概率定义为:
在这里插入图片描述
这个式子成立的条件是有一个假设,就是条件无关假设,我们认为每个词都是条件无关的。我们得到每个参数实例的值用的是极大似然估计法。
比如我们说我们的训练语料是下面这个简单的语料。
在这里插入图片描述
那么我们的字典为:“星期五早晨,我特意起了个大早为的就是看天空。” 22个不同词,每个词语的概率直接用极大似然估计法估计得到。
如:p(星)=1/27,p(期)=1/27,一直算到后面的空为1/27.
于是我们就需要存储我们学习得到的模型参数,一个向量,22维,每个维度保存着每个单词的概率值。用语言模型估计一句话的概率的方法如下所示:
p(我看看早晨的天空)=p(我)*p(看)*p(看)*p(早)*p(晨)p(的)p(天)p(空)=1/271/271/27…*1/27就能够直接运算出来。
于是我们得出,只要将每句话拆开为每个单词然后用累积形式运算,这样我们就能算出每句话的概率来了

2.2 二元语言模型(bigram)

首先来看两句话,he eats pizza与he drinks pizza,我们需要用语言模型来判断这两句话出现的概率。
用一元语言模型来分别计算这两个句子的概率大小:
p(he eats pizza) = p(he) * p(eats) * p(pizza)
p(he drinks pizza) = p(he) * p(drinks) * p(pizza)
可以看出,其实通过一元语言模型的计算公式,我们看不出上面两个句子的概率有多大差别,但是我们很明显知道第一句话比第二句话的概率要大的多,因为正确的表达应该就是吃披萨,而不是喝披萨。
我们用了一元语言模型,假设每个词都是条件无关的,这样的话就会导致我们考虑不到两个词之间的关系搭配,比如在这个例子中,很明显应该判断的是p(pizza|eats)与p(pizza|drinks)的概率大小比较。
这也就是二元语言模型需要考虑的问题。
二元语言模型的定义:
在这里插入图片描述
二元语言模型也能比一元语言模型能够更好的get到两个词语之间的关系信息

2.3 n-gram模型

  • N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列
  • 该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。
  • 常用的是二元的Bi-Gram和三元的Tri-Gram
    关于N-gram模型的具体内容可参看
    https://zhuanlan.zhihu.com/p/32829048
    https://zhuanlan.zhihu.com/p/28080127

2.4 频率统计

unigram、bigram频率统计也可以使用上述所说的Python中的collections.Counter模块

三. 文本矩阵化

由于时间原因没有实际操作,等过两天党课答辩结束后再补充这部分的内容,助教请见谅!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值