当前位置: 首页 > 科技观察

NLP极简指南,助你通过面试,步入NLP大门

时间:2023-03-16 22:40:56 科技观察

弱人工智能时代已经到来,人们的日常生活离不开算法提供的服务。例如,信息应用程序根据用户偏好进行个性化推荐;旅游应用程序通过算法进行优化;购物应用程序根据历史购买行为和产品相似性提出建议。这样的例子还有很多,就不一一列举了。可见算法对于一家互联网公司的重要性,但是市场上优秀的算法工程师少之又少,所以各大互联网公司不惜高薪招揽人才。同时,算法工程师的职业生命周期还很长。对于开发者来说是一个非常理想的职业。NLP的全称是NatuarlLanguageProcessing,中文意思是自然语言处理,是人工智能领域的一个重要方向。随着机器学习的不断发展,图像识别、语音识别等方向都取得了长足的进步。相比较而言,NLP有点落后,这与NLP要解决的问题的复杂程度有关。人类语言是一种抽象的信息符号,包含着丰富的语义信息,人类很容易理解其中的含义。但是,计算机只能处理数值信息,不能直接理解人类语言,因此需要将人类语言进行数值转换。不仅如此,人与人之间的交流都有上下文信息,这对计算机来说也是一个巨大的挑战。NLP是解决上述问题的技术集合。它不是单一的技术点,而是一套完整的技术体系,其复杂性可见一斑。因此,NLP算法工程师的薪酬远高于行业平均水平。本文希望通过简洁明了的方式,帮助大家建立一个关于NLP的整体知识体系,让大家快速上手NLP,争取早日成为大牛,走上人生巅峰,:-P.我们先来看看NLP任务的类型,如下图:主要分为四类:类别到序列sequence-to-category同步sequence-to-sequence异步sequence-to-sequence其中“类别”可以理解为标签或分类,而“序列”可以理解为一段文字或数组。简要概述NLP的任务是从一种数据类型转换为另一种数据类型的过程,这与大多数机器学习模型相同或相似,因此掌握了NLP的技术栈就相当于掌握了机器学习的技术栈。NLP预处理为了能够完成以上NLP任务,我们需要进行一些预处理,这是NLP任务的基本流程。预处理包括:收集语料、文本清洗、分词、去除停用词(可选)、标准化和特征提取等。图中红色部分是NLP任务的预处理过程,不同于其他机器学习任务的过程。下面介绍一下分布:对于NLP任务,语料库中并没有大量的高质量语料,不管用。语料库的获取方式有很多种,最常见的方式是直接下载开源语料库,例如:维基百科语料库。但是这样的开源语料库一般不能满足业务的个性化需求,所以需要自己开发爬虫来抓取特定的内容,这也是获取语料库的一种方式。当然,每个互联网公司也会根据自己的业务,拥有大量的语料数据,比如用户评论、电子书、产品描述等,都是不错的语料。现在,数据对于互联网企业来说就是石油,蕴含着巨大的商业价值。所以小伙伴们在日常工作中一定要养成收集数据的习惯。遇到好的语料库,一定要记得备份(当然是在合理合法的条件下)。它将为您解决问题提供很大的帮助。文本清洗当我们通过不同的渠道得到了想要的语料后,接下来就需要对其进行清洗。因为很多语料数据不能直接使用,其中包含大量无用的符号和特殊的文本结构。数据类型分为:结构化数据:关系型数据、json等半结构化数据:XML、HTML等非结构化数据:Word、PDF、文本、日志等。-to-handleformat,一般在处理HTML和XML时,都会用到Python的lxml库,功能非常丰富,使用也很方便。对于一些日志或者纯文本数据,我们可以使用正则表达式进行处理。正则表达式使用单个字符串来描述和匹配一系列满足一定语法规则的字符串。Python示例代码如下:importre#定义汉字正则表达式re_han_default=re.compile("([\\u4E00-\\u9FD5]+)",re.U)sentence="I/love/natural/natural/language/language/processing/processing"#根据正则表达式分词blocks=re_han_default.split(sentence)forblkinblocks:#检查单个字符是否符合正则表达式ifblkandre_han_default.match(blk):print(blk)output:Ilovenaturallanguageprocessing复制代码除了上面的内容,我们还需要注意中文的编码。windows平台下中文默认编码为GBK(gb2312),而linux平台下中文默认编码为UTF-8。在执行NLP任务之前,我们需要对不同来源的语料库进行统一编码,避免出现各种莫名其妙的问题。如果你不能提前判断语料的编码,那我推荐你使用Python的chardet库来检测编码,简单易用。它同时支持命令行:chardetectsomefile和代码开发。分词中文分词与英文分词有很大的不同。英语以空格作为分隔符,所以英语分词基本不难。在汉语中,词之间是直接相连的,中间没有任何分隔符,但汉语以“词”为基本语义单位。很多NLP任务的输入输出都是“词”,所以中文分词的难度要比英文分词大很多。中文分词是一个比较大的课题,相关的知识点和技术栈都非常丰富。可以说,理解了中文分词,就相当于理解了一半的NLP。经过20多年的发展,中文分词克服了重重困难,取得了长足的进步。大致可以分为两个阶段,如下图所示:目前主流的中文分词技术是基于字典最大概率路径+未注册词识别(HMM)方案,典型代表是jieba分词,a流行的多语言中文分词包。如果你对中文分词感兴趣,想深入了解,推荐你看看我写的一本金块小册子《深入理解NLP的中文分词:从原理到实践》,里面详细解释了中文分词的各种实现方法,分析深入Jiebe的Python源码,让你从零开始彻底掌握中文分词技术。它还解释了NLP的各种实际案例。相信你会收获很多。标准化标准化就是为后续处理提供一些必要的基础数据,包括:去除停用词、词汇、训练数据等。我们分词完成后,我们可以去除停用词,比如:“where”、“besides”,"what"等等,但这一步不是必须的。需要根据实际业务来选择,比如关键词挖掘,需要去掉Stopwords,而不需要训练词向量。词汇表是为语料库创建所有唯一词的列表,每个词对应一个索引值,索引值不能改变。词汇表最大的作用就是可以将词转化为向量,即One-Hotencoding。假设我们有这样一个词汇表:Ilovenaturallanguageprocessingcopycode那么,我们可以得到如下的One-Hot编码:I:[1,0,0,0,0]Love:[0,1,0,0,0]Natural:[0,0,1,0,0]Language:[0,0,0,1,0]Processing:[0,0,0,0,1]所以我们可以简单的把词转换成可以直接由计算机处理的数值数据。虽然One-Hotcoding可以更好的完成一些NLP任务,但是它仍然存在很多问题。当词表的维度特别大时,One-Hot编码后的词向量会非常稀疏,One-Hot编码也缺少词的语义信息。因为这些问题,才有了大名鼎鼎的Word2vec和Word2vec的升级版BERT。除了词汇表,我们在训练模型的时候,还需要提供训练数据。模型的学习大致可以分为两类:监督学习。在已知答案的标注数据集上,模型给出的预测结果尽可能接近真实答案。适用于预测任务的无监督学习。学习无标签数据是为了揭示数据隐藏结构的一些规律,适用于描述任务根据不同的学习任务,我们需要提供不同的标准化数据。通常,获取标记数据的成本非常昂贵。虽然无监督学习不需要这样的代价,但是在解决实际问题上,主流方法还是选择有监督学习,因为效果更好。标注的训练数据大致如下(情感分析训练数据):靠近川沙公路。公交车提示彩路线麻烦。建议的路线比较简单。物有所值!__label__1半夜不供暖!每行__label__0为训练样本,__label__0和__label__1为分类信息,其余为分词后的文本数据。特征提取为了更好地训练模型,我们需要将文本的原始特征转化为特定的特征。主要有两种转换方法:统计和嵌入。原始特征:需要人工或机器转换的,如:文字、图片。具体特征:经过人工整理分析,可直接使用,如:对象的重要性、大小等。统计的方式主要是计算词的词频(TF)和反向文档频率(IDF):词频是指给定的词在文件中出现的频率,需要归一化以避免长文本反向文档频率是衡量一个词的普遍重要性的指标。它除以文档总数除以包含该词的文档数。然后,每个单词都会得到一个TF-IDF值来衡量其重要性。计算公式如下:EmbeddingEmbedding是将词嵌入到一个由神经网络隐含层权重组成的空间中,使得语义相近的词在这个空间中也很接近。Word2vec是该领域的一种表达方法。一般的网络结构如下:输入层是One-Hot编码的词,隐藏层是我们想要得到的embedding维度,输出层是基于语料库的预测结果。不断迭代网络,使预测结果更接近真实结果,直至收敛,得到词的嵌入码,即包含语义信息的稠密词向量,可作为后续模型的输入。综上所述,我们已经把NLP预处理的部分讲解清楚了,已经涵盖了大部分的NLP内容。接下来说说NLP的一些具体业务场景。NLP业务场景NLP业务场景非常丰富,我简单梳理一下:文本纠错:识别文本中的错别字,给出提示和纠正建议情感分析:判断包含主观信息的文本的情感取向评论意见抽取:分析评论关注点和意见,输出标签对话情绪识别:识别对话者表现出的情绪类别和置信度文本标签:输出能够反映文章关键信息的多维标签文章分类:输出文章的主题分类以及相应的置信度新闻摘要:提取关键信息,生成指定长度的新闻摘要。不要被这些眼花缭乱的业务场景所迷惑。其实上面的服务都是基于我们之前讲的NLP预处理的输出。应用了不同的机器学习模型,如:SVM、LSTM、LDA等。这些机器学习模型大部分是分类模型(序列标注也是一种分类模型),只有少数是聚类模型。这些模型是通用的,不仅适用于NLP任务。要把这部分内容说清楚,需要另开一个专题《机器学习概论》,这里就不展开太多了。总结:只要掌握了NLP的预处理,你甚至可以入门NLP,因为后面的处理就是一些常见的机器学习模型和方法。