赞
踩
作者:张qianer~
本文适合有一定NLP基础,想对NLP的知识有系统梳理的小伙伴~
目前在深度学习有两大热门问题分支,一个是图像识别,另一个就是自然语言处理
自然语言处理(Natural Language Processing , NLP)是一门通过建立形式化的计算模型来分析、理解和处理自然语言的学科,也是一门横跨语言学、计算 机科学、数学等领域的交叉学科。具体表现形式包括机器 翻译、文本摘要、文本分类、文本校对、信息抽取、语音合成、语音识别等。 实现人机间的信息交流,是人工智能界、计算机科学和语言学界所共同关注的重要问题。
自然语言处理最主要的就是把计算机不能识别的东西(文字,英文,等)转换成计算机能够识别的二进制文件(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]]
词袋模型的缺点:
将两篇文本通过词袋模型变为向量模型,通过计算向量的余弦距离来计算两个文本间的相似度 。
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 参数
model = Word2Vec(sentences, min_count=10) # default value is 5
在不同大小的语料集中,我们对于基准词频的需求也是不一样的。譬如在较大的语料集中,我们希望忽略那些只出现过一两次的单词,这里我们就可以通过设置min_count参数进行控制。一般而言,合理的参数值会设置在0~100之间。
size参数主要是用来设置神经网络的层数,Word2vec 中的默认值是设置为100层。更大的层次设置意味着更多的输入数据,不过也能提升整体的准确度,合理的设置范围为 10~数百。
model = Word2Vec(sentences, size=200) # default value is 100
workers参数用于设置并发训练时候的线程数,不过仅当Python安装的情况下才会起作用:
model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelizat
缺点:
对于一词多义的现象很难识别
之后为了解决这种一次多意的现象,就有了预训练模型Bert
有了词的语义表示,我们就可以进而生成句子的语义表示
RNN:RNN从左到右对句子进行建模,每个词对应一个隐状态,该引状态代表了从句首到当前词的语义信息,句尾的状态就代表了全句的信息
CNN:CNN从理论上分别进行词嵌入+位置嵌入+卷积,加上一个向量表示,对应句子的语义
随后又引入了注意力机制,综合的考量了在当前状态下对应的编码的每一个隐状态,加权平均,来体现当前的动态输入。这类技术引入之后,神经网络机器翻译就得到了飞速的发展
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模型,在跨语言迁移学习方面应用效果显著,我们可以针对大规模的语料,提前训练好一个模型,这个模型既代表了语言的结构信息,也有可能代表了所在领域甚至常识的信息,只不过我们看不懂。加上我们未来的预定的任务,这个任务只有很小的训练样本,把通过大训练样本得到的预训练模型,做到小训练样本上,效果就得到了非常好的提升。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。