自然语言处理发展历程

自然语言处理发展历程(算法进阶+历史重要阶段)

作者:张qianer~

本文适合有一定NLP基础,想对NLP的知识有系统梳理的小伙伴~

什么是自然语言处理?

目前在深度学习有两大热门问题分支,一个是图像识别,另一个就是自然语言处理

自然语言处理(Natural Language Processing , NLP)是一门通过建立形式化的计算模型来分析、理解和处理自然语言的学科,也是一门横跨语言学、计算 机科学、数学等领域的交叉学科。具体表现形式包括机器 翻译、文本摘要、文本分类、文本校对、信息抽取、语音合成、语音识别等。 实现人机间的信息交流,是人工智能界、计算机科学和语言学界所共同关注的重要问题。

One-Hot

自然语言处理最主要的就是把计算机不能识别的东西(文字,英文,等)转换成计算机能够识别的二进制文件(0,1),自然语言处理的那些算法啊,步骤,也就是为了达到这样的目的。只是当中有一些语义理解的问题。

所以第一代NLP技术就是One-Hot,独热编码,独热编码是最开始的词向量技术,一般只有一位有效,其他的都是一大堆00000,所以一般用途就是用在较少的类别型数据)过于稀疏!因此就到了第二代 ——词袋模型

scikit-learn中的OneHotEncoder()函数实现了One-Hot模型

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown='ignore')
X = [['Male', 1], ['Female', 3], ['Female', 2]]
enc.fit(X)

词袋模型

词袋模型 (Bag Of Words,BOW),一段文本(比如一个句子或是一个文档)可以用一个装着这些词的袋子来表示,这种表示方式不考虑文法以及词的顺序 ,只考虑词表(vocabulary)中单词在这个句子中的出现次数**(词频) **

。主要用途:垃圾邮件过滤

scikit-learn中的CountVectorizer()函数实现了BOW模型

from sklearn.feature_extraction.text import CountVectorizer
corpus = [
    "John likes to watch movies, Mary likes movies too",
    "John also likes to watch football games",
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
print(X.toarray())

输出结果:
['also', 'football', 'games', 'john', 'likes', 'mary', 'movies', 'to', 'too', 'watch']
[[0 0 0 1 2 1 2 1 1 1]
[1 1 1 1 1 0 0 1 0 1]]

词袋模型的缺点:

​ 将两篇文本通过词袋模型变为向量模型,通过计算向量的余弦距离来计算两个文本间的相似度 。

  1. 词袋模型最重要的是构造词表,然后通过文本为词表中的词赋值,但词袋模型严重缺乏相似词之间的表达
  2. 只有字词一摸一样的时候才会有一样的词向量
  3. 所以之后就有了第三代,Word2vec词嵌入

Word2vec

Word2vec词嵌入模型。它同样需要完成词的向量化,基本能够解决相似文本之间的问题,同时它了很多, Word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络的隐藏层。Word2vec词的特征表达有了聚类性质和线性性质,会让我们的维度降低。

主要有两种方式:

CBOW:用周围的词预测当前的词

Skip-gram:用当前的词预测周围的词

从Word2vec开始,NLP就彻底跟深度学习分不开了~

gensim.models下面的Word2vec示例:

from gensim.models import word2vec
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
raw_sentences = ["the quick brown fox jumps over the lazy dogs","yoyoyo you go home now to sleep"]

sentences= [s.encode('utf-8').split() for s in sentences]
model = word2vec.Word2Vec(sentences, min_count=1)
model.similarity('dogs','you')

model = gensim.models.Word2Vec(iter=1)  
model.build_vocab(some_sentences) 
model.train(other_sentences) 

Word2vec 参数

  • min_count
model = Word2Vec(sentences, min_count=10) # default value is 5

在不同大小的语料集中,我们对于基准词频的需求也是不一样的。譬如在较大的语料集中,我们希望忽略那些只出现过一两次的单词,这里我们就可以通过设置min_count参数进行控制。一般而言,合理的参数值会设置在0~100之间。

  • size

size参数主要是用来设置神经网络的层数,Word2vec 中的默认值是设置为100层。更大的层次设置意味着更多的输入数据,不过也能提升整体的准确度,合理的设置范围为 10~数百。

model = Word2Vec(sentences, size=200) # default value is 100
  • workers

workers参数用于设置并发训练时候的线程数,不过仅当Python安装的情况下才会起作用:

model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelizat

缺点:

  1. 对于一词多义的现象很难识别

  2. 之后为了解决这种一次多意的现象,就有了预训练模型Bert

Bert

有了词的语义表示,我们就可以进而生成句子的语义表示

句子的语义表示

RNN:RNN从左到右对句子进行建模,每个词对应一个隐状态,该引状态代表了从句首到当前词的语义信息,句尾的状态就代表了全句的信息

CNN:CNN从理论上分别进行词嵌入+位置嵌入+卷积,加上一个向量表示,对应句子的语义

Attention注意力机制

随后又引入了注意力机制,综合的考量了在当前状态下对应的编码的每一个隐状态,加权平均,来体现当前的动态输入。这类技术引入之后,神经网络机器翻译就得到了飞速的发展

Transformer

Transformer引入了自编码(自编码器(Auto encoder,AE),是一种利用反向传播算法使得输出值等于输入值的神经网络,它先将输入压缩成潜在空间表征,然后通过这种表征来重构输出),一个词跟周围的词建立相似,引入多头,可以引入多种特征表达,所以编码效果或者编码的信息更加丰富

预训练模型

ELMo:从左到右对句子编码,也可以从右到左对句子编码,每一层对应的节点并起来,就形成了当前这个词在上下文的语义表示。用的时候就用这个语义加上词本身的词嵌入,来做后续的任务,性能便得到相应的提高。

BERT:它用左边、右边的信息来预测最外部的词的信息,同时它也可以判断下一句是真的下一句还是伪造的下一句,用两种方式对句子每一个词进行编码,得到的训练结果就表征了这个词在上下文中的语义表示。基于这样的语义表示,就可以判断两个句子的关系,比如说是不是附属关系,判断一个句子的分类(例如Q&A中,判断回答对应的边界是不是对应提问),以及对输入的每一个词做一个标注,结果就得到一个词性标注。

最早是一个静态的词的表征,所谓静态词的表征,就是不管上下文,表征是一样的,比如“bank”这个词有多个意思,它的表征也是一样的。但是ELMo就要根据上下文体现它唯一的表征。

​ 基于以上的方法,人们又开发了一系列的新的方法,比如说GPT-2,以及最近的XLNET,以及UNILM、MASS、MT-DNN、XLM,都是基于这种思路的扩充,解决相应的任务各有所长。其中微软研究院的UNILM可同时训练得到类似BERT和GPT的模型,而微软MASS采用encoder-decoder训练在机器翻译上效果比较好。还有MT-DNN强调用多任务学习预训练模型,而XLM学习多语言BERT模型,在跨语言迁移学习方面应用效果显著,我们可以针对大规模的语料,提前训练好一个模型,这个模型既代表了语言的结构信息,也有可能代表了所在领域甚至常识的信息,只不过我们看不懂。加上我们未来的预定的任务,这个任务只有很小的训练样本,把通过大训练样本得到的预训练模型,做到小训练样本上,效果就得到了非常好的提升。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值