NLP极简入门指南,助你经过面试,踏入NLP的大门

弱人工智能的时代已经到来,人们天天的生活都离不开算法所提供的服务。好比:资讯类APP是根据用户偏好作的个性化推荐;出行类APP背后是算法在作最优化调度;购物类APP是根据历史购买行为和商品间类似度进行推荐。这样的例子还有不少不少,就不一一列举了。python

可见算法对于一家互联网公司有多么的重要,而市场上优秀的算法工程师却很是稀少,所以各大互联网公司不惜开出高薪来吸引人才,同时算法工程师的职业生命周期还很长,对绝大多数的开发者来讲是一个很是理想的职业。linux

NLP的全称是Natuarl Language Processing,中文意思是天然语言处理,是人工智能领域的一个重要方向。随着机器学习不断的发展,在图像识别、语音识别等方向都取得了巨大的进步。相比较而言NLP却落后了一些,这与NLP所要解决问题的复杂度有关。git

人类语言是抽象的信息符号,其中蕴含着丰富的语义信息,人类能够很轻松地理解其中的含义。而计算机只能处理数值化的信息,没法直接理解人类语言,因此须要将人类语言进行数值化转换。不只如此,人类间的沟通交流是有上下文信息的,这对于计算机也是巨大的挑战。github

NLP就是解决上述问题的技术集合,不是某个单一的技术点,而是一整套技术体系,其复杂度可见一斑。所以,NLP算法工程师的薪资待遇要远高于行业的平均水平。正则表达式

本文但愿经过言简意赅的方式,帮助你们创建一个关于NLP的总体知识体系,方便你们快速入门NLP,争取早日成为大牛,走上人生巅峰,:-P算法

咱们首先来看看NLP的任务类型,以下图所示:json

主要划分为了四大类:windows

  • 类别到序列
  • 序列到类别
  • 同步的序列到序列
  • 异步的序列到序列

其中“类别”能够理解为是标签或者分类,而“序列”能够理解为是一段文本或者一个数组。简单概况NLP的任务就是从一种数据类型转换成另外一种数据类型的过程,这与绝大多数的机器学习模型相同或者相似,因此掌握了NLP的技术栈就等于掌握了机器学习的技术栈。数组

NLP的预处理

为了可以完成上述的NLP任务,咱们须要一些预处理,是NLP任务的基本流程。预处理包括:收集语料库、文本清洗、分词、去掉停用词(可选)、标准化和特征提取等。bash

图中红色的部分就是NLP任务的预处理流程,有别于其它机器学习任务的流程,下面我就来分布介绍一下:

语料库

对于NLP任务来讲,没有大量高质量的语料,就是巧妇难为无米之炊,是没法工做的。

而获取语料的途径有不少种,最多见的方式就是直接下载开源的语料库,如:维基百科的语料库

但这样开源的语料库通常都没法知足业务的个性化须要,因此就须要本身动手开发爬虫去抓取特定的内容,这也是一种获取语料库的途径。

固然,每家互联网公司根据自身的业务,也都会有大量的语料数据,如:用户评论、电子书、商品描述等等,都是很好的语料库。

如今,数据对于互联网公司来讲就是石油,其中蕴含着巨大的商业价值。因此,小伙伴们在平常工做中必定要养成收集数据的习惯,遇到好的语料库必定要记得备份(固然是在合理合法的条件下),它将会对你解决问题提供巨大的帮助。

文本清洗

咱们经过不一样的途径获取到了想要的语料库以后,接下来就须要对其进行清洗。由于不少的语料数据是没法直接使用的,其中包含了大量的无用符号、特殊的文本结构。

数据类型分为:

  • 结构化数据:关系型数据、json等
  • 半结构化数据:XML、HTML等
  • 非结构化数据:Word、PDF、文本、日志等

须要将原始的语料数据转化成易于处理的格式,通常在处理HTML、XML时,会使用Python的lxml库,功能很是丰富且易于使用。对一些日志或者纯文本的数据,咱们可使用正则表达式进行处理。

正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。Python的示例代码以下:

import re

# 定义中文字符的正则表达式
re_han_default = re.compile("([\u4E00-\u9FD5]+)", re.U)

sentence = "我/爱/自/然/语/言/处/理"

# 根据正则表达式进行切分
blocks= re_han_default.split(sentence)

for blk in blocks:
    # 校验单个字符是否符合正则表达式
    if blk and re_han_default.match(blk):
        print(blk)
复制代码

输出:

我
爱
自
然
语
言
处
理
复制代码

除了上述的内容以外,咱们还须要注意中文的编码问题,在windows平台下中文的默认编码是GBK(gb2312),而在linux平台下中文的默认编码是UTF-8。在执行NLP任务以前,咱们须要统一不一样来源语料的编码,避免各类莫名其妙的问题。

若是你们事前没法判断语料的编码,那么我推荐你们可使用Python的chardet库来检测编码,简单易用。既支持命令行:chardetect somefile,也支持代码开发。

分词

中文分词和英文分词有很大的不一样,英文是使用空格做为分隔符,因此英文分词基本没有什么难度。而中文是字与字直接链接,中间没有任何的分隔符,但中文是以“词”做为基本的语义单位,不少NLP任务的输入和输出都是“词”,因此中文分词的难度要远大于英文分词。

中文分词是一个比较大的课题,相关的知识点和技术栈很是丰富,能够说搞懂了中文分词就等于搞懂了大半个NLP。中文分词经历了20多年的发展,克服了重重困难,取得了巨大的进步,大致能够划分红两个阶段,以下图所示:

目前,主流的中文分词技术采用的都是基于词典最大几率路径+未登陆词识别(HMM)的方案,其中典型的表明就是jieba分词,一个热门的多语言中文分词包。

若是对中文分词感兴趣的朋友,想进一步详细了解,我推荐你看一看我写的一本掘金小册《深刻理解NLP的中文分词:从原理到实践》,里面详细地讲解了中文分词的各类实现方法,并深度分析了jiebe的Python源码,让你能够从零开始完全掌握中文分词的技术,同时也讲解了多种NLP的实际案例,相信你必定会收获不少。

标准化

标准化是为了给后续的处理提供一些必要的基础数据,包括:去掉停用词、词汇表、训练数据等等。

当咱们完成了分词以后,能够去掉停用词,如:“其中”、“何况”、“什么”等等,但这一步不是必须的,要根据实际业务进行选择,像关键词挖掘就须要去掉停用词,而像训练词向量就不须要。

词汇表是为语料库创建一个全部不重复词的列表,每一个词对应一个索引值,并索引值不能够改变。词汇表的最大做用就是能够将词转化成一个向量,即One-Hot编码。

假设咱们有这样一个词汇表:

我
爱
天然
语言
处理
复制代码

那么,咱们就能够获得以下的One-Hot编码:

我:  [1, 0, 0, 0, 0]
爱:  [0, 1, 0, 0, 0]
天然:[0, 0, 1, 0, 0]
语言:[0, 0, 0, 1, 0]
处理:[0, 0, 0, 0, 1]
复制代码

这样咱们就能够简单的将词转化成了计算机能够直接处理的数值化数据了。虽然One-Hot编码能够较好的完成部分NLP任务,但它的问题仍是很多的。

当词汇表的维度特别大的时候,就会致使通过One-Hot编码后的词向量很是稀疏,同时One-Hot编码也缺乏词的语义信息。因为这些问题,才有了后面大名鼎鼎的Word2vec,以及Word2vec的升级版BERT

除了词汇表以外,咱们在训练模型时,还须要提供训练数据。模型的学习能够大致分为两类:

  • 监督学习,在已知答案的标注数据集上,模型给出的预测结果尽量接近真实答案,适合预测任务
  • 非监督学习,学习没有标注的数据,是要揭示关于数据隐藏结构的一些规律,适合描述任务

根据不一样的学习任务,咱们须要提供不一样的标准化数据。通常状况下,标注数据的获取成本很是昂贵,非监督学习虽然不须要花费这样的成本,但在实际问题的解决上,主流的方式还选择监督学习,由于效果更好。

带标注的训练数据大概以下所示(情感分析的训练数据):

距离 川沙 公路 较近 公交 指示 蔡陆线 麻烦 建议 路线 房间 较为简单	__label__1
商务 大床 房 房间 很大 床有 2M 宽 总体 感受 经济 实惠 不错 !	__label__1
半夜 没 暖气 住 ! 	__label__0
复制代码

其中每一行就是一条训练样本,__label__0__label__1是分类信息,其他的部分就是分词后的文本数据。

特征提取

为了可以更好的训练模型,咱们须要将文本的原始特征转化成具体特征,转化的方式主要有两种:统计Embedding

原始特征:须要人类或者机器进行转化,如:文本、图像。

具体特征:已经被人类进行整理和分析,能够直接使用,如:物体的重要、大小。

统计

统计的方式主要是计算词的词频(TF)和逆向文件频率(IDF):

  • 词频,是指某一个给定的词在该文件中出现的频率,须要进行归一化,避免偏向长文本
  • 逆向文件频率,是一个词广泛重要性的度量,由总文件数目除以包含该词的文件数目

那么,每一个词都会获得一个TF-IDF值,用来衡量它的重要程度,计算公式以下:

其中TF的式子中n_{i,j}是该词在文件d_j中的出现次数,而分母则是在文件d_j中全部词的出现次数之和。

IDF的式子中|D|表示语料库中的文件总数,|\{j:t_{{i}}\in d_{{j}}\}|表示包含词 t_i的文件数目,而\lg是对结果作平滑处理。

Embedding

Embedding是将词嵌入到一个由神经网络的隐藏层权重构成的空间中,让语义相近的词在这个空间中距离也是相近的。Word2vec就是这个领域具备表达性的方法,大致的网络结构以下:

输入层是通过One-Hot编码的词,隐藏层是咱们想要获得的Embedding维度,而输出层是咱们基于语料的预测结果。不断迭代这个网络,使得预测结果与真实结果愈来愈接近,直到收敛,咱们就获得了词的Embedding编码,一个稠密的且包含语义信息的词向量,能够做为后续模型的输入。

综上所述,咱们就将NLP预处理的部分讲解清楚了,已经涵盖了大部分的NLP内容,接下来咱们来聊聊NLP的一些具体业务场景。

NLP的业务场景

NLP的业务场景很是丰富,我简单的梳理了一下:

  • 文本纠错:识别文本中的错别字,给出提示以及正确的建议
  • 情感倾向分析:对包含主观信息的文本进行情感倾向性判断
  • 评论观点抽取:分析评论关注点和观点,输出标签
  • 对话情绪识别:识别会话者所表现出的情绪类别及置信度
  • 文本标签:输出可以反映文章关键信息的多维度标签
  • 文章分类:输出文章的主题分类及对应的置信度
  • 新闻摘要:抽取关键信息并生成指定长度的新闻摘要

你们不要被这些眼花缭乱的业务场景给搞晕了,其实上面的这些业务都是基于咱们以前讲的NLP预处理的输出,只是应用了不一样的机器学习模型,好比:SVM、LSTM、LDA等等。

这些机器学习模型大部分是分类模型(序列标注也是一种分类模型),只有少部分是聚类模型。这些模型就是泛化的了,并不仅是针对于NLP任务的。要想讲清楚这部份内容,就须要另开一个关于“机器学习入门”的主题,这里就不过多的展开了。

小结:只要你们掌握了NLP的预处理,就算入门NLP了,由于后续的处理都是一些常见的机器学习模型和方法。

结束语

NLP是一个很是有挑战性的工做,同时也是一个很是有发展空间的工做,因此你们只要克服了前期的入门门槛,那么迎接你的将是一片广阔的天地。道阻且长,行则将至。

最后,仍是要安利一下我写的掘金小册《深刻理解NLP的中文分词:从原理到实践》,它将系统的帮助你学习NLP的中文分词的相关知识,而中文分词对于NLP的重要意义,经过本文你们也应该十分清楚了。掌握中文分词的技术,不只对于提升NLP任务的结果质量有很大的帮助,同时对于理解机器学习也有很大的促进做用。

若是你以为以上内容对你有所帮助,但愿素质三连:点赞、转发、评论,也但愿你们多多支持个人掘金小册,多谢多谢!

相关文章
相关标签/搜索