自然语言处理好就业吗?

传誉 75 0

python自然语言处理有没有新的版本

1 缘起

本文试着向读者们介绍自然语言处理(Natural Language Processing)这一领域,通常简称为 NLP。然而,不同于一般只是描述 NLP 重要概念的文章,本文还借助 Python 来形象地说明。对于不熟悉 Python 的读者们,本文也提供了部分参考资料教你如何进行 Python 编程。

2 相关介绍

2.1 自然语言处理

自然语言处理广纳了众多技术,对自然或人类语言进行自动生成,处理与分析。虽然大部分 NLP 技术继承自语言学和人工智能,但同样受到诸如机器学习,计算统计学和认知科学这些相对新兴的学科影响。

在展示 NLP 技术的例子前,有必要介绍些非常基础的术语。请注意:为了让文章通俗易懂,这些定义在语言上就不一定考究。

词例(Token):对输入文本做任何实际处理前,都需要将其分割成诸如词、标点符号、数字或纯字母数字(alphanumerics)等语言单元(linguistic units)。这些单元被称为词例。

句子:由有序的词例序列组成。

词例还原(Tokenization):将句子还原成所组成的词例。以分割型语言(segmented languages)英语为例,空格的存在使词例还原变得相对容易同时也索然无味。然而,对于汉语和阿拉伯语,因为没有清晰的边界,这项工作就稍显困难。另外,在某些非分割型语言(non-segmented languages)中,几乎所有的字符(characters)都能以单字(one-character)存在,但同样也可以组合在一起形成多字(multi-characterwords)形式。

语料库:通常是由丰富句子组成的海量文本。

词性标签(Part-of-speech (POS) Tag):任一单词都能被归入到至少一类词汇集(set of lexical)或词性条目(part-of-speech categories)中,例如:名词、动词、形容词和冠词等。词性标签用符号来代表一种词汇条目——NN(名词)、VB(动词)、JJ(形容词)和 AT(冠词)。Brown Corpus 是最悠久,也是最常用的标注集之一。详情且听下回分解。

剖析树(Parse Tree):利用形式语法(formal grammar)的定义,可以用树状图来表示给定句子的句法(syntactic)结构。

认识了基本的术语,下面让我们了解 NLP 常见的任务:

词性标注(POS Tagging):给定一个句子和组词性标签,常见的语言处理就是对句子中的每个词进行标注。举个例子,The ball is red,词性标注后将变成 The/AT ball/NN is/VB red/JJ。最先进的词性标注器[9]准确率高达 96%。文本的词性标注对于更复杂的 NLP 问题,例如我们后面会讨论到的句法分析(parsing)和机器翻译(machine translation)非常必要。

计算形态学(Computational Morphology):大量建立在“语素”(morphemes/stems)基础上的词组成了自然语言,语素虽然是最小的语言单元,却富含意义。计算形态学所关心的是用计算机发掘和分析词的内部结构。

句法分析(Parsing):在语法分析的问题中,句法分析器(parser)将给定句子构造成剖析树。为了分析语法,某些分析器假定一系列语法规则存在,但目前的解析器已经足够机智地借助复杂的统计模型[1]直接推断分析树。多数分析器能够在监督式设置(supervised setting)下操作并且句子已经被词性标注过了。统计句法分析是自然语言处理中非常活跃的研究领域。

机器翻译(Machine Translation(MT)):机器翻译的目的是让计算机在没有人工干预的情况下,将给定某种语言的文本流畅地翻译成另一种语言文本。这是自然语言处理中最艰巨的任务之一,这些年来已经用许多不同的方式解决。几乎所有的机器翻译方法都依赖了词性标注和句法分析作为预处理。

2.2 Python

Python 是一种动态类型(dynamically-typed),面向对象的解释式(interpreted)编程语言。虽然它的主要优势在于允许编程人员快速开发项目,但是大量的标准库使它依然能适应大规模产品级工程项目。Python 的学习曲线非常陡峭并且有许多优秀的在线学习资源[11]。

2.3 自然语言工具集(Natural Language Toolkit)

尽管 Python 绝大部分的功能能够解决简单的 NLP 任务,但不足以处理标准的自然语言处理任务。这就是 NLTK (自然语言处理工具集)诞生的原因。NLTK 集成了模块和语料,以开源许可发布,允许学生对自然语言处理研究学习和生产研究。使用 NLTK 最大的优势是集成化(entirely self-contained),不仅提供了方便的函数和封装用于建立常见自然语言处理任务块,而且提供原始和预处理的标准语料库版本应用在自然语言处理的文献和课程中。

3 使用 NLTK

NLTK 官网提供了很棒的说明文件和教程进行学习指导[13]。单纯复述那些作者们的文字对于他们和本文都不公平。因此我会通过处理四个难度系数依次上升的 NLP 任务来介绍 NLTK。这些任务都来自于 NLTK 教程中没有给出答案的练习或者变化过。所以每个任务的解决办法和分析都是本文原创的。

3.1 NLTK 语料库

正如前文所说,NLTK 囊括数个在 NLP 研究圈里广泛使用的实用语料库。在本节中,我们来看看三个下文会用到的语料库:

布朗语料库(Brown Corpus):Brown Corpus of Standard American English 被认为是第一个可以在计算语言学处理[6]中使用的通用英语语料库。它包含了一百万字 1961 年出版的美语文本。它代表了通用英语的样本,采样自小说,新闻和宗教文本。随后,在大量的人工标注后,诞生了词性标注过的版本。

古登堡语料库(Gutenberg Corpus):古登堡语料库从最大的在线免费电子书[5]平台 古登堡计划(Gutenberg Project) 中选择了 14 个文本,整个语料库包含了一百七十万字。

Stopwords Corpus:除了常规的文本文字,另一类诸如介词,补语,限定词等含有重要的语法功能,自身却没有什么含义的词被称为停用词(stop words)。NLTK 所收集的停用词语料库(Stopwords Corpus)包含了 来自 11 种不同语言(包括英语)的 2400 个停用词。

3.2 NLTK 命名约定

在开始利用 NLTK 处理我们的任务以前,我们先来熟悉一下它的命名约定(naming conventions)。最顶层的包(package)是 nltk,我们通过使用完全限定(fully qualified)的加点名称例如:nltk.corpus and nltk.utilities 来引用它的内置模块。任何模块都能利用 Python 的标准结构 from . . . import . . . 来导入顶层的命名空间。

3.3 任务 1 : 探索语料库

上文提到,NLTK 含有多个 NLP 语料库。我们把这个任务制定为探索其中某个语料库。

任务:用 NLTK 的 corpus 模块读取包含在古登堡语料库的 austen-persuasion.txt,回答以下问题:

这个语料库一共有多少字?

这个语料库有多少个唯一单词(unique words)?

前 10 个频率最高的词出现了几次?

利用 corpus 模块可以探索内置的语料库,而且 NLTK 还提供了包含多个好用的类和函数在概率模块中,可以用来计算任务中的概率分布。其中一个是 FreqDist,它可以跟踪分布中的采样频率(sample frequencies)。清单1 演示了如何使用这两个模块来处理第一个任务。

清单 1: NLTK 内置语料库的探索.

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

   

# 导入 gutenberg 集

from nltk.corpus import gutenberg

# 都有些什么语料在这个集合里?

print gutenberg.fileids()

['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt', 'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt', 'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt', 'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt', 'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt', 'shakespeare-macbeth.txt', 'whitman-leaves.txt']

# 导入 FreqDist 类

from nltk import FreqDist

# 频率分布实例化

fd = FreqDist()

# 统计文本中的词例

for word in gutenberg.words('austen-persuasion.txt'):

... fd.inc(word)

...

print fd.N() # total number of samples

98171

print fd.B() # number of bins or unique samples

6132

# 得到前 10 个按频率排序后的词

for word in fd.keys()[:10]:

... print word, fd[word]

, 6750

the 3120

to 2775

. 2741

and 2739

of 2564

a 1529

in 1346

was 1330

; 1290

   

解答:简奥斯丁的小说 Persuasion 总共包含 98171 字和 6141 个唯一单词。此外,最常见的词例是逗号,接着是单词the。事实上,这个任务最后一部分是最有趣的经验观察之一,完美说明了单词的出现现象。如果你对海量的语料库进行统计,将每个单词的出现次数和单词出现的频率由高到低记录在表中,我们可以直观地发现列表中词频和词序的关系。事实上,齐普夫(Zipf)证明了这个关系可以表达为数学表达式,例如:对于任意给定单词,$fr$ = $k$, $f$ 是词频,$r$ 是词的排列,或者是在排序后列表中的词序,而 $k$ 则是一个常数。所以,举个例子,第五高频的词应该比第十高频的词的出现次数要多两倍。在 NLP 文献中,以上的关系通常被称为“齐普夫定律(Zipf’s Law)”。

即使由齐普夫定律描述的数学关系不一定完全准确,但它依然对于人类语言中单词分布的刻画很有用——词序小的词很常出现,而稍微词序大一点的则较为少出现,词序非常大的词则几乎没有怎么出现。任务 1 最后一部分使用 NLTK 非常容易通过图形进行可视化,如 清单 1a 所示。相关的 log-log 关系,如图 1,可以很清晰地发现我们语料库中对应的扩展关系。

NLP自然语言处理

罗素悖论:由所有不包含自身的集合构成的集合

例子:理发师称只给那些不给自己理发的人理发。

基于集合论,理发师无论给自己理发还是不给自己理发都是矛盾的。

因此集合论不是完备的。 即使后面冯罗伊德等科学家提出了各种假定条件。

由于上述的原因,集合率无法很好的描述自然语言,科学家发现通过概率模型可以更好的描述自然语言。

深度学习来处理自然语言属于概率模型

证明最小点位于坐标轴上

h = f+c|x|

由于在x = 0处不可导

h-left'(0)*h-right'(0) = (f'+c)*(f'-c)

那么如果c|f'(0)|可得,h在0处左右导数异号

0是最值。

那么在损失函数加入L1正则化后,可以得到某些维度容易为0,从而得到稀疏解

几乎所有的最优化手段,都将适用凸优化算法来解决

P(A|B) = P(A and B) / P(B)

if A and B 独立

=》P(A and B| C) = P(A|C)*P(B|C)

也可以推出

=A(A|B and C) = P(A|C) (B交C不为空)

抛9次硬币,硬币出现正面的概率是0.5,出现k次的概率分布如下如

服从正态分布

x的平均值

E = x*p(x) + ...

x相对于期望的偏离

var = (x-E(x))^2

conv = (x - E(x))*(m - E(m))

描述x,m是否有同分布

按理协方差为0,并不代表x和m没有关系

例如下图

如果点的分布对称的分布,会得到协方差为0,但是其实他们是有关系的。

把每个相关的概率累加,得到联合概率

P(x1=m1,x2=m2...) = n!*P1 m1/m1!*P2 m2/m2!

T(n) = (n-1)!

T(x)用一条曲线逼近n!,进而可以求得非整数的阶乘

由二项式分布推出

P = T(a+b)*x (a-1)*(1-x) (b-1)/(T(a)*T(b))

则正态分布

y为0时,不考虑y‘。y为1时,y'越接近1,越小,越靠近0,越大

把D最小化,迫使y'逼近y

对于一个句子,有若干单词组成。例如

C1: The dog laughs.

C2: He laughs.

那么计算P(C1) = P(The, Dog, laughs)的概率和P(C2) = P(He, laughs)的概率。

根据历史文本的统计学习。

可以得到P(C1)P(C2)

P('I love the game') = P('I')*P('love')*P('the')*P('game')

其中P(work) = 频率/总单词数

计算一篇文章是积极的还是消极的。

P(y|x) = sigmod(wx)

x是文章内每个单词的频率

y表示积极和消极情感

其中P(xk|x1, x2,..xk-1) = frequence(x1, x2 ,, xk)/frequence(x1, x2..xk-1)

2-gram模型例子

把多个gram的模型进行线性整合

P(y|x1, x2, .. xn) = P(y)*P(x1, x2, ... xn|y) / P(x1, x2, ... xn)

y代表是否是垃圾邮件

x代表单词

广州市长寿路 -》 广州市长|寿路

广州市长寿路 -》 广州市|长寿路

匹配词袋:广州市,广州市长,长寿路

使用最大匹配发,第二个分词更优

通过统计P(A|B),得出各个option的概率,取最大的概率,则为最后的分词

word = [0, 0 , ... 1, ... 0]

word = [0, 1, 0, 1, 0, ...]

可以解决词相似性问题

计算附近词的频率

word = [0, 3, 0, 1, 0, ...]

w是附近词的one-hot encoding

score是词的one-hot encoding

最后一层通过softmax,取拟合文本

最终中间层则为词向量

输入为词one-hot encoding

输出为附近此的one-hot encoding

最后通过softmax预测附近词

最后中间层则为结果词向量

混合模型是一种统计模型,问题中包含若干个子问题,每个子问题是一个概率分布,那么总问题就是若干个子问题的组合,也就是若干个子分部的组合,这样就形成了混合模型。

有红黑两种硬币,把它们放在盒子里,从盒子里随机抽取一个硬币并投币,抽到红色的概率是p,红色硬币正面的概率是q,黑色硬币正面的概率是m,假设我们没办法看到抽取出的硬币的颜色,只能看到最终是正面或者反面的结果,例如HTTHTTTTHHH (H:正面 T: 反面)。需要估计p,q,m三个参数。

此时可以计算出

通过EM算法迭代如下:

随机p q m

迭代以下过程:

计算上面table

p = (aC(正)+cC(反))/total

q = aC(正)/(aC正+cC正)

m = bC(正)/(bC正 + dC正)

假设有上述数据,需要用混合模型来逼近,通过分析,红色和蓝色数据分别为高斯正态分布,N(u, v)

此时可以得到如下表

p = pN红x/(pN红x+(1-p)N蓝x)

u = pN红x/n

v = pN红(x-u)^2/n

词性转换概率

词性到单词的转换概率

通过EM递归算法,训练以上参数,得到隐马尔可夫模型

PLSA主题模型

只统计词的频率,不计算词的相对位置

计算文档和单词频率的矩阵

进行奇异矩阵分解

得到A矩阵的压缩U,U中的k则为k个主题

通过分析,LSA得到的主题是跟现实无法关联,它只是一个量,而没有明显的意义。

PLSA为了解决此问题,引入概率模型,先确定主题个数

然后通过构建Doc-topic的概率table,和topic-word的概率table。

然后通过EM模型,得到这两个table的所有概率值。

进而得到文档的主题表示

PLSA的缺陷是,对于预测未知的doc,无法计算此文档的相关概率。随着doc数量的增加,PLSA模型的参数会线性增加,从而会造成过拟合。

LDA通过引入先验概率来克服PLSA的问题。

类似于编译原理的上下文无法句法分析,一颗语法树

通过对CFG引入概率参数

有了概率,可以计算每颗语法树的极大似然概率,并取最大概率的树为最终输出

上一个状态中间层的输出作为下一隐层的输入

类似于HMM的2-gram模型。t状态受到t-1时刻输出的影响,受t-k的输出的k越大,影响越小

由于RNN几乎只受到上一时刻的影响,而忽略了久远信息的影响。从而造成了一定的局限性。

LSTM通过引入长短记忆方法,来维持长记忆的信息。

通过训练核内的sigmod函数,使得LSTM可以根据不同的句子,有条件的保留和过滤历史信息,从而达到长记忆的功能。

GRU是LSTM的简化版,它只需要处理两个sigmod函数的训练,而LSTM需要三个sigmod函数的训练,减少了训练的参数,加快了训练的速度,但也损失了一部分模型的复杂,在处理较复杂问题时,没有LSTM那么好。

auto-encoder-decoder的特点是输出的单元数是固定的。对于一般自然语言处理,例如机器翻译,输入的单元个数跟输出单元的个数并不是一一对应的,此时就需要动态的生成输出单元。Seq2Seq通过动态的输出结束符,代表是否输出完成,达到可以动态的根据输入输出不同的单元个数。

seq2seq的缺点是,所有的输入序列都转化为单一的单元c,导致很多信息都将消失,对于不同的输出yi,它可能依赖的输入xj有可能不一样,此时通过加入注意力模型,通过对xi进行softmax处理,并加入到y权重的训练中,可以让不同的y,有不同的x对它进行影响

softmax的输入为输入单元x,和上一个输出单元y,联合产生softmax的权重,进而对不同的序列,对于同一个x,会有不同的注意力到输出

q = Wq(x)

k = Wk(x)

v = Wv(x)

x为词向量

通过训练,得到权重w,从而学习到这一层的softmax注意力参数

R是前一次encoder的输出

通过增加w的数量,产生多个z,并进行堆叠,通过前馈网络,最后产生z

在使用self attention处理句子时,是没有考虑单词在句子中的位置信息的。为了让模型可以加入考虑单词的位置信息,加入了位置编码的向量

计算如下:

pos为单词在句子中的位置

i为词向量的位置

d为句子的长度

位置编码加上词向量形成tranformer的输入

加入了归一化和残差网络

最终通过softmax,输出每个单词的概率,并最终输出单词

自然语言处理基础知识

NLP 是什么?

NLP 是计算机科学领域与 人工智能 领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的学科。NLP 由两个主要的技术领域构成:自然语言理解和自然语言生成。

自然语言理解方向,主要目标是帮助机器更好理解人的语言,包括基础的词法、句法等语义理解,以及需求、篇章、情感层面的高层理解。

自然语言生成方向,主要目标是帮助机器生成人能够理解的语言,比如文本生成、自动文摘等。

NLP 技术基于大数据、知识图谱、 机器学习 、语言学等技术和资源,并可以形成机器翻译、深度问答、对话系统的具体应用系统,进而服务于各类实际业务和产品。

NLP在金融方面

金融行业因其与数据的高度相关性,成为人工智能最先应用的行业之一,而NLP与知识图谱作为人工智能技术的重要研究方向与组成部分,正在快速进入金融领域,并日益成为智能金融的基石。舆情分析舆情主要指民众对社会各种具体事物的情绪、意见、价值判断和愿望等。

事件(Event ):在特定时间、特定地点发生的事情。主题(Topic):也称为话题,指一个种子事件或活动以及与它直接相关的事件和活动。专题(Subject):涵盖多个类似的具体事件或根本不涉及任何具体事件。需要说明的是,国内新闻网站新浪、搜狐等所定义的“专题”概念大多数等同于我们的“主题”概念。热点:也可称为热点主题。热点和主题的概念比较接近,但有所区别。

1. 词干提取

什么是词干提取?词干提取是将词语去除变化或衍生形式,转换为词干或原型形式的过程。词干提取的目标是将相关词语还原为同样的词干,哪怕词干并非词典的词目。

2. 词形还原

什么是词形还原? 词形还原是将一组词语还原为词源或词典的词目形式的过程。还原过程考虑到了POS问题,即词语在句中的语义,词语对相邻语句的语义等。

3. 词向量化什么是词向量化?词向量化是用一组实数构成的向量代表自然语言的叫法。这种技术非常实用,因为电脑无法处理自然语言。词向量化可以捕捉到自然语言和实数间的本质关系。通过词向量化,一个词语或者一段短语可以用一个定维的向量表示,例如向量的长度可以为100。

4. 词性标注

什么是词性标注?简单来说,词性标注是对句子中的词语标注为名字、动词、形容词、副词等的过程。

5. 命名实体消歧

什么是命名实体消岐?命名实体消岐是对句子中的提到的实体识别的过程。例如,对句子“Apple earned a revenue of 200 Billion USD in 2016”,命名实体消岐会推断出句子中的Apple是苹果公司而不是指一种水果。一般来说,命名实体要求有一个实体知识库,能够将句子中提到的实体和知识库联系起来。

6. 命名实体识别

体识别是识别一个句子中有特定意义的实体并将其区分为人名,机构名,日期,地名,时间等类别的任务。   

7. 情感分析

什么是情感分析?情感分析是一种广泛的主观分析,它使用自然语言处理技术来识别客户评论的语义情感,语句表达的情绪正负面以及通过语音分析或书面文字判断其表达的情感等等。

8. 语义文本相似度

什么是语义文本相似度分析?语义文本相似度分析是对两段文本的意义和本质之间的相似度进行分析的过程。注意,相似性与相关性是不同的。

9.语言识别

什么是语言识别?语言识别指的是将不同语言的文本区分出来。其利用语言的统计和语法属性来执行此任务。语言识别也可以被认为是文本分类的特殊情况。

10. 文本摘要

什么是文本摘要?文本摘要是通过识别文本的重点并使用这些要点创建摘要来缩短文本的过程。文本摘要的目的是在不改变文本含义的前提下最大限度地缩短文本。

11.评论观点抽取

自动分析评论关注点和评论观点,并输出评论观点标签及评论观点极性。目前支持 13 类产品用户评论的观点抽取,包括美食、酒店、汽车、景点等,可帮助商家进行产品分析,辅助用户进行消费决策。

11.DNN 语言模型

语言模型是通过计算给定词组成的句子的概率,从而判断所组成的句子是否符合客观语言表达习惯。在机器翻译、拼写纠错、语音识别、问答系统、词性标注、句法分析和信息检索等系统中都有广泛应用。

12.依存句法分析

利用句子中词与词之间的依存关系来表示词语的句法结构信息 (如主谓、动宾、定中等结构关系),并用树状结构来表示整句的的结构 (如主谓宾、定状补等)。

1、NLTK

一种流行的自然语言处理库、自带语料库、具有分类,分词等很多功能,国外使用者居多,类似中文的 jieba 处理库

2、文本处理流程

大致将文本处理流程分为以下几个步骤:

Normalization

Tokenization

Stop words

Part-of-speech Tagging

Named Entity Recognition

Stemming and Lemmatization

下面是各个流程的具体介绍

Normalization

第一步通常要做就是Normalization。在英文中,所有句子第一个单词的首字母一般是大写,有的单词也会全部字母都大写用于表示强调和区分风格,这样更易于人类理解表达的意思。

Tokenization

Token是"符号"的高级表达, 一般值具有某种意义,无法再拆分的符号。在英文自然语言处理中,Tokens通常是单独的词,因此Tokenization就是将每个句子拆分为一系列的词。

Stop Word

Stop Word 是无含义的词,例如’is’/‘our’/‘the’/‘in’/'at’等。它们不会给句子增加太多含义,单停止词是频率非常多的词。 为了减少我们要处理的词汇量,从而降低后续程序的复杂度,需要清除停止词。

Named Entity

Named Entity 一般是名词短语,又来指代某些特定对象、人、或地点 可以使用 ne_chunk()方法标注文本中的命名实体。在进行这一步前,必须先进行 Tokenization 并进行 PoS Tagging。

Stemming and Lemmatization

为了进一步简化文本数据,我们可以将词的不同变化和变形标准化。Stemming 提取是将词还原成词干或词根的过程。

3、Word2vec

Word2vec是一种有效创建词嵌入的方法,它自2013年以来就一直存在。但除了作为词嵌入的方法之外,它的一些概念已经被证明可以有效地创建推荐引擎和理解时序数据。在商业的、非语言的任务中。

### 四、NLP前沿研究方向与算法

1、MultiBERT

2、XLNet

3、bert 模型

BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

BERT提出之后,作为一个Word2Vec的替代者,其在NLP领域的11个方向大幅刷新了精度,可以说是近年来自残差网络最优突破性的一项技术了。BERT的主要特点以下几点:

使用了Transformer作为算法的主要框架,Trabsformer能更彻底的捕捉语句中的双向关系;

使用了Mask Language Model(MLM)和 Next Sentence Prediction(NSP) 的多任务训练目标;

使用更强大的机器训练更大规模的数据,使BERT的结果达到了全新的高度,并且Google开源了BERT模型,用户可以直接使用BERT作为Word2Vec的转换矩阵并高效的将其应用到自己的任务中。

BERT的本质上是通过在海量的语料的基础上运行自监督学习方法为单词学习一个好的特征表示,所谓自监督学习是指在没有人工标注的数据上运行的监督学习。在以后特定的NLP任务中,我们可以直接使用BERT的特征表示作为该任务的词嵌入特征。所以BERT提供的是一个供其它任务迁移学习的模型,该模型可以根据任务微调或者固定之后作为特征提取器。

模型结构: 由于模型的构成元素Transformer已经解析过,就不多说了,BERT模型的结构如下图最左:

对比OpenAI GPT(Generative pre-trained transformer),BERT是双向的Transformer block连接;就像单向rnn和双向rnn的区别,直觉上来讲效果会好一些。

优点: BERT是截至2018年10月的最新state of the art模型,通过预训练和精调横扫了11项NLP任务,这首先就是最大的优点了。而且它还用的是Transformer,也就是相对rnn更加高效、能捕捉更长距离的依赖。对比起之前的预训练模型,它捕捉到的是真正意义上的bidirectional context信息。

缺点: MLM预训练时的mask问题

[MASK]标记在实际预测中不会出现,训练时用过多[MASK]影响模型表现

每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)

BERT火得一塌糊涂不是没有原因的:

使用Transformer的结构将已经走向瓶颈期的Word2Vec带向了一个新的方向,并再一次炒火了《Attention is All you Need》这篇论文;

11个NLP任务的精度大幅提升足以震惊整个深度学习领域;

无私的开源了多种语言的源码和模型,具有非常高的商业价值。

迁移学习又一次胜利,而且这次是在NLP领域的大胜,狂胜。

BERT算法还有很大的优化空间,例如我们在Transformer中讲的如何让模型有捕捉Token序列关系的能力,而不是简单依靠位置嵌入。BERT的训练在目前的计算资源下很难完成,论文中说的训练需要在64块TPU芯片上训练4天完成,而一块TPU的速度约是目前主流GPU的7-8倍。

自然语言处理基础 - NLP

什么是自然语言处理

自然语言处理 (英语:natural language processing,缩写作 NLP) 是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

自然语言处理有四大类常见的任务

什么是命名实体识别

命名实体识别(NER)是信息提取(Information Extraction)的一个子任务,主要涉及如何从文本中提取命名实体并将其分类至事先划定好的类别,如在招聘信息中提取具体招聘公司、岗位和工作地点的信息,并将其分别归纳至公司、岗位和地点的类别下。命名实体识别往往先将整句拆解为词语并对每个词语进行此行标注,根据习得的规则对词语进行判别。这项任务的关键在于对未知实体的识别。基于此,命名实体识别的主要思想在于根据现有实例的特征总结识别和分类规则。这些方法可以被分为有监督(supervised)、半监督(semi-supervised)和无监督(unsupervised)三类。有监督学习包括隐形马科夫模型(HMM)、决策树、最大熵模型(ME)、支持向量机(SVM)和条件随机场(CRF)。这些方法主要是读取注释语料库,记忆实例并进行学习,根据这些例子的特征生成针对某一种实例的识别规则。

什么是词性标注

词性标注 (pos tagging) 是指为分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或其他词性的过程。

什么是文本分类

该技术可被用于理解、组织和分类结构化或非结构化文本文档。文本挖掘所使用的模型有词袋(BOW)模型、语言模型(ngram)和主题模型。隐马尔可夫模型通常用于词性标注(POS)。其涵盖的主要任务有句法分析、情绪分析和垃圾信息检测。

GLUE benchmark

General Language Understanding Evaluation benchmark,通用语言理解评估基准,用于测试模型在广泛自然语言理解任务中的鲁棒性。

LM:Language Model

语言模型,一串词序列的概率分布,通过概率模型来表示文本语义。

语言模型有什么作用?通过语言模型,可以量化地衡量一段文本存在的可能性。对于一段长度为n的文本,文本里每个单词都有上文预测该单词的过程,所有单词的概率乘积便可以用来评估文本。在实践中,如果文本很长,P(wi|context(wi))的估算会很困难,因此有了简化版:N元模型。在N元模型中,通过对当前词的前N个词进行计算来估算该词的条件概率。

重要文献与资料

我们介绍词的向量表征,也称为 word embedding 。词向量是自然语言处理中常见的一个操作,是搜索引擎、广告系统、推荐系统等互联网服务背后常见的基础技术。

在这些互联网服务里,我们经常要比较两个词或者两段文本之间的相关性。为了做这样的比较,我们往往先要把词表示成计算机适合处理的方式。最自然的方式恐怕莫过于向量空间模型(vector space model)。 在这种方式里,每个词被表示成一个实数向量(one-hot vector),其长度为字典大小,每个维度对应一个字典里的每个词,除了这个词对应维度上的值是1,其他元素都是0。

One-hot vector虽然自然,但是用处有限。比如,在互联网广告系统里,如果用户输入的query是“母亲节”,而有一个广告的关键词是“康乃馨”。虽然按照常理,我们知道这两个词之间是有联系的——母亲节通常应该送给母亲一束康乃馨;但是这两个词对应的one-hot vectors之间的距离度量,无论是欧氏距离还是余弦相似度(cosine similarity),由于其向量正交,都认为这两个词毫无相关性。 得出这种与我们相悖的结论的根本原因是:每个词本身的信息量都太小。所以,仅仅给定两个词,不足以让我们准确判别它们是否相关。要想精确计算相关性,我们还需要更多的信息——从大量数据里通过机器学习方法归纳出来的知识。

在机器学习领域里,各种“知识”被各种模型表示,词向量模型(word embedding model)就是其中的一类。通过词向量模型可将一个 one-hot vector映射到一个维度更低的实数向量(embedding vector),如embedding(母亲节)=[0.3,4.2,−1.5,...],embedding(康乃馨)=[0.2,5.6,−2.3,...]。在这个映射到的实数向量表示中,希望两个语义(或用法)上相似的词对应的词向量“更像”,这样如“母亲节”和“康乃馨”的对应词向量的余弦相似度就不再为零了。

词向量模型可以是概率模型、共生矩阵(co-occurrence matrix)模型或神经元网络模型。在用神经网络求词向量之前,传统做法是统计一个词语的共生矩阵X。

X是一个|V|×|V| 大小的矩阵,Xij表示在所有语料中,词汇表V(vocabulary)中第i个词和第j个词同时出现的词数,|V|为词汇表的大小。对X做矩阵分解(如奇异值分解),得到的U即视为所有词的词向量:

但这样的传统做法有很多问题:

基于神经网络的模型不需要计算和存储一个在全语料上统计产生的大表,而是通过学习语义信息得到词向量,因此能很好地解决以上问题。

神经网络

当词向量训练好后,我们可以用数据可视化算法t-SNE[ 4 ]画出词语特征在二维上的投影(如下图所示)。从图中可以看出,语义相关的词语(如a, the, these; big, huge)在投影上距离很近,语意无关的词(如say, business; decision, japan)在投影上的距离很远。

另一方面,我们知道两个向量的余弦值在[−1,1]的区间内:两个完全相同的向量余弦值为1, 两个相互垂直的向量之间余弦值为0,两个方向完全相反的向量余弦值为-1,即相关性和余弦值大小成正比。因此我们还可以计算两个词向量的余弦相似度。

模型概览

语言模型

在介绍词向量模型之前,我们先来引入一个概念:语言模型。 语言模型旨在为语句的联合概率函数P(w1,...,wT)建模, 其中wi表示句子中的第i个词。语言模型的目标是,希望模型对有意义的句子赋予大概率,对没意义的句子赋予小概率。 这样的模型可以应用于很多领域,如机器翻译、语音识别、信息检索、词性标注、手写识别等,它们都希望能得到一个连续序列的概率。 以信息检索为例,当你在搜索“how long is a football bame”时(bame是一个医学名词),搜索引擎会提示你是否希望搜索"how long is a football game", 这是因为根据语言模型计算出“how long is a football bame”的概率很低,而与bame近似的,可能引起错误的词中,game会使该句生成的概率最大。

对语言模型的目标概率P(w1,...,wT),如果假设文本中每个词都是相互独立的,则整句话的联合概率可以表示为其中所有词语条件概率的乘积,即:

然而我们知道语句中的每个词出现的概率都与其前面的词紧密相关, 所以实际上通常用条件概率表示语言模型:

N-gram neural model

在计算语言学中,n-gram是一种重要的文本表示方法,表示一个文本中连续的n个项。基于具体的应用场景,每一项可以是一个字母、单词或者音节。 n-gram模型也是统计语言模型中的一种重要方法,用n-gram训练语言模型时,一般用每个n-gram的历史n-1个词语组成的内容来预测第n个词。

Yoshua Bengio等科学家就于2003年在著名论文 Neural Probabilistic Language Models [ 1 ] 中介绍如何学习一个神经元网络表示的词向量模型。文中的神经概率语言模型(Neural Network Language Model,NNLM)通过一个线性映射和一个非线性隐层连接,同时学习了语言模型和词向量,即通过学习大量语料得到词语的向量表达,通过这些向量得到整个句子的概率。因所有的词语都用一个低维向量来表示,用这种方法学习语言模型可以克服维度灾难(curse of dimensionality)。注意:由于“神经概率语言模型”说法较为泛泛,我们在这里不用其NNLM的本名,考虑到其具体做法,本文中称该模型为N-gram neural model。

在上文中已经讲到用条件概率建模语言模型,即一句话中第t个词的概率和该句话的前t−1个词相关。可实际上越远的词语其实对该词的影响越小,那么如果考虑一个n-gram, 每个词都只受其前面n-1个词的影响,则有:

给定一些真实语料,这些语料中都是有意义的句子,N-gram模型的优化目标则是最大化目标函数:

其中f(wt,wt−1,...,wt−n+1)表示根据历史n-1个词得到当前词wt的条件概率,R(θ)表示参数正则项。

Continuous Bag-of-Words model(CBOW)

CBOW模型通过一个词的上下文(各N个词)预测当前词。当N=2时,模型如下图所示:

具体来说,不考虑上下文的词语输入顺序,CBOW是用上下文词语的词向量的均值来预测当前词。

其中xt为第t个词的词向量,分类分数(score)向量 z=U∗context,最终的分类y采用softmax,损失函数采用多类分类交叉熵。

Skip-gram model

CBOW的好处是对上下文词语的分布在词向量上进行了平滑,去掉了噪声,因此在小数据集上很有效。而Skip-gram的方法中,用一个词预测其上下文,得到了当前词上下文的很多样本,因此可用于更大的数据集。

如上图所示,Skip-gram模型的具体做法是,将一个词的词向量映射到2n个词的词向量(2n表示当前输入词的前后各n个词),然后分别通过softmax得到这2n个词的分类损失值之和。

我们介绍了词向量、语言模型和词向量的关系、以及如何通过训练神经网络模型获得词向量。在信息检索中,我们可以根据向量间的余弦夹角,来判断query和文档关键词这二者间的相关性。在句法分析和语义分析中,训练好的词向量可以用来初始化模型,以得到更好的效果。在文档分类中,有了词向量之后,可以用聚类的方法将文档中同义词进行分组,也可以用 N-gram 来预测下一个词。希望大家在本章后能够自行运用词向量进行相关领域的研究。

参考:

关于自然语言处理pos和自然语言处理好就业吗的介绍本篇到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签: 模型

抱歉,评论功能暂时关闭!