自然语言理解_NLP:NLP

1.走近自然语言理解

文本是一种极其重要的数据类型,下面介绍文本数据中有哪些研究问题和挖掘价值。

1.1概念

在处理数据时经常会接触到文本,如电影简介、新闻报道等,以及互联网上每天大量积累的用户产生内容,如新浪微博、用户评论等,因此文本是一种十分常见和重要的数据类型。这些文本大多以自然语言的形式存在,即通过人类语言组织和产生,广泛应用于我们的日常对话、办公写作、阅读浏览等行为中。自然语言处理希望让机器能够像人一样去理解以人类自然语言为载体的文本所包含的信息,并完成一些语言领域的特定任务。

1.2内容

语言是人类智慧长期沉淀的成果,对于看似简单的文本,从词汇级别、语法级别、语义级别、应用级别等不同角度出发,都包含大量研究问题和工作内容。

中文NLP中最基础的一块内容便是中文分词。英文等外文语言的单词之间以空格分开,因此显式提供了词和词之间的边界。而中文仅使用标点符号进行断句,字和字之间彼此相连,例如“上海自来水来自海上”。虽然类似N-grams等语言模型并不需要进行中文分词,但毕竟中文的基本语义单元是词而不是字,所以在大多数应用场景下,为了正确理解一句话包含的语义,进行准确的中文分词仍是必不可少的预处理步骤。

词性标注是指在中文分词的基础上,结合上下文对分好的每个词标注最合适的词性。常见的词性有名词、动词、形容词、副词等,同一词语在不同的语境下可以表现为不同的词性,进而在语句中充当不同的语义角色。因此,词性标注主要是依据词本身的词性分布,以及上下文的实际语境来判断的。

命名实体识别是指识别出语句中的人名、地名、机构名、数字、日期、货币、地址等以名称为标识的实体,大多属于实词。而关系抽取则是指完成命名实体识别之后,抽取实体之间存在的关系。例如,“乔布斯出任苹果公司CEO”,其中乔布斯和苹果公司分别属于人名和机构名,而CEO则是两个命名实体之间的关系。

关键词提取是指从大量文本中提取出最为核心、最具有代表性的关键词。常用的实现算法有TF-IDF和TextRank两种,在提取之前需要对给定文本进行中文分词并移除停用词,即例如,“你”“我”“着”“了”等十分常用但不包含具体语义的词。TF-IDF选出那些一般并不常用,但是在给定文本中频繁出现的词作为关键词;而TextRank则基于词之间的上下文关系构建共现网络,将处于网络核心位置的词作为关键词。

信息抽取是从非结构化文本中抽取出有意义或者感兴趣的字段。例如,对于一篇法律判决文书,从中提取出原告、被告、案件类型、判决结果等信息字段,从而将非结构化文本转化为结构化数据,便于信息管理和数据分析。目前大多数信息抽取都是通过人工制定规则,使用整理好的模式去目标文本中匹配出相应的字段,或者使用半监督学习,结合人工标注样本和机器学习模型,在不断的迭代和反馈中提高信息抽取的准确率。

依存分析主要包括句法依存分析和语义依存分析,其过程都是将原始语句解析为依存树,树中的每个节点都代表一个词,节点之间的连接则反应了词之间的句法关系或语义关系。通过依存分析,原本以顺序排列的词语之间产生了更加复杂和层次化的关系,便于机器更好地理解语句的语法和语义,从而能够为后续自然语言处理任务带来帮助。

词嵌入是指将词映射成低维、实值、稠密的词向量,从而赋予词语更加丰富的语义涵义,同时更加适合作为机器学习等模型的输入。词嵌入的概念非常有用,在自然语言处理任务中应用也十分广泛。

1.3应用

如果以上内容是从理论角度出发探讨NLP涉及的内容,那么从实际应用角度出发,NLP又可以用来实现哪些任务呢?

篇章理解是指对于给定的文章集合,通过处理后能够把握文章的主要内容并完成一些分类任务,如对文章进行主题分类。篇章理解的实现大多基于有监督学习,即提供标注好的训练集和待测试的测试集,基于训练集得到一个能够准确提取信息、全面把握内容的分类模型,从而应用于测试集的分类任务。

文本摘要是指对于给定的大量文本,提取出核心思想和主要内容,快速生成篇幅更小、便于阅读和理解的摘要。文本摘要主要分为提取式和生成式两种,前者从原始文本中直接提取出已有的代表性语句,经过处理和组合后输出为摘要,后者在理解和融合原始文本的基础上,自动生成原始文本中没有的语句并组合为摘要。相较而言,生成式比抽取式更加困难,而人类的习惯也是先阅读并理解,选出重要的语句,再用自己的语言进行复述、总结和融合。

情感分析是指根据语句中蕴含的情感成分判断整个语句表达的情感倾向,例如,判断用户评论是否为积极或消极。情感分析的实现可以是简单地使用一些情感词典,对语句中出现的情感词进行加权组合,从而输出整个语句的情感得分,也可以使用有监督学习,基于人工标注数据训练情感分类或回归模型。

知识图谱是一种表示知识的方法,使用节点表示实体,使用有向边表示实体之间的关系,实体和边都可以具备丰富的属性,从而将海量知识表示成一个庞大的网络。知识图谱模拟了人脑管理和检索知识的过程,当我们看到乔布斯和苹果公司这两个实体时,会很自然地联想两者之间的关系。如果能够将某一领域涉及的知识都以知识图谱的形式进行整理和组织,那么对于领域知识的管理、推理和检索等都能起到很大的便利。

文本翻译是一项十分常用的NLP应用,大家都或多或少使用过Google翻译等工具将文本从一种语言翻译成另一种语言。从本质上来看,文本翻译是一种序列到序列的映射,其实现大多是基于人工标注数据集,即大量源语言文本以及对应的目标语言文本,使用循环神经网络等深度学习网络训练映射模型。当然,不能简单地将源语言文本中的每个字翻译成目标语言并直接拼接,而是需要结合两种语言的语法特点以及具体的上下文语境进行调整,而这也正是文本翻译面临的最大困难和挑战。

问答系统是对传统搜索引擎的一种改进。传统搜索引擎接受用户的关键词作为输入,以列表形式输出按相关性递减排序的搜索结果,用户仍然需要依次浏览,直到找到最符合自己要求的内容。问答系统则直接根据用户问题返回最准确的答案,其实现涉及NLP的诸多领域,例如,对用户输入内容进行理解和处理、以庞大的知识图谱作为知识存储、快速高效的知识检索和推理技术等。

聊天机器人很早便得到了应用,完成一些自动信息采集和回复的功能,但那时的聊天机器人主要基于关键词和模板等人工制定规则,智能程度不高。近年来随着深度学习等相关技术的发展,以及海量聊天语料的积累,聊天机器人逐渐可以接受任意文本输入并输出较为合理的回复。从本质上来看,聊天机器人也属于序列到序列的映射,但其涉及对用户输入文本的理解、知识图谱、文本生成等多个领域,并且需要解决多轮对话一致性等挑战。智能聊天机器人主要包括日常调侃的聊天机器人,如微软小冰等,以及垂直领域的功能机器人,如法律、购车、医疗等领域的专业咨询机器人。它们作为用户需求的万能入口,吸引了大量研究机构和创业公司的密切关注。

2.使用jieba分词处理中文

我们对NLP是什么和做什么,以及和NLP领域相关的内容和应用有了大致的概览,现在通过Python中的jieba来部分实现中文分词。

2.1jieba中文分词

中文分词是中文NLP的第一步,一个优秀的分词系统取决于足够的语料和完善的模型,很多机构和公司也都会开发和维护自己的分词系统。这里推荐的是一款完全开源、简单易用的分词工具,jieba中文分词。官网是里面提供了详细的说明文档。虽然jieba分词的性能并不是最优秀的,但它开源免费、使用简单、功能丰富,并且支持多种编程语言实现。

以下使用Python中的jieba分词完成一些基础的NLP任务,如果对jieba分词感兴趣,希望了解更多内容,可以参考官方使用文档。

首先没有jieba分词的话需要安装,使用pip即可安装。

pipinstalljieba

2.2中文分词

中文分词的模型实现主要分为两大类:基于规则和基于统计。

基于规则是指根据一个已有的词典,采用前向最大匹配、后向最大匹配、双向最大匹配等人工设定的规则来进行分词。例如对于“上海自来水来自海上”这句话,使用前向最大匹配,即从前向后扫描,使分出来的词存在于词典中并且尽可能长,则可以得到“上海/自来水/来自/海上”。这类方法思想简单且易于实现,对数据量的要求也不高。当然,分词使用的规则可以设计得更复杂,从而使分词效果更理想。但是由于中文博大精深、语法千变万化,很难设计足够全面而且通用的规则,并且具体的上下文语境、词语之间的搭配组合也都会影响到最终的分词结果,这些挑战都使得基于规则的分词模型并不能很好地满足需求。

基于统计是从大量人工标注语料中总结词的概率分布以及词之间的常用搭配,使用有监督学习训练分词模型。对于“上海自来水来自海上”这句话,一个最简单的统计分词想法是,尝试所有可能的分词方案,因为任何两个字之间,要么需要切分,要么无需切分。对于全部可能的分词方案,根据语料统计每种方案出现的概率,然后保留概率最大的一种。很显然,“上海/自来水/来自/海上”的出现概率比“上海自/来水/来自/海上”更高,因为“上海”和“自来水”在标注语料中出现的次数比“上海自”和“来水”更多。

其他常用的基于统计的分词模型还有HMM和CRF等,以及将中文分词视为序列标注问题,进而使用有监督学习、深度神经网络等模型进行中文分词。

jieba分词结合了基于规则和基于统计两类方法。首先基于前缀词典进行词图扫描,前缀词典是指词典中的词按照前缀包含的顺序排列,例如词典中出现了“上”,之后以“上”开头的词都会出现在这一块,例如“上海”,进而会出现“上海市”,从而形成一种层级包含结构。如果将词看作节点,词和词之间的分词符看作边,那么一种分词方案则对应从第一个字到最后一个字的一条分词路径。因此,基于前缀词典可以快速构建包含全部可能分词结果的有向无环图,这个图中包含多条分词路径,有向是指全部的路径都始于第一个字、止于最后一个字,无环是指节点之间不构成闭环。基于标注语料,使用动态规划的方法可以找出最大概率路径,并将其作为最终的分词结果。

jieba提供了3种分词模式。

·精确模式:试图将句子最精确地切开,适合文本分析。·全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。

·搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

以下代码使用jieba实现中文分词,使用jieba.cut()函数并传入待分词的文本字符串即可。使用cut_all参数控制选择使用全模式还是精确模式,默认为精确模式。如果需要使用搜索引擎模式,使用jieba.cut_for_search()函数即可。运行以下代码之后,jieba首先会加载自带的前缀词典,然后完成相应的分词任务。

importjieba

seg_list=jieba.cut("我来到清华大学",cut_all=True)

Billions项目组即使用一个拼接符将一个列表拼成字符串

print("/".join(seg_list))Billions项目组精确模式

seg_list=jieba.cut("他来到了网易杭研大厦")Billions项目组搜索引擎模式

print("/".join(seg_list))

2.3关键词提取

jieba实现了TF-IDF和TextRank这两种关键词提取算法,直接调用即可。当然,提取关键词的前提是中文分词,所以这里也会使用到jieba自带的前缀词典和IDF权重词典。

对于提取的关键词以及权重,将每个关键词的权重作为文字大小,便可以进行字符云可视化。

2.4词性标注

jieba在进行中文分词的同时,还可以完成词性标注任务。根据分词结果中每个词的词性,可以初步实现命名实体识别,即将标注为nr的词视为人名,将标注为ns的词视为地名等。所有标点符号都会被标注为x,因此可以根据这个方法去除分词结果中的标点符号。

3.词嵌入的概念和实现

词嵌入是一项非常重要且应用广泛的技术,可以将文本和词语转换为机器能够接受的数值向量,这里详细讨论其概念和实现。

3.1语言的表示

如何向计算机解释一个词语的意思?或者说如何表示一个词语才能恰当地体现出其包含的语义?看到“苹果”这个词时,我们会联想起可以吃的苹果这一水果,还会联想起乔布斯创建的苹果公司,因此一个词可以包含多重语义。如果让计算机分析“苹果”和“梨子”两个词之间的相关性,通过字符串匹配只能得到完全不相等的结论,但是我们知道它们都属于水果,因此词语所蕴含的语义实际上非常复杂,无法通过简单的字符串表示。

语言的表示主要有两种:符号主义和分布式表示。

符号主义

符号主义中典型的代表是Bagofwords,即词袋模型。如果将语料词典中的每个词都看作一个袋子,那么一句话无非是选择一些袋子,然后将出现的词丢入相应的袋子。用数学的语言来说,假设词典中一共有N个词,就可以用N个N维向量来表示每个词。以下是用Python描述的一个简单例子,这里的词典中只有5个词:苹果、梨子、香蕉、和、好吃,分别用一个五维向量表示,仅对应的维度上为1,其他维度都为0。基于词袋模型可以方便地用一个N维向量表示任何一句话,每个维度的值即对应的词出现的次数。

词袋模型虽然简单,但其缺点也十分显著。主要有以下几点。

·当词典中词的数量增大时,向量的维度将随之增大。虽然常用的汉字只有几千个,但是依然会给计算带来很大的不便。

·无论是词还是句子的表示,向量都过于稀疏,除了少数维度之外的大多数维度都为0。

·每个词对应的向量在空间上都两两正交,任意一对向量之间的内积等数值特征都为0,无法表达词语之间的语义关联和差异。

·句子的向量表示丢失了词序特征,即“我很不高兴”和“不我很高兴”对应的向量相同,而这显然是不符合语义的。

分布式表示

分布式表示中典型的代表是WordEmbedding,即词嵌入,使用低维、稠密、实值的词向量来表示每一个词,从而赋予词语丰富的语义含义,并使得计算词语相关度成为可能。以最简单的情况为例,如果使用二维向量来表示词语,那么可以将每个词看作平面上的一个点,点的位置即横纵坐标由对应的二维向量确定,可以是任意且连续的。如果希望点的位置中蕴含词的语义,那么平面上位置相邻的点应当具有相关或相似的语义。用数学的语言来说,两个词具有语义相关或相似,则它们对应的词向量之间距离相近,度量向量之间的距离可以使用经典的欧拉距离和余弦相似度等。

词嵌入可以将词典中的每个词映射成对应的词向量,一个好的词嵌入模型应当满足以下两方面要求。

·相关:语义相关或相似的词语,它们对应的词向量之间距离相近,例如“苹果”和“梨子”的词向量距离相近。

·类比:具有类比关系的4个词语,例如,男人对于女人,类比国王对于王后,满足男人-女人=国王-王后,即保持词向量之间的关联类比,其中的减号表示两个词向量之间求差。

这样一来,通过词嵌入模型得到的词向量中既包含了词本身的语义,又蕴含了词之间的关联,同时具备低维、稠密、实值等优点,可以直接输入计算机并进行后续分析。但词典中的词如此之多,词本身的语义便十分丰富,词之间的关联则更为复杂,所以相对于词袋模型,训练一个足够好的词向量模型更加困难。

3.2训练词向量

词向量的训练主要是基于无监督学习,从大量文本语料中学习出每个词的最佳词向量,如维基百科、大量新闻报道等。训练的核心思想是,语义相关或相似的词语,大多具有相似的上下文,即它们经常在相似的语境中出现,例如,“苹果”和“梨子”的上下文中可能都会出现类似“吃”“水果”等词语,可以使用“开心”的语境一般也能使用“高兴”。

词嵌入模型中的典型代表是Word2Vec,模型实现原理可以参考Mikolov的两篇文章,,主要包括CBOW和Skip-Gram两个模型,前者根据上下文预测对应的当前词语,后者根据当前词语预测相应的上下文。如果希望进一步深入理解词嵌入模型训练的原理和细节,可以仔细研读以上两篇文章。如果仅需要应用词嵌入模型,则直接了解如何用代码实现即可。

3.3代码实现

gensim是一款开源的Python工具包,用于从非结构化文本中无监督地学习文本隐层的主题向量表示,支持包括TF-IDF、LSA、LDA和Word2Vec在内的多种主题模型算法,并提供了诸如相似度计算、信息检索等常用任务的API接口。gensim官网对于其中Word2Vec模型的介绍为里面提供了和Word2Vec相关的完整使用文档。首先如果没有gensim的话,使用pip即可安装。

pipinstallgensim

另外,gensim仅提供了Word2Vec的模型实现,训练词向量的另一个必须条件是足够大的文本语料。这里将要使用的是中文维基百科语料,已经整理成文本文件并放在网盘上,直接下载使用即可,提取密码为kade。

下载之后,可以在SublimeText中打开并查看其内容,文件名和后缀名可以不用在意,因为SublimeText支持打开任意类型的文本文件。其中每一行是一条维基百科,即一项词条对应的百科内容,并且已经完成了分词处理。

以下代码使用gensim提供的Word2Vec模型训练并使用词向量,主要包括加载包、训练模型、保存模型、加载模型、使用模型等步骤。

除此之外,gensim中的Word2Vec还实现了多项NLP功能,例如,从多个词中找出和其他词相关性相对更弱的一个,以及根据给定的3个词类比推理出第4个词等,详细使用方法可以参考官方完整文档。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金宝趣谈

[0:15ms0-3:652ms