工业界NLP四大任务:
① 序列标注:分词、POSTag 词性标注、NER、语义标注
② 分类任务:文本分类、情感计算
③ 句子关系判断:Entailment、QA、自然语言推理
④ 生成式任务:机器翻译、文本摘要
拓:
自然语言推理是NLP高级别的任务之一,不过自然语言推理包含的内容比较多,机器阅读,问答系统和对话等本质上都属于自然语言推理。文本蕴含任务(text entailment),它的任务形式是:给定一个前提文本(premise),根据这个前提去推断假说文本(hypothesis)与premise的关系,一般分为蕴含关系(entailment)和矛盾关系(contradiction),蕴含关系(entailment)表示从premise中可以推断出hypothesis;矛盾关系(contradiction)即hypothesis与premise矛盾。文本蕴含的结果就是这几个概率值。
语料,即语言材料。语料是语言学研究的内容。语料是构成语料库的基本单元。所以,人们简单地用文本作为替代,并把文本中的上下文关系作为现实世界中语言的上下文关系的替代品。我们把一个文本集合称为语料库(Corpus),当有几个这样的文本集合的时候,我们称之为语料库集合(Corpora)。
2.1.语料清洗
数据清洗,顾名思义就是在语料中找到我们感兴趣的东西,把不感兴趣的、视为噪音的内容清洗删除,包括对于原始文本提取标题、摘要、正文等信息,对于爬取的网页内容,去除广告、标签、HTML、JS 等代码和注释等。常见的数据清洗方式有:人工去重、对齐、删除和标注等,或者规则提取内容、正则表达式匹配、根据词性和命名实体提取、编写脚本或者代码批处理等。
2.2.分词
中文语料数据为一批短文本或者长文本,比如:句子,文章摘要,段落或者整篇文章组成的一个集合。一般句子、段落之间的字、词语是连续的,有一定含义。而进行文本挖掘分析时,我们希望文本处理的最小单位粒度是词或者词语,所以这个时候就需要分词来将文本全部进行分词。
常见的分词算法有:基于字符串匹配的分词方法、基于理解的分词方法、基于统计的分词方法和基于规则的分词方法,每种方法下面对应许多具体的算法。
当前中文分词算法的主要难点有歧义识别和新词识别,比如:“羽毛球拍卖完了”,这个可以切分成“羽毛 球拍 卖 完 了”,也可切分成“羽毛球 拍卖 完 了”,如果不依赖上下文其他的句子,恐怕很难知道如何去理解。
2.3.词性标注
词性标注,就是给每个词或者词语打词类标签,如形容词、动词、名词等。这样做可以让文本在后面的处理中融入更多有用的语言信息。词性标注是一个经典的序列标注问题,不过对于有些中文自然语言处理来说,词性标注不是非必需的。比如,常见的文本分类就不用关心词性问题,但是类似情感分析、知识推理却是需要的。
常见的词性标注方法可以分为基于规则和基于统计的方法。其中基于统计的方法,如基于最大熵的词性标注、基于统计最大概率输出词性和基于 HMM 的词性标注。
2.4.去停用词
停用词一般指对文本特征没有任何贡献作用的字词,比如标点符号、语气、人称等一些词。所以在一般性的文本处理中,分词之后,接下来一步就是去停用词。但是对于中文来说,去停用词操作不是一成不变的,停用词词典是根据具体场景来决定的,比如在情感分析中,语气词、感叹号是应该保留的,因为他们对表示语气程度、感情色彩有一定的贡献和意义。
做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。显然,如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是数学中的向量。有两种常用的表示模型分别是词袋模型和词向量。
3.1.词袋模型
词袋模型(Bag of Word, BOW),即不考虑词语原本在句子中的顺序,直接将每一个词语或者符号统一放置在一个集合(如 list),然后按照计数的方式对出现的次数进行统计。统计词频这只是最基本的方式,TF-IDF 是词袋模型的一个经典用法。
3.2.词向量
词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。还有 Google 团队的 Word2Vec,其主要包含两个模型:跳字模型(Skip-Gram)和连续词袋模型(Continuous Bag of Words,简称 CBOW),以及两种高效训练的方法:负采样(Negative Sampling)和层序 Softmax(Hierarchical Softmax)。值得一提的是,Word2Vec 词向量可以较好地表达不同词之间的相似和类比关系。除此之外,还有一些词向量的表示方式,如 Doc2Vec、WordRank 和 FastText 等。
同数据挖掘一样,在文本挖掘相关问题中,特征工程也是必不可少的。在一个实际问题中,构造好的特征向量,是要选择合适的、表达能力强的特征。文本特征一般都是词语,具有语义信息,使用特征选择能够找出一个特征子集,其仍然可以保留语义信息;但通过特征提取找到的特征子空间,将会丢失部分语义信息。所以特征选择是一个很有挑战的过程,更多的依赖于经验和专业知识,并且有很多现成的算法来进行特征的选择。目前,常见的特征选择方法主要有 DF、 MI、 IG、 CHI、WLLR、WFO 六种。
在特征向量选择好之后,接下来要做的事情当然就是训练模型,对于不同的应用需求,我们使用不同的模型,传统的有监督和无监督等机器学习模型, 如 KNN、SVM、Naive Bayes、决策树、GBDT、K-means 等模型;深度学习模型比如 CNN、RNN、LSTM、 Seq2Seq、FastText、TextCNN 等。
模型线上应用,目前主流的应用方式就是提供服务或者将模型持久化。
第一就是线下训练模型,然后将模型做线上部署,发布成接口服务以供业务系统使用。
第二种就是在线训练,在线训练完成之后把模型 pickle 持久化,然后在线服务接口模板通过读取 pickle 而改变接口服务。
一直以来,词向量都是自然语言处理的核心表征技术,长期统治着自然语言处理领域。然而,现在出现了一系列令人振奋的挑战者,包括 ELMo、ULMFiT 和 OpenAI Transformer,都证明了预训练语言模型可以在各种自然语言处理任务中取得最佳结果。
这些方法的出现预示着一个分水岭时刻的到来:预训练语言模型可能会在自然语言处理领域造成广泛影响,正如 ImageNet 预训练模型在计算机视觉中所造成的影响一样。
具体来说,预训练词向量已经引领了自然语言处理很长时间。Word2vec 在 2013 年被作为近似语言建模模型而提出。当时,硬件速度比现在慢很多,深度学习模型也还没有得到广泛支持,Word2vec 凭借着自身效率和易用性而被采用。
从那时起,实施 NLP 项目的标准方法基本就没变过:通过 Word2vec 和 GloVe 等算法,在大量未标注数据上进行预训练获得词嵌入向量 ,然后把词嵌入向量用于初始化神经网络的第一层,而网络其它部分则根据特定任务,利用其余数据进行训练。尽管这种做法对许多任务都有帮助,但却无法捕捉到更有用的高层次信息。
现如今, ULMFiT、ELMo 和 OpenAI Transformer 给自然语言处理社区带来了语言任务的 ImageNet,也让模型能够学习文本中更高层次的细微差别,类似于 ImageNet 上的预训练使计算机视觉模型学习图像通用特征的做法。
在深度学习时代,数据与算法同等重要。 ImageNet 在迁移学习中实现了同等重要的突破,研究人员意识到,ImageNet 最佳模型学习的权重可以初始化其它任务模型,尽管数据集不同,但是这对模型性能提高依然有很大帮助。这种方法可以实现更好的效果,甚至每个类别有一个正样本就足够了。
现在,预训练 ImageNet 模型已经被用于物体检测、语义分割和视频识别等任务,并取得了最佳结果。同时,这也让深度学习得以应用到训练样本数量较少且标注成本很高的领域。
参考资料
[1] 中文自然语言处理入门 宿永杰