NLP入门小结

由于项目原因要应用一些文本分类的技术,但不是研究这个方向。从纯实用的角度,查了一些资料,做了以下记录。

机器学习的库现在有很多,例如 Tensorflow,Keras 和 Pytorch。 但是,如果不懂NLP基础,不知道NLP分析任务,而直接用这些框架,确实有不知道如何上手的问题。

NLP 简介

自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。其主要处理的工作如下:

NLP 的任务

  1. text classification, 文本分类,就是按照一定标准对文本集合进行自动分类标记。这是NLP应用最为广泛的应用。现在通常解决方法是——使用人工标注过的文本集合作为训练集,训练神经网络模型,然后用训练好的模型去自动分类其他文本。
  2. Sentiment analysis,情感分析,就是判断文章的情感取向(积极/消极或者更多分类)。是文本分类的一个分支。
  3. Information Extraction,信息提取,是从非结构化文本源中提取特定信息的过程,以便能够找到实体并将其分类并存储在数据库中。典型应用如从电子邮件中提取数据添加到日历里。
  4. entity detection, 实体识别,是信息提取的低级子任务,是从文本中提取出认为定义的命名实体,例如组织名称、机构代码、货币价值、百分比、时间表达等等。
  5. semantic annotation,语义注释,是信息提取的高级子任务,其目的是将实体与其语义描述相结合。例如,在一篇文章内到处加备注,将内容链接到相关实体上,以供读者或者其他机器学习模型参考。这也是知识图谱的必要技术。
  6. Automatic summarization, 自动摘要,就像小学生做阅读理解一样,自动将一篇文章的核心内容总结出来。属于信息提取的高级应用。
  7. machine translation, 机器翻译,就是自动将一种语言的文档翻译成另外一种语言。其主要难点在于人类语言具有歧义性,因此好的翻译不仅仅在于参考上下文,而是要参考巨量的人类语料集。
  8. Question answering systems, 自动回答系统,根据用户的提问进行自动回答。这是最能体现AI性能的应用(图灵测试)。典型应用如面试机器人、微信自动回答小助手等等。显然它比机器翻译还难,不仅要理解用户的问题,还得组织回答。
  9. 等等

NLP中文本分类任务的一般处理流程

我们以要做的文本分类任务为例,介绍一下常见的基于机器学习的文本分类处理流程:

  1. 准备数据:为了得到机器学习的最终成果——可以自动进行文本分类的分类器,首先我们要准备训练数据,即训练集。一般来说用作训练集的数据,需要是已经人工标注的。机器学习模型通过这些数据的训练,才能知道怎么分类是对,怎么分类是错,进而做到机器自动分类。在AI界有一句话,"数据决定了你的模型上限,而模型只是在逼近这个上限"。可见数据的重要。然而人工标注数据是一件十分耗费人力的事,所以有有很多技术和方法来改进这个问题(例如使用可视化技术加快标注效率、使用机器学习模型生成标注好的数据等等)。还好,入门NLP并不需要我们人工标注数据,已经有很多已经标注好的训练集可供下载。这样的训练集特别多,随便在知乎上搜一下就有(https://www.zhihu.com/search?type=content&q=nlp%20%E6%95%B0%E6%8D%AE%E9%9B%86)。由于分的很细,所以使用时注意是否与你的分析任务直接相关。当你熟悉了整个文本分类了流程后,为了解决实际问题,可能还需要更多的标注数据,这个时候就需要你准备自己的人工标注数据了。
  2. 数据预处理:准备好数据后,接下来就是数据预处理。网上的开源训练集,有的已经经过了预处理(例如已经分词、去除停用词等等),但有的有没有。并且因为分类任务的不同,可能需要的预处理步骤会有区别。例如进行情感分析,可能还要构造情感词典。为了进行自动摘要,可能需要先做实体检测。所以数据预处理步骤不能省略。广义的数据预处理还包括特征提取这一步骤,但由于特征提取较为重要,所以下文单独讲一下。为了简便起见,预处理通常会使用一些专门的类库来做,例如spaCy,TorchText等。这些库可以从分词一直处理到词向量,然后交给机器学习模型去学习。
  3. 特征提取:特征提取就是把处理好的数据,用机器可以看懂的最小结构表达出来,从而方便后续的计算。在NLP文本分类任务中,常见的特征提取方式有两大类:词袋模型和词向量模型。词袋模型中常用的方案是TF-IDF模型,词向量模型常用的方案有one-hot和word2vec。我们作为使用者只要百度谷歌以下知道其概念即可,并且了解我们的测试案例用的是哪一个就行。经过特征提取,训练集数据将转换为TF-IDF的词袋数据或者word2vec的高维词向量,这样文本分类的机器学习模型才好进行处理。
  4. 模型训练:用于文本分析的机器学习模型有很多,例如KNN,SVN,K-mean,CNN,LSTM等等。使用 Tensorflow,Keras 和 Pytorch这样的机器学习框架,可以较为容易地调用这些模型,去学习你处理好的词袋或者词向量,这个过程就是模型训练。根据你训练集的规模和机器的性能不同,模型完整训练一次的时间从几分钟到几百小时不等,所以最好量力而行。此外初期学习时不要纠结这些机器学习模型的原理,就把它当作一个电视机,搞清楚怎么操作遥控器就可以了。
  5. 模型预测结果评价:模型经过训练,就可以自己去文本分类了。我们当然希望模型不仅仅是在训练集上才会预测,对于非训练集的目标数据(称为测试集)也能有用,即达到所谓举一反三的效果。但是机器学习模型的文本分类结果,跟标准答案可能不完全一致,甚至可能错得离谱。需要有对模型的评测指标,最重要的评测指标就是准确率(计算模型正确分类的样本数与总样本数之比以衡量模型的效果)。 其他还有精确率,召回率, F1等等。
  6. 欠拟合与过拟合:对于工业化应用,当然是准确率越高越好。不过,模型对于训练集和测试集的准确率通常不一样,以下两种情况是要着力避免的:其一,模型在训练集上的准确率很低,称之为欠拟合。说明该模型不是很适合学习这个训练集的数据。解决方案是换模型、增加模型复杂度、减少正则化参数等。其二,模型在训练集上准确率很高,但在测试集上的准确率很低,称之为过拟合。这种情况较为常见,说明模型只对缺乏举一反三的能力。解决方案有增大训练集的数据量、增加正则化参数、人工改善特征选取等。
  7. 分类器上线应用:机器学习模型经过反复地训练、评价和调整,最终达到一个在测试集上准确率可以接受的状态。这个时候就可以把模型做线上部署,然后让他服务于人类了。当然对于百度谷歌很多大公司来说,还会做在线训练,即在模型部署后,还会持续地以人们输入的数据作为养料进行训练,不断改进。最典型的例子就是机器翻译在最近10年中不断进步,以至于让很多英语专业的中低端人才转行。

综上可见,如果不是研究机器学习模型而只是为了学会使用,那么整个NLP分类文本任务的工作量主要在数据预处理和模型训练调参这两步。

文本分类相关项目推荐

百度 Senta 情感分析系统,基于百度AI平台,部署使用简单。可以先用来练手。 https://github.com/baidu/Senta

关于数据预处理

每一类NPL任务,用到的具体方法都不一样,但都有共性。最大的共性是,你都需要对要处理的文本进行一些预处理(分句,分词,识别停用词,实体检测,依存分析等等),才能进行高级操作(文本分类、知识提取等等)。

推荐一个库spaCy,是最受欢迎的文本预处理库。它包含许多易于使用的函数,可以用于标记化、词性标记、命名实体识别等。它还支持59种以上的语言和几种预训练的单词向量,你很容易就可以快速入门!地址:https://github.com/explosion/spaCy

 

SpaCy的功能:

  1. Sentencizer,断句,就是将文章分成句子。虽然现代不论中文文章还是英文文章靠句号就能断句,但是可能存在一些不易处理的特殊规则。例如,当一篇英文文章有很多公式的时候,不好简单靠句号区分,就可以定制其句式的开头结尾。此外,spaCy支持在代码里加载其他语言模型对文本进行分析。
  2. Tokenization,分词,就是将句子分成词。英文比较简单直接靠空格分词,而中文要有特殊的分词操作。spaCy 2.2.3以后版本支持中文。
  3. Part-of-speech tagging,词性标注,简称 POS。就是标注单词是什么类型,类型包括名词/动词,也可以自定义,比如噪声词/有用词等等。
  4. Lemmatization,词性还原。对于英文、拉丁文等语言,词汇都有变格的形式,词性还原可以将变格后的单词还原成原形态以便分析。例如,复数还原成单数(cats -> cat),过去时态还原成现在时态 (had -> have)。中文不需要。
  5. Stop words,识别停用词。停用词一般是英文中出现频率最高、但又没什么语义的词,如 a, the。在很多NLP任务开展前中都要去掉这些词的干扰,避免它们浪费内存。
  6. Dependency Parsing,依存分析,就是通过语法解析树的构建,标记单词是主语,谓语,宾语还是连接词。从而方便检测句子的边界,切分短语等工作。Spacy 的依存分析采用了 ClearNLP 的依存分析标签ClearNLP Dependency Labels。根据这个网站提供的标签词典,一句话可以被构建成如下内容 [限定词, 形容词修饰, 名词主语, 根节点, 限定词, 形容词修饰, 形容词修饰, 属性, 标点] ,其中根节点是一句话的谓词。依存分析是语义分析的基础,非常重要。比如在科技论文写作中有一条规则是,主语不能过长,谓语(根节点)出现的位置不能过于靠后,否则会影响阅读理解。具体实现方法就是判断根节点的位置,即一句话中动词谓语的位置,如果过于靠后,则提出修改意见。
  7. Named Entity Recognization,实体检测,简称NER,就是识别出文档中的实体短语,有多种类型的实体,例如 - 人物,地点,组织,日期,数字。为下一步工作做准备。SpaCy有专门的词典来做此事。
  8. Noun Chunks,提取名词短语, 就是把一些特定的名词短语提取出来。例如文章中经常出现“兰州理工大学”,那么这个“兰州理工大学”就是一个特定的名词短语。
  9. Coreference Resolution,指代消解,寻找句子中代词 he,she,it 所对应的实体。显然想做到这一点,就不能用规则、词典之类简单的方法来实现,而需要用到神经网络。spaCy需要使用神经网络预训练的指代消解系数,如果前面没有安装,可运行命令:pip install neuralcoref
  10. Matcher,模式匹配。就是查找满足特定要求的文内内容,可以是单词,短语,句子乃至段落。例如,你想找文章中所有被动语句。那么就可以写一个模式,passive_pattern = [{'DEP':'nsubjpass'},{'DEP':'aux','OP':'*'},{'DEP':'auxpass'},{'TAG':'VBN'}]其中DEP是依存关系, nsubjpass 是被动主语,后面加一个可能存在的助动词aux,OP代表可选,后面加被动词 auxpass,最后面加动词的过去式(用Part-of-speech Tag为VBN匹配)。模式匹配对于全文查询、 信息提取等NLP任务具有很重要的意义。
  11. Word Vector, 词向量,是NLP最重要的技术,是文本分类、信息提取等NLP任务的基础。Spacy 里面不仅可以访问词向量vector, 还可以访问句向量 span.vector 以及文章向量 doc.vector。无论是Doc, Span 还是 Token,他们都内嵌相似度计算函数 similarity()。这个函数可以计算两个向量的 cos 距离,从而知道两个向量的近似度,比如 【猫, 狗, 香蕉,苹果】,猫和狗更相近,香蕉和苹果更相近。
  12. Display,可视化。spaCy可以把它的功能可视化出来。例如对依存分析的可视化,对命名实体识别的可视化等等。

 

spaCy相关资源

TorchText

这是另一个NLP预处理库,主要特点是和Pytorch 结合较好。

TorchText本身的主要功能是可以概括为Field,Dataset和Iterator这三部分:

  • Dataset:定义数据集信息。
  • Field: 指明要处理数据源的哪个字段
  • Iterator:迭代器,处理字段的具体方法

通过设置Field,Dataset和Iterator,TorchText也可以实现从分词到词向量的工作。TorchText还可以调用spaCy中的一些方法来帮助处理诸如分词、词性标注等任务。具体使用时,你可以先安装Pytorch ,再安装TorchText,最后安装spaCy. 通过TorchText处理好数据,然后直接喂给Pytorch 的机器学习模型。