自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。主要的目标是使用计算机相关方法、算法和技术,分析、处理、理解人类的语言。虽然人类的不同语言之间有差别,但是有些算法和技术,是通用的。
自然语言处理的应用场景非常广泛,主要包括机器翻译、舆情监测与分析、自动摘要抽取与生成、观点提取、文本分类、问题回答(专家系统)、文本语义对比、语音识别、中文OCR、文本自动生成等方面,可以说跟我们的日常生活息息相关。
接下来的一系列文章的主要目的,是为初学者介绍自然语言处理中的一些相关算法、原理和技术,引导读者入门,能够对自然语言处理的相关概念、方法、算法、技术等,有一个初步的认识和印象。
限于篇幅,一些细节方面并没有深入下去,也无法做到面面俱到,读者有兴趣的,可以继续查阅网络资料、相关文献进行深入的学习和研究。
另外需要说明的是,这只是一系列的博客文章,并不是严谨的科学论文,在很多描述上,采用了通俗的、口语化的、轻松的描述方式,更加科学的推理与证明,需要阅读科学文献来进行获取。
自然语言处理应用领域分类
机器翻译
就是将人类的一种语言翻译成另外一种语言。当然,随着技术的不断进步,机器翻译已经不仅仅是在人类语言之间进行翻译,还可以将人类的语言翻译成程序代码,完成程序的自动生成;还可以将一副图像,翻译成一句话进行讲解,这些都可以被认为是机器翻译的应用范畴。
舆情监测与分析
通过对网上的文本进行分析,查看大家对一个事情的看法(正面还是负面),例如对一个产品的评价,可以通过采集用户对商品的评价文本,分析有多少用户对产品满意,有多少给了负面评价,进一步的,还可以分析出用户满意和不满意的关键点是什么。
自动摘要抽取与生成
通过对文本进行分析,自动提炼出摘要(关键信息)。又分两个方向,一个是摘要抽取,一个是摘要生成。摘要抽取一般来说,是将一篇文档中的关键字提炼出来,形成一句或者一段还算比较通顺的话,这些词语,是在本来的文章中就存在的。摘要生成,指的是为一篇文档生成一段话,提取核心思想,这些词语,有可能并不是原文档中存在的,而是通过对文档的语义理解,生成新的词语,可以认为是对文档的解读。
观点提取
观点提取的含义,与摘要生成比较类似,但是更加主观一些,相当于对文档内容进行更深层次的解读,有可能大部分的词语都不是原文档中存在的,而是使用更加通俗易懂的语言,对一些专业的、晦涩难懂的文档进行重新提炼。
文本分类
是最重要的自然语言处理应用之一。其核心目的,是通过分析一批文档的内容,将他们分成不同的类别。通过对文档进行分类,可以实现评价的自动分析(正面评价、负面评价)、文件的自动归类与整理、新闻咨询的推荐与自动推送等各种功能。
问题回答
也可以被称为专家系统。通过搜集整理大量的语料,为每一个问题生成一个答案,广泛应用于各种智能客服、专家提问与解答等系统中。
除此之外,自然语言处理的应用场景还有很多,例如对于语义的理解、语音的识别与理解等,都可以被认为是自然语言处理中的一部分。
为了完成对自然语言的处理,需要对相关的概念、技术,有一个初步的认识和印象。
自然语言处理的基本概念
语料库
语料库(Corpus)指的是经科学取样和加工后的电子文本(音频)库,其中存放的是在自然语言的实际使用中真实出现过的语言材料。
换句话说,语料库,其实就是我们需要处理和分析的所有文本的集合。在很多计算机领域中,也可以被称为数据集。一般来说,语料库是自然语言处理中对数据集的特殊称呼,从作用上来看,它们和其他领域的数据集并没有本质的区别。
语料存在的形式可以是多种的,例如存入数据库中,或者简单的文本文件等,只要能够被分析和处理程序进行简单的读取,就可以。
语料库的大小可谓千差万别。如果要做商品的评价分析,那么可能只需要得到这个商品的1万条评价就可以了;如果要对中国的古典文学进行研究和分析,或许,语料库需要1000本古典名著;如果要对互联网进行舆情监控,那么大概率,需要100亿个网页的数据才能做到。
同时,语料库的复杂程度也不相同。如果是为了进行文本分类等任务,那么使用单一语种的语料库就可以(单语的,Monolingual)。如果是翻译任务,可能还需要多语种语料库(双语的,Bilingual,和多语的,Multilingual)。另外,在翻译任务中,可能还需要平行语料库。所谓平行语料库,指的是对于一种语言的一个文档,一定有另外一种语言的同样内容(含义)的文档与之相对应。传统的翻译算法,基本上都构建在平行语料之上。
从标注的角度来说,语料库又可以分为带有标注信息的监督学习语料库和不带有标注信息的非监督学习(半监督学习)语料库。所谓的监督学习语料库,指的是带有标注信息。标注信息指的是,对语料要表达的含义进行了说明,这种说明叫做标注(Label)。例如,对于一个酒店的评价,有正面的,有负面的。可是,通常情况下,评价作者并不会在评论中明确说出他的评价是正面的还是负面的,如果我们的任务是区分以后的评价是正面还是负面,就需要对已有的数据进行区分,标注出哪些条目(评价)是正面的,哪些是负面的。如果只有正面和负面的区分,一般来说用0和1来进行标注。
同样的,对于文本分类,标注的意思是,在进行处理之前,对语料库中的数据进行说明,哪一个文档属于哪一个分类,这样,人工智能等算法,才能从中学习到规律。
语料库的质量,也有很大的差异。最典型的是用于翻译的平行语料库。平行语料库要求对于任何一个文档,一定有另外一个语言的、能够表述同样含义的语料与之对应,那么这个所谓的相同含义,质量就有很大的差异了。很多平行语料库的作者,是从网上一些英语教学、翻译网站采集的由普通用户翻译的语言文本,当成是正确、准确、权威的翻译,来组成一个平行语料,这在很大程度上会影响平行语料库的质量。
一般来说,语料库有几个特点:
- 必须是真实的。自然语言处理中的自然,当然指的就是人类真正在使用的语言。所以,一个合格的语料库中的文字,必须是真实的,由人类在自然的生活过程中产生的,不能够或者说,也不应该,由机器或者其他任何方式来生成。当然,在一些算法中,为了解决数据不平衡问题,可能会生成一些文本来提升算法的性能,但是那是在处理过程中,原始的语料库必须是真实的。
- 语料库应该是原始的。一个优秀的语料库,应该是原汁原味的,没有经过特殊加工的。一旦语料库被加工过,那么很多信息可能会丢失。
一般来说,语料库来自于网上公开的数据集,采用这种数据集有很多好处:省去自己采集和标注的烦恼;可以和现有的算法直接进行比较(因为采用了同样的语料库)。当然,如果无法找到现成的语料库,也可以根据自己的需要自行创建。采集和创建的方法千差万别,这里就不再赘述了。
数据预处理
拿到语料库之后,首先要做的事情,就是数据的预处理工作。数据的预处理工作,主要目的是为了让数据更加符合分析和处理的要求。数据预处理的手段主要包括:语料清洗、分词、词性标注、去停用词、词频统计等。
- 数据清洗。语料清洗即保留语料中有用的数据,删除噪音数据。常见的清洗方式有:人工去重(去掉重复数据)、对齐(一般应用于平行语料)、删除(包括一些特殊符号、标点符号:在大部分的场景下,标点都没有用、html标签:一般应用于一些网上采集的数据、表情符号)、标注(一般应用于没有标注的数据集,进行手动标注)、大写转小写(应用于英语等区分字母大小写的语料)等。此外,噪音数据还包括文本错误、缺失、异常等。清洗的方法包括手动处理,或者通过开发小工具、编写简短的小程序来进行数据清洗。
- 分词。文本分词,即将文本分成一个一个的词语,是某些语言(中文)特殊的数据预处理手段。英语等语言,使用空格将词语分开,因此,大多数情况下,不需要单独进行分词处理。常用的分词方法有基于规则的、基于统计的分词方法,而统计的样本内容来自于一些标准的语料库。当然,现在已经有很多分词算法可供选择,可以根据需要尝试适合自己语料的分词算法。
- 词性标注。这是一类特殊的预处理手段,一般应用于语义理解任务中。词性标注指的是为分词结果中的每个词标注正确的词性,即确定每个词是名词、动词、形容词或其他词性的过程。词性标注有多个重要作用:第一,消除歧义。一些词在不同语境或不同用法时表示不同的意思;第二,强化基于单词的特征。此外,词性标注还具有标准化、词形还原,以及有效移除停用词的作用。常用的词性标注方法有基于规则的、基于统计的算法,比如:最大熵词性标注、HMM 词性标注等。
- 去停用词。关于什么是停用词,后续的文章还有更详细的说明。简短说,停用词就是一些没有具体含义的词语,比如中文的“吧”,是一种语气助词,通常来说是没有含义的,可以从文本语料库中直接去掉。一般来说,某些研究机构会公布他们认为的停用词表,通过查询这张表,能够很容易的将所有停用词从语料库中去除。
- 词频统计。词频统计即统计分词后文本的词频,目的是找出对文本影响最大的词汇,是很多自然语言处理算法中必须要得到的数据,因此,可以提前将所有词频统计出来,甚至还可以根据每一个文档统计词频,以备后续处理时使用。