[深度学习] 自然语言处理
NLP的全称是NatuarlLanguageProcessing,中文意思是自然语言处理,是人工智能领域的一个重要方向
自然语言处理(NLP)的一个最伟大的方面是跨越多个领域的计算研究,从人工智能到计算语言学的多个计算研究领域都在研究计算机与人类语言之间的相互作用。它主要关注计算机如何准确并快速地处理大量的自然语言语料库。什么是自然语言语料库?它是用现实世界语言表达的语言学习,是从文本和语言与另一种语言的关系中理解一组抽象规则的综合方法。
人类语言是抽象的信息符号,其中蕴含着丰富的语义信息,人类可以很轻松地理解其中的含义。而计算机只能处理数值化的信息,无法直接理解人类语言,所以需要将人类语言进行数值化转换。不仅如此,人类间的沟通交流是有上下文信息的,这对于计算机也是巨大的挑战。
我们首先来看看NLP的任务类型,如下图所示:
主要划分为了四大类:
类别到序列序列到类别同步的序列到序列异步的序列到序列其中“类别”可以理解为是标签或者分类,而“序列”可以理解为是一段文本或者一个数组。简单概况NLP的任务就是从一种数据类型转换成另一种数据类型的过程,这与绝大多数的机器学习模型相同或者类似,所以掌握了NLP的技术栈就等于掌握了机器学习的技术栈。
传统方式和深度学习方式NLP对比
NLP的预处理
为了能够完成上述的NLP任务,我们需要一些预处理,是NLP任务的基本流程。预处理包括:收集语料库、文本清洗、分词、去掉停用词(可选)、标准化和特征提取等。
图中红色的部分就是NLP任务的预处理流程,有别于其它机器学习任务的流程
英文NLP语料预处理的6个步骤
分词–Tokenization词干提取–Stemming词形还原–Lemmatization词性标注–PartsofSpeech命名实体识别–NER分块–Chunking
中文NLP语料预处理的4个步骤
中文分词–ChineseWordSegmentation词性标注–PartsofSpeech命名实体识别–NER去除停用词第1步:收集您的数据---语料库
对于NLP任务来说,没有大量高质量的语料,就是巧妇难为无米之炊,是无法工作的。
而获取语料的途径有很多种,最常见的方式就是直接下载开源的语料库,如:维基百科的语料库。
但这样开源的语料库一般都无法满足业务的个性化需要,所以就需要自己动手开发爬虫去抓取特定的内容,这也是一种获取语料库的途径。当然,每家互联网公司根据自身的业务,也都会有大量的语料数据,如:用户评论、电子书、商品描述等等,都是很好的语料库。
示例数据源每个机器学习问题都从数据开始,例如电子邮件,帖子或推文列表。常见的文字信息来源包括:
产品评论(在亚马逊,Yelp和各种应用商店)用户生成的内容(推文,Facebook帖子,StackOverflow问题)故障排除(客户请求,支持服务单,聊天记录)现在,数据对于互联网公司来说就是石油,其中蕴含着巨大的商业价值。所以,小伙伴们在日常工作中一定要养成收集数据的习惯,遇到好的语料库一定要记得备份(当然是在合理合法的条件下),它将会对你解决问题提供巨大的帮助。
第2步:清理数据---文本清洗我们遵循的首要规则是:“您的模型将永远与您的数据一样好。”
数据科学家的关键技能之一是了解下一步是应该对模型还是数据进行处理。一个好的经验法则是首先查看数据然后进行清理。一个干净的数据集将允许模型学习有意义的功能,而不是过度匹配无关的噪音。
我们通过不同的途径获取到了想要的语料库之后,接下来就需要对其进行清洗。因为很多的语料数据是无法直接使用的,其中包含了大量的无用符号、特殊的文本结构。
数据类型分为:
结构化数据:关系型数据、json等半结构化数据:XML、HTML等非结构化数据:Word、PDF、文本、日志等需要将原始的语料数据转化成易于处理的格式,一般在处理HTML、XML时,会使用Python的lxml库,功能非常丰富且易于使用。对一些日志或者纯文本的数据,我们可以使用正则表达式进行处理。
正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。Python的示例代码如下:
importre#定义中文字符的正则表达式re_han_default=re.compile("([u4E00-u9FD5]+)",re.U)sentence="我/爱/自/然/语/言/处/理"#根据正则表达式进行切分blocks=re_han_default.split(sentence)forblkinblocks:#校验单个字符是否符合正则表达式ifblkandre_han_default.match(blk):print(blk)输出:
我爱自然语言处理除了上述的内容之外,我们还需要注意中文的编码问题,在windows平台下中文的默认编码是GBK(gb2312),而在linux平台下中文的默认编码是UTF-8。在执行NLP任务之前,我们需要统一不同来源语料的编码,避免各种莫名其妙的问题。
如果大家事前无法判断语料的编码,那么我推荐大家可以使用Python的chardet库来检测编码,简单易用。既支持命令行:chardetectsomefile,也支持代码开发。
以下是用于清理数据的清单:
删除所有不相关的字符,例如任何非字母数字字符令牌化通过将其分割成单个的单词文本删除不相关的单词,例如“@”twitter提及或网址将所有字符转换为小写,以便将诸如“hello”,“Hello”和“HELLO”之类的单词视为相同考虑将拼写错误或交替拼写的单词组合成单个表示(例如“cool”/“kewl”/“cooool”)考虑词开还原(将诸如“am”,“are”和“is”之类的词语简化为诸如“be”之类的常见形式)按照这些步骤并检查其他错误后,我们可以开始使用干净的标记数据来训练模型!
第3步:分词中英文分词的3个典型区别区别1:分词方式不同,中文更难
英文有天然的空格作为分隔符,但是中文没有。所以如何切分是一个难点,再加上中文里一词多意的情况非常多,导致很容易出现歧义。下文中难点部分会详细说明。
区别2:英文单词有多种形态
英文单词存在丰富的变形变换。为了应对这些复杂的变换,英文NLP相比中文存在一些独特的处理步骤,我们称为词形还原(Lemmatization)和词干提取(Stemming)。中文则不需要
词性还原:does,done,doing,did需要通过词性还原恢复成do。
词干提取:cities,children,teeth这些词,需要转换为city,child,tooth”这些基本形态
区别3:中文分词需要考虑粒度问题
例如「中国科学技术大学」就有很多种分法:
中国科学技术大学中国科学技术大学中国科学技术大学粒度越大,表达的意思就越准确,但是也会导致召回比较少。所以中文需要不同的场景和要求选择不同的粒度。这个在英文中是没有的。
中文分词是一个比较大的课题,相关的知识点和技术栈非常丰富,可以说搞懂了中文分词就等于搞懂了大半个NLP。
中文分词的3大难点难点1:没有统一的标准
目前中文分词没有统一的标准,也没有公认的规范。不同的公司和组织各有各的方法和规则。
难点2:歧义词如何切分
例如「兵乓球拍卖完了」就有2种分词方式表达了2种不同的含义:
乒乓球拍卖完了乒乓球拍卖完了难点3:新词的识别
信息爆炸的时代,三天两头就会冒出来一堆新词,如何快速的识别出这些新词是一大难点。比如当年「蓝瘦香菇」大火,就需要快速识别。
中文分词经历了20多年的发展,克服了重重困难,取得了巨大的进步,大体可以划分成两个阶段,如下图所示:
词典匹配与规则
优点:速度快、成本低
缺点:适应性不强,不同领域效果差异大
基本思想是基于词典匹配,将待分词的中文文本根据一定规则切分和调整,然后跟词典中的词语进行匹配,匹配成功则按照词典的词分词,匹配失败通过调整或者重新选择,如此反复循环即可。代表方法有基于正向最大匹配和基于逆向最大匹配及双向匹配法。
基于统计与机器学习
优点:适应性较强
缺点:成本较高,速度较慢
这类目前常用的是算法是HMM、CRF等算法,比如stanford、Hanlp分词工具是基于CRF算法。以CRF为例,基本思路是对汉字进行标注训练,不仅考虑了词语出现的频率,还考虑上下文,具备较好的学习能力,因此其对歧义词和未登录词的识别都具有良好的效果。
常见的分词器都是使用机器学习算法和词典相结合,一方面能够提高分词准确率,另一方面能够改善领域适应性。
目前,主流的中文分词技术采用的都是基于词典最大概率路径+未登录词识别(HMM)的方案,其中典型的代表就是jieba分词,一个热门的多语言中文分词包。
中文分词工具下面排名根据GitHub上的star数排名:
HanlpStanford分词ansj分词器哈工大LTPKCWS分词器jiebaIK清华大学THULACICTCLAS英文分词工具KerasSpacyGensimNLTK第4步:标准化
标准化是为了给后续的处理提供一些必要的基础数据,包括:去掉停用词、词汇表、训练数据等等。
当我们完成了分词之后,可以去掉停用词,如:“其中”、“况且”、“什么”等等,但这一步不是必须的,要根据实际业务进行选择,像关键词挖掘就需要去掉停用词,而像训练词向量就不需要。
词汇表是为语料库建立一个所有不重复词的列表,每个词对应一个索引值,并索引值不可以改变。词汇表的最大作用就是可以将词转化成一个向量,即One-Hot编码。
假设我们有这样一个词汇表:
我爱自然语言处理那么,我们就可以得到如下的One-Hot编码:
我:[1,0,0,0,0]爱:[0,1,0,0,0]自然:[0,0,1,0,0]语言:[0,0,0,1,0]处理:[0,0,0,0,1]这样我们就可以简单的将词转化成了计算机可以直接处理的数值化数据了。虽然One-Hot编码可以较好的完成部分NLP任务,但它的问题还是不少的。
当词汇表的维度特别大的时候,就会导致经过One-Hot编码后的词向量非常稀疏,同时One-Hot编码也缺少词的语义信息。由于这些问题,才有了后面大名鼎鼎的Word2vec,以及Word2vec的升级版BERT。
除了词汇表之外,我们在训练模型时,还需要提供训练数据。模型的学习可以大体分为两类:
监督学习,在已知答案的标注数据集上,模型给出的预测结果尽可能接近真实答案,适合预测任务非监督学习,学习没有标注的数据,是要揭示关于数据隐藏结构的一些规律,适合描述任务根据不同的学习任务,我们需要提供不同的标准化数据。一般情况下,标注数据的获取成本非常昂贵,非监督学习虽然不需要花费这样的成本,但在实际问题的解决上,主流的方式还选择监督学习,因为效果更好。
带标注的训练数据大概如下所示(情感分析的训练数据):
距离川沙公路较近公交指示蔡陆线麻烦建议路线房间较为简单__label__1商务大床房房间很大床有2M宽整体感觉经济实惠不错!__label__1半夜没暖气住!__label__0其中每一行就是一条训练样本,__label__0和__label__1是分类信息,其余的部分就是分词后的文本数据。
第5步:特征提取为了能够更好的训练模型,我们需要将文本的原始特征转化成具体特征,转化的方式主要有两种:统计和Embedding。
原始特征:需要人类或者机器进行转化,如:文本、图像。
具体特征:已经被人类进行整理和分析,可以直接使用,如:物体的重要、大小。
NLP表示方式目前常用的文本表示方式分为:
离散式表示(DiscreteRepresentation);分布式表示(DistributedRepresentation);离散式表示(DiscreteRepresentation)One-Hot
One-Hot 编码又称为“独热编码”或“哑编码”,是最传统、最基础的词(或字)特征表示方法。这种编码将词(或字)表示成一个向量,该向量的维度是词典(或字典)的长度(该词典是通过语料库生成的),该向量中,当前词的位置的值为1,其余的位置为0。
文本使用one-hot编码步骤:
根据语料库创建词典(vocabulary),并创建词和索引的映射(stoi,itos);将句子转换为用索引表示;创建OneHot 编码器;使用OneHot 编码器对句子进行编码;One-Hot编码的特点如下:
词向量长度是词典长度;在向量中,该单词的索引位置的值为 1 ,其余的值都是 0使用One-Hot进行编码的文本,得到的矩阵是稀疏矩阵缺点:
不同词的向量表示互相正交,无法衡量不同词之间的关系;该编码只能反映某个词是否在句中出现,无法衡量不同词的重要程度;使用One-Hot对文本进行编码后得到的是高维稀疏矩阵,会浪费计算和存储资源;词袋模型(BagOfWord,BOW)例句:
JanewantstogotoShenzhen.BobwantstogotoShanghai.在词袋模型中不考虑语序和词法的信息,每个单词都是相互独立的,将词语放入一个“袋子”里,统计每个单词出现的频率。
词袋模型编码特点:
词袋模型是对文本(而不是字或词)进行编码;编码后的向量长度是词典的长度;该编码忽略词出现的次序;在向量中,该单词的索引位置的值为单词在文本中出现的次数;如果索引位置的单词没有在文本中出现,则该值为 0 ;缺点
该编码忽略词的位置信息,位置信息在文本中是一个很重要信息,词的位置不一样语义会有很大的差别(如“猫爱吃老鼠”和“老鼠爱吃猫”的编码一样);该编码方式虽然统计了词在文本中出现的次数,但仅仅通过“出现次数”这个属性无法区分常用词(如:“我”、“是”、“的”等)和关键词(如:“自然语言处理”、“NLP ”等)在文本中的重要程度;TF-IDF(词频-逆文档频率)为了解决词袋模型无法区分常用词(如:“是”、“的”等)和专有名词(如:“自然语言处理”、“NLP ”等)对文本的重要性的问题,TF-IDF 算法应运而生。
TF-IDF全称是:termfrequency–inversedocumentfrequency又称 词频-逆文本频率。其中:
统计的方式主要是计算词的词频(TF)和逆向文件频率(IDF):
TF (TermFrequency ):某个词在当前文本中出现的频率,频率高的词语或者是重要的词(如:“自然语言处理”)或者是常用词(如:“我”、“是”、“的”等);IDF (InverseDocumentfrequency ):逆文本频率。文本频率是指:含有某个词的文本在整个语料库中所占的比例。逆文本频率是文本频率的倒数;那么,每个词都会得到一个TF-IDF值,用来衡量它的重要程度,计算公式如下:
优点
实现简单,算法容易理解且解释性较强;从IDF的计算方法可以看出常用词(如:“我”、“是”、“的”等)在语料库中的很多文章都会出现,故IDF的值会很小;而关键词(如:“自然语言处理”、“NLP ”等)只会在某领域的文章出现,IDF 的值会比较大;故:TF-IDF 在保留文章的重要词的同时可以过滤掉一些常见的、无关紧要的词;缺点
不能反映词的位置信息,在对关键词进行提取时,词的位置信息(如:标题、句首、句尾的词应该赋予更高的权重);IDF是一种试图抑制噪声的加权,本身倾向于文本中频率比较小的词,这使得IDF的精度不高;TF-IDF严重依赖于语料库(尤其在训练同类语料库时,往往会掩盖一些同类型的关键词;如:在进行TF-IDF训练时,语料库中的 娱乐 新闻较多,则与 娱乐 相关的关键词的权重就会偏低),因此需要选取质量高的语料库进行训练;分布式表示(DistributedRepresentation
理论基础:
1954年,Harris提出分布式假说(distributionalhypothesis)奠定了这种方法的理论基础:Aword’smeaningisgivenbythewordsthatfrequentlyappearclose-by(上下文相似的词,其语义也相似);1957年,Firth对分布式假说做出进一步的阐述和明确:Awordischaracterizedbythecompanyitkeeps(词的语义由其上下文决定);n-gramn-gram是一种 语言模型(LanguageModel,LM)。语言模型是一种基于概率的判别式模型,该模型的输入是一句话(单词的序列),输出的是这句话的概率,也就是这些单词的联合概率(jointprobability)。(备注:语言模型就是判断一句话是不是正常人说的。)
共现矩阵(Co-OccurrenceMatrix)首先指定窗口大小,然后统计窗口(和对称窗口)内词语共同出现的次数作为词的向量(vector)。
语料库:
Ilikedeeplearning.IlikeNLP.Ienjoyflying.备注: 指定窗口大小为1(即:左右的window_length=1,相当于bi-gram)统计数据如下:(I,like),(Iike,deep),(deep,learning),(learning,.),(I,like),(like,NLP),(NLP,.),(I,enjoy),(enjoy,flying),(flying,.)。则语料库的共现矩阵如下表所示:
从以上的共现矩阵可以看出,单词 like和 enjoy都在单词 I附件出现且统计数目大概相等,则它们在 语义 和 语法 上的含义大概相同。
优点
考虑了句子中词的顺序;缺点
词表的长度很大,导致词的向量长度也很大;共现矩阵也是稀疏矩阵(可以使用SVD、PCA等算法进行降维,但是计算量很大);Word2Vecword2vec模型是Google团队在2013年发布的wordrepresentation方法。该方法一出让 预训练词向量 的使用在NLP 领域遍地开花。
word2vec模型
word2vec有两种模型:CBOW和SKIP-GRAM;
CBOW:利用上下文的词预测中心词;SKIP-GRAM:利用中心词预测上下文的词;
优点
考虑到词语的上下文,学习到了语义和语法的信息;得到的词向量维度小,节省存储和计算资源;通用性强,可以应用到各种NLP任务中;缺点
词和向量是一对一的关系,无法解决多义词的问题;word2vec是一种静态的模型,虽然通用性强,但无法真的特定的任务做动态优化;GloVeGloVe 是斯坦福大学Jeffrey、Richard 等提供的一种词向量表示算法,GloVe 的全称是GlobalVectorsforWordRepresentation,是一个基于全局词频统计(count-based&overallstaticstics)的词表征(wordrepresentation)算法。该算法综合了globalmatrixfactorization(全局矩阵分解) 和localcontextwindow(局部上下文窗口) 两种方法的优点。
备注:Glove模型的推导公式比较复杂,在这里不做详细推导,具体可以查看官网(https://nlp.stanford.edu/projects/glove/)。
效果
优点
考虑到词语的上下文、和全局语料库的信息,学习到了语义和语法的信息;得到的词向量维度小,节省存储和计算资源;通用性强,可以应用到各种NLP 任务中;缺点
词和向量是一对一的关系,无法解决多义词的问题;glove也是一种静态的模型,虽然通用性强,但无法真的特定的任务做动态优化;ELMOword2vec和glove算法得到的词向量都是静态词向量(静态词向量会把多义词的语义进行融合,训练结束之后不会根据上下文进行改变),静态词向量无法解决多义词的问题(如:“我今天买了7斤苹果”和“我今天买了苹果7”中的 苹果 就是一个多义词)。而ELMO模型进行训练的词向量可以解决多义词的问题。
ELMO 的全称是“EmbeddingfromLanguageModels”,这个名字不能很好的反映出该模型的特点,提出ELMO 的论文题目可以更准确的表达出该算法的特点“Deepcontextualizedwordrepresentation”。
该算法的精髓是:用语言模型训练神经网络,在使用wordembedding时,单词已经具备上下文信息,这个时候神经网络可以根据上下文信息对wordembedding 进行调整,这样经过调整之后的wordembedding 更能表达在这个上下文中的具体含义,这就解决了静态词向量无法表示多义词的问题。
网络模型
过程
上图中的结构使用字符级卷积神经网络(convolutionalneuralnetwork,CNN)来将文本中的词转换成原始词向量(rawwordvector);将原始词向量输入双向语言模型中第一层;前向迭代中包含了该词以及该词之前的一些词汇或语境的信息(即上文);后向迭代中包含了该词以及该词之后的一些词汇或语境的信息(即下文);这两种迭代的信息组成了中间词向量(intermediatewordvector);中间词向量被输入到模型的下一层;最终向量就是原始词向量和两个中间词向量的加权和;效果
如上图所示:
使用glove训练的词向量中,与play相近的词大多与体育相关,这是因为语料中与play相关的语料多时体育领域的有关;在使用elmo训练的词向量中,当play取 演出 的意思时,与其相近的也是 演出 相近的句子;
NLP的业务场景NLP的4个典型应用
文本纠错:识别文本中的错别字,给出提示以及正确的建议情感倾向分析:对包含主观信息的文本进行情感倾向性判断评论观点抽取:分析评论关注点和观点,输出标签对话情绪识别:识别会话者所表现出的情绪类别及置信度文本标签:输出能够反映文章关键信息的多维度标签文章分类:输出文章的主题分类及对应的置信度新闻摘要:抽取关键信息并生成指定长度的新闻摘要
大家不要被这些眼花缭乱的业务场景给搞晕了,其实上面的这些业务都是基于我们之前讲的NLP预处理的输出,只是应用了不同的机器学习模型,比如:SVM、LSTM、LDA等等。
这些机器学习模型大部分是分类模型(序列标注也是一种分类模型),只有少部分是聚类模型。这些模型就是泛化的了,并不只是针对于NLP任务的。要想讲清楚这部分内容,就需要另开一个关于“机器学习入门”的主题,这里就不过多的展开了。
小结:只要大家掌握了NLP的预处理,就算入门NLP了,因为后续的处理都是一些常见的机器学习模型和方法。
结束语NLP是一个非常有挑战性的工作,同时也是一个非常有发展空间的工作,所以大家只要克服了前期的入门门槛,那么迎接你的将是一片广阔的天地。道阻且长,行则将至。
安利一下掘金小册《深入理解NLP的中文分词:从原理到实践》,它将系统的帮助你学习NLP的中文分词的相关知识,而中文分词对于NLP的重要意义,通过本文大家也应该十分清楚了。掌握中文分词的技术,不仅对于提高NLP任务的结果质量有很大的帮助,同时对于理解机器学习也有很大的促进作用。
领域里的8-种文本表示方式及优缺点
https://easyai.tech/ai-definition/nlp/
https://juejin.im/post/5dccbe0ff265da795315a119
自然语言处理五年技术革新,快速梳理 NLP 发展脉络
来源:机器之心
机器之心发布机器之心编辑部机器之心《2020-2021全球AI技术趋势发展报告》节选:顶会趋势(NeurIPS)分析。2021年伊始,机器之心发布《2020-2021全球AI技术趋势发展报告》,基于顶会、论文及专利等公共数据、机器之心专业领域数据仓库,通过数据挖掘定位七大趋势性AI技术领域。此外,该报告还邀请了近100位专家学者通过问卷调查,形成对这七大技术领域近年发展情况、成熟度与未来趋势的综合总结,并基于2015-2020年间的开源论文与专利语料,结合机器之心自有的新闻舆论以及模型最佳表现(SOTA)等相关数据库进行了探索性数据分析,并形成了用以帮助技术趋势判定的量化指标SyncedIndicator(SI)。为了方便从业者把握AI技术趋势,机器之心将持续刊载该该报告的节选内容,以下篇幅选自《2020-2021全球AI技术趋势发展报告》第三章「人类语言技术」。「3-1 」人类语言技术3-1-1 近年领域事件根据机器之心整理的人工智能领域事件库数据,近5年(2015~2020)来人类语言技术领域的主要有以下大事件值得关注:神经机器翻译、注意力机制与Transformer自然语言处理的技术突破似乎总是从机器翻译领域开始的,作为NLP领域最早的研究领域之一,机器翻译是较能体现语言理解的一项重要技术任务,也是自深度学习兴起后技术突破最多最频繁的技术任务。机器翻译的核心技术涵盖了自然语言理解和生成两大基本问题,其技术路径的演变基本可以代表整个自然语言处理技术领域的主要技术方法演变:从最初的基于语法规则的机器翻译(RBMT),统计学兴起之后逐渐开始形成气候的统计机器翻译(SMT),以及近10年来基于神经网络的机器翻译(NMT),机器翻译领域通常是新技术首先得到测试验证的领域。2015年以来,正是神经机器翻译快速发展的时代,而其中贡献较为突出的当属搜索引擎行业的龙头企业谷歌,从2016年谷歌神经机器翻译(GNMT)的发布开始,将初期主要在CV领域活跃的Attention机制运用到了机器翻译领域,2017年又抛开深度学习领域一直被广泛使用的核心RNN网络、提出了单纯基于自注意力机制的Transformer模型架构,在模型泛化能力上看到了很大的可能性。2018年紧接着提出并开源了基于双向Transformer的大规模预训练语言模型BERT,刷新了当时多项不同类型的NLP下游任务的最佳表现,使人们看到了这类模型的巨大潜力,也自此掀起了NLP领域的大规模预训练语言模型研究与开发的热潮。大规模预训练语言模型2018~2019年里,尤其是2019年,大规模预训练语言模型似乎成为了NLP领域技术指标突破逃不开的技术方法。在ELMo之前,深度学习在自然语言处理的主要应用方向在于从词到句子级别的分布式表征,word2vec是此类方法的典型代表。虽然一时间预训练的词向量在诸多自然语言处理任务上取得了不错的进展,但词向量本身都是上下文无关的,也即同一个词的向量表示在不同语境中总是相同的,这就意味着词向量无法解决语言技术里很大的一个障碍,一词多义问题。因此研究人员们开始在具体的下游任务中基于词向量的序列来做编码,这种seq2seq端到端的思想迅速取代了word2vec的热潮,而谷歌在这个基础上研发出的自注意力机制模型transformer可算是这个思想的集大成者。也正是同一时间,来自华盛顿大学的研究者开发出了ELMo模型,通过语言模型来获得一个上下文相关的预训练表示,并通过定制成功地用在了多个不同的下游任务上取得领先的表现效果。而仅仅针对文本进行丰富的encoding尚不足以覆盖所有NLP下游任务,尤其是QA、阅读理解等包含问询关系等多种复杂模式的情况下,下游任务的网络会需要做更多不同的结构调整,同一个模型在多个不同任务、甚至同一任务不同数据集上的表现差别仍然有待提高,这也就促使了BERT的诞生。BERT类模型使用大规模语料数据采取更深程度的预训练,从而形成一个更为通用的模型基底。这比覆盖上下文语境含义的词向量更进一步,而涉及到下游任务时也仅需要定制一个非常轻量级的输出层而不需要对模型骨架做重大调整。实用效率工具和数据集当一个技术发展成熟到一定程度之后,我们会看到技术在研究层面的数据增加开始放缓,但在工程和应用层面的相关数据开始增加。而回顾过去五年的NLP领域事件,我们发现除了重要的具体模型算法之外,数据集和实用的开源工具成为该领域里不可忽视的组成部分。除了机器翻译领域Google开源的GNMT,OpenNMT也开源了其自研的神经机器翻译工具包,并且提供了Pytorch和TensorFlow两个不同框架的支持。数据集Benchmark方面,问答数据集SQuAD经历了1.0、2.0两个代际,自然语言理解综合benchmarkGLUE也经历了一次到SuperGLUE的升级,中文领域也衍生出了类似的评价体系CLUE。随着预训练语言模型的火热与广泛应用,可以预见的是相关的数据集与评估指标还会有新的升级与换代。Facebook开发并开源了实用文本分类库fastText,OpenAI在三代GPT版本更迭后,于今年的GPT-3发布后不久便开始提供对应的API服务。综合工具方面,微软联合创始人保罗艾伦建立的AllenInstituteforAI于今年正式推出了其自然语言处理工具包AllenNLP,提供完整的自然语言处理流程框架和相应工具。成立于2016年的Huggingface借助Transformer模型的东风,提供多种基于transformer架构模型的调用框架(包括BERT、GPT-2、Transformer-XL、RoBERTa、DistilBERT、BART,以及GoogleT5等近40种不同模型),同时兼容TensorFlow与pytorch。知名语音技术工具包Kaldi也于2017和2018年先后增加了TensorFlow和PyTorch的整合支持。总体而言,NLP领域每年都有新突破,语音领域在2015~2017年发展迅猛,达到接近人类水平,而后归于稳定、小修小改重点解决局部问题。*完整的人类语言技术相关影响力事件表请参看报告附录。3-1-22019~2020年热门技术根据2019-2020年度技术热词分析结果,该领域的整体热度在本篇报告覆盖的领域里面排第二,仅次于计算机视觉,领域内的技术热词以主流的自然语言处理下游技术任务为主(如机器翻译、问答系统、信息抽取、文本分类等),同时包括一些近年来讨论热度比较高的算法模型框架(如BERT、word2vec、Transformer等),语音识别、语音合成两个语音相关的技术词也同样榜上有名。具体来说,神经机器翻译、语音识别以及BERT在论文、新闻的热词发现中均名列前茅,除此之外,新闻资讯中的技术热词多是大众讨论度比较高的技术词或偏口语化的技术词,如自然语言处理本身、聊天机器人、以及注意力机制,而论文中则会有比较多相对具体的基础技术任务如文本分类、命名体识别、语义解析等以及相对书面正式的技术词如自然语言理解、问答系统、机器阅读理解。报告、survey中呈现出的高频讨论技术词则多是归纳性质较强的技术任务或方法,如问答系统、序列到序列(seq2seq)、端到端(end2end)模型等。以下为本领域在各项热门技术词挖掘中综合排名前100的技术词:技术名词新闻挖掘论⽂挖掘报告/Survey⾃然语⾔处理✓⾃然语⾔理解✓⾃然语⾔推理✓机器翻译✓神经机器翻译✓✓问答系统✓✓对话系统✓聊天机器⼈✓机器阅读理解✓⽂本⾃动摘要⽂本分类✓情感分析✓语⾳识别✓✓语⾳合成⽂本⽣成✓命名体识别✓语义解析✓语法解析词性标注✓语⾔模型✓预训练模型✓ELMOGPTBERT✓✓Transformer✓注意⼒机制✓seq2seq✓word2vec✓词嵌⼊✓表3-1-2-1人类语言技术2019~2020年热门技术词*为了分析的完整和可对比性,我们额外补充了语音合成、语法解析、文本自动摘要,以及ELMO、GPT等技术词结合各AI技术分析报告文章、论文survey,社交网络观点、以及专家问卷结果,该人类语言技术章节分析主要从机器翻译、问答系统、阅读理解、文本分类、语音识别、语音合成等热门NLP和语音方面的技术任务,以及相关的热门技术方法如语言模型、序列到序列,词嵌入,BERT等分不同角度切入,从学界问卷、论文专利、以及新闻舆情多数据角度综合分析其本身以及相关技术近五年来的重要事件以及发展趋势,分析细节详情参见报告。报告全文获取方式方式二:成为机器之心PRO-VIP会员自然语言处理包含哪些内容
有朋友说小编你总是发一些自然语言处理的内容,那这个自然语言处理都包含了哪些内容呢?就此小编对自然语言处理进行了整理,下面我们来看自然语言处理的相关内容:
语言处理基础技术拥有领先、全面的NLP基础模块能力,不同粒度的底层能力包含词、短语、句子等,用户将其应用于多种技术和业务方向。主要涵盖:词法分析、词向量表示、词义相似度、依存句法分析、DNN语言模型、短文本相似度等,多在智能对话系统、相似内容推荐、搜索结果扩展等场景下应用。优势1、能力丰富自然语言核心算法与解决方案多达数十种,可对语言处理的各类需求进行全面覆盖。2、接口易用接口封装标准化,使用工具可通过云计算快速调用,极大降低人力开发成本。3、服务可靠对千亿量级调用需求进行支持,拥有完善的统计和监控措施,SLA稳定保持99.99%以上。
关于自然语言处理技术小编今天就分享到这里,更多相关内容持续分享中!
自然语言处理NLP(10)——语义分析
在上一部分中,我们介绍了句法分析中的局部句法分析以及依存关系分析(自然语言处理NLP(9)——句法分析c:局部句法分析、依存关系分析),至此,繁复冗长的句法分析部分就结束了。在这一部分中,我们将要介绍NLP领域的一个重要问题:语义分析。语义分析分为两个部分:词汇级语义分析以及句子级语义分析。这也就是为什么在词法分析和句法分析之后,我们要介绍的是语义分析而不是篇章分析的原因。
【一】词汇级语义分析首先,我们来介绍词汇级语义分析。词汇级语义分析的内容主要分为两块:1.词义消歧2.词语相似度二者的字面意思都很好理解。其中,词义消歧是自然语言处理中的基本问题之一,在机器翻译、文本分类、信息检索、语音识别、语义网络构建等方面都具有重要意义;而词语语义相似度计算在信息检索、信息抽取、词义排歧、机器翻译、句法分析等处理中有很重要的作用。
词义消歧自然语言中一个词具有多种含义的现象非常普遍。如何自动获悉某个词的多种含义;或者已知某个词有多种含义,如何根据上下文确认其含义,是词义消歧研究的内容。在英语中,bank这个词可能表示银行,也可能表示河岸;而在汉语中,这样的例子就更可怕了,比如:于是,基于这样的现状,词义消歧的任务就是给定输入,根据词语的上下文对词语的意思进行判断,例如:给定输入:他善与外界打交道我们期望的输出是可以确定这句话中的“打”和上图中的义项(5)相同。
语义消歧的方法大概分为四类:1.基于背景知识的语义消歧2.监督的语义消歧方法3.半监督的学习方法4.无监督的学习方法其中,第一种方法是基于规则的方法(也称为词典方法),后三种都是机器学习方法。在这里我们主要介绍前两种方法。
基于背景知识的语义消歧基于背景知识的语义消歧方法基本思想是这样的:通过词典中词条本身的定义作为判断其语义的条件。举个例子,cone这个词在词典中有两个定义:一个是指“松树的球果”,另一个是指“用于盛放其他东西的锥形物,比如,盛放冰激凌的锥形薄饼”。如果在文本中,“树(tree)”或者“冰(ice)”与cone出现在相同的上下文中,那么,cone的语义就可以确定了,tree对应cone的语义1,ice对应cone的语义2。可以看出,这种方法完全是基于规则的。
监督的语义消歧方法监督学习的方法就是,数据的类别在学习之前已经知道。在语义消歧的问题上,每个词所有可能的义项都是已知的。有监督的语义消歧方法是通过一个已标注的语料库学习得到一个分类模型。常用的方法有:1.基于贝叶斯分类器的词义消歧方法2.基于最大熵的词义消歧方法3.基于互信息的消歧方法在这里我们只介绍第二种方法,对其他两种方法感兴趣的朋友们可以自行查阅相关资料。基于最大熵的词义消歧方法基本思路是这样的:每个词表达不同含意时其上下文(语境)往往不同,即不同的词义对应不同的上下文。因此,可以将词的上下文作为特征信息利用最大熵模型对词的语义进行分类。这个思路是不是很熟悉?因为在NLP领域,几乎所有的机器学习方法利用的都是上下文特征这一套东西。
大家一定还记得最大熵模型是个什么东西(不了解的朋友们可以参考博客:自然语言处理NLP(5)——序列标注b:条件随机场(CRF)、RNN+CRF),在最大熵模型中,最最重要的部分就是如何选取特征,特征的质量直接影响着模型的效果。在传统机器学习领域(非深度学习),特征选取往往是人们手工进行的。
在词义消歧中,最大熵模型的建模与训练如下图所示:由于最大熵模型在之前的博客中曾详细讨论过,在这里就不再赘述,有疑问的朋友可以私信,我们一同讨论。
训练过后,我们将新的句子输入模型中,模型会给出一个概率分布(其实最大熵模型的输出就是一个概率分布),我们选取其中概率最大的结果作为模型输出,整个过程如下图所示:
词语相似度词语相似度的意思大家很容易理解,在这里我们用一种复杂但是稍微正式的方式说明词语相似度的含义,就是:两个词语在不同的上下文中可以互相替换使用而不改变文本的句法语义结构的程度。在不同的上下文中可以互相替换且不改变文本句法语义结构的可能性越大,二者的相似度就越高,否则相似度就越低。相似度以一个数值表示,一般取值范围在[0,1]之间。一个词语与其本身的语义相似度为1;如果两个词语在任何上下文中都不可替换,那么其相似度为0。值得注意的是,相似度涉及到词语的词法、句法、语义甚至语用等方面的特点。其中,对词语相似度影响最大的应该是词的语义。词语距离是度量两个词语关系的另一个重要指标,用一个[0,∞)之间的实数表示。大家可以想象,词语距离和词语相似度之间一定是存在某种关系的:1.两个词语距离为0时,其相似度为1。即,一个词语与其本身的距离为0;2.两个词语距离为无穷大时,其相似度为0;3.两个词语的距离越大,其相似度越小(单调下降)。如果将词语相似度记为sim(w1,w2)sim(w_1,w_2)sim(w1,w2),而将词语距离记为dis(w1,w2)dis(w_1,w_2)dis(w1,w2),我们有:sim(w1,w2)=αdis(w1,w2)+αsim(w_1,w_2)=frac{alpha}{dis(w_1,w_2)+alpha}sim(w1,w2)=dis(w1,w2)+αα其中,αalphaα是一个可调节的参数,表示相似度为0.5时的词语距离值(上式简单移项带入值既可)。到这里,大家可能有个问题:为什么有了词语相似度了,还要多此一举定义词语距离呢?这是为了当直接计算词语的相似度比较困难时,可以先计算词语距离,再转换成词语的相似度。
然后我们再来介绍一个概念:词语相关性。词语相关性反映的是两个词语互相关联的程度,可以用这两个词语在同一个语境中共现的可能性来衡量。一开始看见整个概念的时候可能会有种“这和词语相似度不是差不多么”这样的感觉,其实不然。举个例子,“医生”和“疾病”这两个词之间的相似度很低,但是相关性很高(因为这两个词经常在同一语境中出现)。用一句高深的话来讲,词语相似性反映的是词语之间的聚合特点,而词语相关性反映的是词语之间的组合特点。词语相关性也以一个数值表示,一般取范围在[0,1]之间的实数。虽然相关性与相似性并不相同,但实际上,词语相关性和词语相似性有着密切的联系。如果两个词语非常相似,那么这两个词语与其他词语的相关性也会非常接近。反之,如果两个词语与其他词语的相关性特点很接近,那么这两个词一般相似程度也很高。
利用词典方法(规则法)计算词语语义相似度的方法很多,这里不再赘述,有兴趣的朋友们可以自行查阅相关资料。
提到语义相似度这个概念,相信大家很容易想到词向量这个概念(对词向量不了解的朋友们可以参考博客:自然语言处理NLP(3)——神经网络语言模型、词向量)。根据词向量的性质,语义相似的词其词向量空间距离更相近,训练出的词向量具有词义相近的词在向量空间聚簇的语言学特性。词向量的相关工作就太多了,部分模型还对词向量进行k-means聚类,聚类后再次训练,得到多原型神经网络语言模型,考虑一词多义的情况。有兴趣的朋友们可以自行查阅相关资料或者私信讨论,在这里就不再进行介绍。
【二】句子级语义分析句子级语义分析主要分为两个部分:浅层语义分析和深层语义分析,在这里我们主要介绍浅层语义分析。提到浅层语义分析,就离不开语义角色标注(SemanticRoleLabeling,SRL)这个概念。语义角色标注主要围绕着句子中的谓词来分析各成分与其之间的结构关系,并用语义角色来描述这些结构关系。那么问题来了,为什么要围绕谓词来分析句子呢?我们暂且把这个问题放下,先来介绍格文法,在这里我们会找到这个问题的答案。
格文法格文法是从语义的角度出发,即从句子的深层结构来研究句子的结构,着重探讨句法结构与语义之间关系的文法理论。
在分析句子的过程中,我们有一种很常见的方法是找出句子中的主语、宾语等语法关系。大家可以联想一下初高中的英语阅读题,特别是完形填空,就是类似的套路。然而,格文法认为,这些都只是句子表层结构上的概念。在语言的底层,所需要的不是这些表层的语法关系,而是用施事、受事、工具、受益等概念所表示的句法语义关系,这些句法语义关系经过各种变换之后才在表层结构中成为主语或宾语。在传统语法中,“格”是指某些曲折语中特有的用于表示词语间语法关系的名词和代词的形态变化,例如主格、宾格等。
然而在格文法中,格是深层格,是指句子中的体词(名词、代词等)和谓词(动词、形容词等)之间的及物性关系。如,动作和施事者的关系、动作和受事者的关系等,这些关系是语义的,是一切语言中普遍存在的。深层格由底层结构中名词与动词之间的句法语义关系来确定,不管表层句法结构如何变化,底层格语法不变;底层的“格”与任何具体语言中的表层结构上的语法概念,如主语,宾语等,没有对应关系。这个概念有些难懂,我们举个例子:其表层结构与深层语义是有区别的,具体如下:由这个例子我们可以看出,在格文法中,无论具体的句子的主语、宾语等等怎么改变,其深层语义是完全相同的。
在格文法中,不同“格”(上图中所提到的施事格、受事格等等)的概念、格文法的组成等内容十分丰富,在这里不一一进行介绍,有兴趣的朋友们可以自行查阅相关资料或者私信进行讨论~
利用格文法分析的结果可用格框架表示。一个格框架由一个主要概念和一组辅助概念组成,这些辅助概念以一种适当定义的方式与主要概念相联系。在实际应用中,主要概念一般是动词,辅助概念为施事格、方位格、工具格等语义深层格。这样描述可能有些抽象,具体而言,把格框架中的格映射到输入句子中的短语上,识别一句话所表达的含义,即要弄清楚“干了什么”、“谁干的”、“行为结果是什么”以及发生行为的时间、地点和所用工具等。下面我们举个利用格文法进行语义分析的例子:大家不要过于在意上图中的具体格式,其表示的含义很容易理解。
语义角色标注(SRL)基于格文法,提出了一种语义分析的方法——语义角色标注。正如句法分析需要基于词法分析的结果进行一样,语义角色标注需要依赖句法分析的结果进行。因此,语义角色标注方法分为如下三种:1.基于完全句法分析的语义角色标注2.基于局部句法分析的语义角色标注3.基于依存句法分析的语义角色标注刚好是句法分析的三种方法,对句法分析不熟悉的朋友们可以参考博客:自然语言处理NLP(7)——句法分析a:Chomsky(乔姆斯基)形式文法自然语言处理NLP(8)——句法分析b:完全句法分析自然语言处理NLP(9)——句法分析c:局部句法分析、依存关系分析但是无论那种方法,语义角色标注的过程都如下图所示:其中,论元识别既可以单独称为一个步骤,也可以与论元剪除或者论元标注合并。上图中,大家想一想就会发现,语义角色标注的核心就是对论元进行语义标签的分类(第二步分类),语义角色标注的不同方法,其实就是针对这个问题设计不同的更加高效的分类器。句法分析是语义角色标注的基础,在统计方法中后续步骤常常会构造的一些人工特征,这些特征往往也来自句法分析;在神经网络方法中可以用神经网络自动提取特征来实现分类(标注)任务——神经网络在NLP领域,一大重要的作用就是代替了人工构建特征。到了这里我们发现,其实语义角色标注任务和我们之前所介绍的分类标注任务可以用相同的套路来解决(例如最大熵模型、隐马尔科夫模型、条件随机场等等)。
在这里多说一句,其实对NLP介绍到这里,给定具体的任务并将其进行形式化之后,很多问题都可以利用之前提到过的方法和套路来解决。
下面,我们对上文提到的SRL方法进行介绍,主要介绍基于完全句法分析和依存句法分析的语义角色标注方法,针对依存方法,我们还将进一步介绍当下比较热门的神经网络方法。
基于完全句法分析的统计SRL方法举个例子,我们原始的输入句子是:“警察已到现场,正在详细调查事故原因”那么我们的任务如下:值得注意的是,我们SRL任务的输入是已经完成句法分析的句子(通常为句法树)。图中右侧的表格是标注的label。
我们再来回忆一下SRL的过程,这个过程很重要(下图中句法分析已经结束),我们接下来会一步步进行介绍:
候选论元剪除对于完全句法分析而言,论元剪除规则分为如下两步(基于不同的句法分析方法,论元剪除规则有所不同):1.将谓词作为当前节点,依次考察它的兄弟节点:如果一个兄弟节点和当前节点在句法结构上不是并列的(coordinated)关系,则将它作为候选项。如果该兄弟节点的句法标签是PP,在将它的所有子节点也都作为候选项。2.将当前节点的父节点设为当前节点,重复第1步的操作,直至当前节点是句法树的根节点。这样的描述有些晦涩,我们还是以上面的句子为例:于是,我们就有了谓词“调查”的候选论元集合:{警方、正在、详细、事故原因}
论元识别正如我们上面所提到的,该步骤可以与论元剪除合并,也可以与接下来的论元标注合并,当然,也可以单独作为一步。论元识别顾名思义,就是识别上一步得到的候选论元集合中的论元是不是真的是论元。所以,很明显,这是个二分类序列标注问题,方法在之前章节中也有过很多介绍(例如最大熵模型、CRF、HMM等等),这里就不再赘述。假设在这一步中,我们认为上面的集合中所有的元素都是论元(即,模型没有判断出负类)。
论元标注顾名思义,该步的任务就是将上面一步中所识别出(为正类)的论元进行标注,标注的label是之前所提到的绿色表格中的内容。很明显,这是个多分类序列标注问题,方法在之前章节中有过很多介绍(方法依然是最大熵、CRF、HMM等)。在这里,我们回忆一下,最重要的部分是什么?特征构建。在上一步中也是相同的,特征构建是序列标注任务中最重要的一环。值得注意的是这一步中的特征构建可以与上一步不同,而且往往不同(因为这是两个不同的分类器)。于是,我们得到了如下的结果:
后处理后处理一步就是将标注之后的论元进行处理或者加上一些更加丰富(简单易懂)的信息,这部分不是我们所讨论的重点,因此只稍微提两句。后处理部分的内容主要包括:1.每个词只能标为一种标签(包括NULL)2.一种角色(NULL除外)通常在句子中只出现一次,因此在角色标注序列中,应无重复角色出现。
经过了上述步骤,我们就可以通过训练得到SRL模型了,训练过程与其他任务类似,在这里就不进行介绍了。值得注意的是,我们得到的是两个模型:论元识别模型、论元标注模型。前者是二分类模型,后者是多分类模型。然后,我们来了一个新句子,其标注过程如下:
基于依存句法分析的统计SRL方法同样以“警察已到现场,正在详细调查事故原因”为例。由于句法分析方法发生了改变,所以与上述方法不同的是SRL的输入:可以看出,输入由完全句法树改变为了依存分析树。与完全句法分析SRL相同的是右边的表格(论元标注label)。大家想一下整个SRL过程就能够发现,除了第一步候选论元剪除之外,其他步骤都与上述方法中的对应步骤相同,所以我们在这部分中仅讨论这一步骤。
候选论元剪除该步骤同样分为两部:1.将谓词作为当前节点,将它所有的孩子都作为候选项。2.将当前节点设为它的父节点,重复第1步的操作,直到当前节点是依存句法树的根节点。过程如下:谓词“调查”的所有孩子{正在,详细,原因,警察}都加入到候选项中,这些孩子节点恰好是该谓词的所有论元。
基于依存句法分析的神经网络SRL方法介绍了以上两种SRL方法之后,我们需要着重注意的有两点:1.上述两种方法都是通过概率统计法进行SRL的方法(在我们之前章节中多次提到的那张图中既不是规则法,也不是神经网络法,而属于概率统计法)。(之前的两种方法属于左下角的概率统计方法)
2.我们知道,特征构建是标注问题的重中之重,然而在传统概率统计方法中,只能由人工构建特征,这就为模型的性能打上了一个大大的问号。因此,为了解决这个问题,我们在这一部分中介绍基于依存关系分析的神经网络SRL方法。
我们之前提到,神经网络法的主要目的是为了利用神经网络自动构建特征,那么我们很自然就可以想到,该种方法与概率统计法的主要区别就在于模型,神经网络模型架构如下:上图中,我们的输入是原始句子(图片正上方)以及依存关系树(图片右下角),经过了神经网络之后的输出为某词的标注结果。其中,输入的依存关系树部分主要是节点信息和边信息。值得注意的是,神经网络的具体架构可以自行设计,图片中利用的是双向LSTM架构。模型训练过程就不再赘述,有兴趣的朋友可以自行查阅相关资料或者私聊讨论~
评价指标如何评价一个语义角色标注模型的好坏呢?一般情况下,我们通常使用常见的P、R、F1值进行评测,对该评测指标不了解的朋友们可以参考博客:自然语言处理NLP(6)——词法分析
在这一部分中,我们介绍了语义分析的基本知识,包括格文法以及语义角色标注的相关内容。在下一部分中,我们将会介绍篇章分析相关的内容。
如果本文中某些表述或理解有误,欢迎各位大神批评指正。
谢谢!