自然语言处理管道
1 引言
自然语言处理发展至今,应用非常广泛,例如机器翻译,会议语音分析,舆情监控等。我现在马上结束我的读书生涯,我们在学校里学习的主要是如何发表论文保证毕业或者去更高的平台读博。我时常问自己,如果我要做一个自然语言处理的工业级应用(先不谈能否商业化),我该从何下手,或者说有没有方法论来指导。
最近在收集这方面的资料,遂记录于此。
如果老板(特指我硕导,哈哈哈)要求我们构建一个自然语言处理的应用程序,我们将如何实现呢?常规的操作就是我们会做需求分析,将问题分解为几个子问题,然后尝试开发一个循序渐进的程序来解决它们,最后不断的迭代升级。前面说的话都是空话,就跟没说一样。现在,整理我看过的资料,对上面这个常规操作进行细化,总结出在开发NLP应用时的基本步骤,这些步骤我在这里称之为管道。
在这个管道中,关键的组件有:
- 数据采集
- 文本提取和清洗
- 预处理
- 特征工程
- 建模
- 评估
- 部署
- 模型监控和模型更新
下面就对上面这些组件进行简要的阐述。
2 数据采集
开发任何NLP应用的第一步永远是数据的采集。我们可以认为自然语言处理应用是数据驱动的应用,这是没有问题的。数据的采集方式主要有以下几种:
2.1 使用公开的数据集
首先,我会使用百度或谷歌搜索有没有与我的应用相关的公开数据集,如果有的话就万事大吉,没有的话你也不要灰心,还有其它方法供你选择。
2.2 使用爬虫爬取数据
使用爬虫爬取数据也是常见的一种采集数据的办法,前提是你得遵守相关法律法规。
2.3 产品的干预
在大多数工业环境中,AI模型很少单独存在。它们的开发主要是通过功能或产品来服务用户。在所有这些情况下,AI团队应该与产品团队合作,通过在产品中开发更好的工具来收集更多更丰富的数据。在科技界,这被称为产品干预(product intervention)。
产品干预通常是收集数据的最佳方式,用于在工业环境中构建智能应用程序。像谷歌,Facebook、微软等公司很早就知道这一点,并试图从尽可能多的用户那里收集尽可能多的数据。
2.4 数据增强
虽然对产品进行干预是收集数据的一种很好的方式,但它需要时间。即使您现在使用该产品,也可能需要三到六个月的时间来收集一个适当大小的、全面的数据集。在此期间我们能做点什么吗?NLP有一堆技术,通过它我们可以采取一个小数据集,并使用一些技巧来创建更多的数据。这些技巧也称为数据增强,它们试图利用语言属性来创建在语法上类似于源文本数据的文本。让我们来看看其中的一些:
2.4.1 同义词替换
在一个句子中随机选择 k k k个词。用它们的同义词替换这些词。
2.4.2 反向翻译
我们在写论文降重时经常用到这个技巧,就是将中文翻译成英文,然后将英文有翻译成中文,这样就将重降下来了。使用这个技巧可以扩充我们的数据集。
2.4.3 基于TF-IDF的词替换
反向翻译可能会丢失对句子至关重要的某些单词。你可以使用TF-IDF识别关键词,然后替换它。
2.4.4 替换实体
你可以将句子中的实体识别出来,然后用其它实体替换。例如你在一句话中识别出了“贵州大学”这个实体,你可以用“云南大学”替换“贵州大学”。
2.4.5 向数据中添加噪音
在许多NLP应用程序中,传入的数据包含拼写错误。这主要是由于生成数据的平台的特征(例如微博的用户是随手发消息)。在这种情况下,我们可以向数据中添加一些噪声来训练鲁棒模型。例如,在一个句子中随机选择一个单词,并用另一个拼写接近它的单词替换它。
2.4.6 其它
还有其他一些先进的技术和系统可以增强文本数据。其中一些值得注意的是:主动学习,众包。别人设计的用于数据增强的工具可以在github上找到,这里就不啰嗦了。
2.5 文本提取和清洗
文本提取和清洗是指通过删除所有其他非文本信息(如标记、元标点符号,数据等),并将文本转换为所需的编码格式,从输入数据中提取原始文本的过程。通常,这取决于可用数据的格式(例如,来自PDF、HTML或文本的静态数据,某些形式的连续数据流,等等)。当然了,你可能需要从图片中获取文本数据,这属于OCR技术的范畴,目前国内开源最好的工具是百度的paddlepaddleOCR项目,感兴趣的读者可以去把玩一下。
文本提取是一个标准的数据处理步骤,在这个过程中我们通常不使用任何nlp特有的技术,例如使用正则表达式即可。然而,根据我们的经验,这是一个重要的步骤,对NLP管道的所有其他方面都有影响。此外,它也可能是项目中最耗时的部分。
文本提取没什么好说的,本文主要说一下文本清洗。
2.5.1 字符编码规范化
数据中可能存在很多中不同的字符编码,这时你要将他们的字符编码统一起来。
2.5.2 拼写校对
主要是纠正数据中的一些拼写错误,注意,这与前面的数据采集中的添加噪音有点区别。
3 预处理
让我们从一个简单的问题开始:我们已经在前面的步骤中做了一些清理工作;为什么我们还要对文本进行预处理?考虑这样一个场景:我们正在处理维基百科上关于个人的页面文本,以提取他们的生平信息。我们的数据采集从抓取这些页面开始。然而,我们抓取的数据都是HTML格式的,还有很多来自维基百科的样板文件(例如,左边面板中的所有链接),可能存在到多种语言的链接(在它们的脚本中),等等。所有这些信息都与从文本中提取特征无关(在大多数情况下)。我们的文本提取步骤删除了所有这些内容,并为我们提供了所需的文章的纯文本。然而,所有的自然语言处理软件通常都是在句子水平上工作的,并且至少期望单词的分离(例如中文就需要先分好词)。因此,在继续在处理管道中处理之前,我们需要某种方法将文本拆分为单词和句子。有时,我们需要删除特殊字符和数字,有时,我们不关心一个单词是大写还是小写,并希望所有单词都小写。在处理文本时,还会做出更多类似的决定。这些决定是在NLP管道的预处理步骤中处理的。以下是一些常用的NLP软件预处理步骤:
3.1 预热
分句和分词。
3.2 高频处理步骤
主要有:删除停用词、词干提取和词形还原、删除数字/标点符号、将字母小写等。
3.2 其它步骤
标准化、语言检测等。
3.2.1 文本标准化
考虑这样一个场景,我们正在处理一组社交媒体帖子来检测新闻事件。社交媒体上的文本与我们在报纸上看到的语言非常不同。一个单词有不同的拼写方式,包括缩写形式,电话号码有不同的写法(比如带连字符或不带连字符),名字有时也要小写,等等。当我们在开发处理这些数据的NLP工具时,得到一个规范的文本表示形式,将所有这些变化捕捉到一个表示形式中是很有用的。这就是所谓的文本规范化。文本规范化的一些常见步骤是将所有文本转换为小写或大写,将数字转换为文本(例如,一到九),扩展缩写,等等。
3.2.2 语言检测
很多网页内容都是非英语的。例如,假设我们被要求在网上收集关于我们产品的所有评论。当我们浏览不同的电子商务网站并开始抓取与我们的产品相关的页面时,我们注意到几个非英语评论显示出来。由于大多数管道是使用特定于语言的工具构建的,那么我们的NLP管道,哪个是期待英语文本?在这种情况下,语言检测是NLP管道中的第一步。
3.3 高级处理步骤
词性标注、句法分析、共指消解等。
4 特征工程
特征工程这步要分两种情况来考虑。第一种是假设你使用的是机器学习技术来建模,例如朴素贝叶斯,那么你的特征基本上是手工构建,这方面论文比较多就不详细阐述。另一种是假设你使用的是深度学习技术来建模,那么特征是由神经网络学出来的(例如词向量表示学习),这部分论文也比较多,这里不详细阐述。
5 建模
我们现在有了一些与我们的NLP项目相关的数据,并且清楚地知道需要做什么样的清理和预处理,以及需要提取哪些特征。下一步是关于如何在此基础上构建有用的解决方案。一开始,当我们的数据有限时,我们可以使用更简单的方法和规则。随着时间的推移,有了更多的数据和对问题的更好理解,我们可以增加更多的复杂性并提高性能。
这方面的知识,有许多论文和博客供你参考。这方面讲起来完全可以开一门研究生的课程,这里就不详细阐述了。
6 评估
&emsp这里主要是根据你的应用设置一些评价指标来评价模型的好坏;不同的应用评价指标不同,这里也不做过多的解释。
7 部署
我们的应用往往是部署在服务器上的,根据你使用的技术部署稍微不同,例如机器学习的模型和深度学习的模型部署是不一样的,这里主要看你用的是什么方式保存你的模型。如果你用的是tensorflow,你可以使用谷歌提供的一些列部署技术来部署你的模型。
8 模型监控与更新
与任何软件工程项目一样,在最终部署之前必须进行大量的软件测试,并且在部署后不断监控模型性能。对NLP项目和模型的监控必须以不同于常规工程项目的方式处理,因为我们需要确保我们的模型每天产生的输出是有意义的。如果我们频繁地自动训练模型,我们必须确保模型以合理的方式运行。其中一部分是通过显示模型参数和关键性能指标完成的。
部署了模型并开始收集新数据之后,我们将基于这些新数据迭代模型,以保持预测的最新状态。对于这方面的知识读者可以上网查找相关专业的资料来进行学习。
总结
最后我们总结一下项目的属性和相关的决策路径,如下表所示:
项目属性 | 决策路径 | 例子 |
---|---|---|
部署后会生成更多的训练数据。 | 一旦部署,提取的数据可以用来自动改进模型。也可以尝试在线学习,每天自动训练模型。 | 用户滥用检测系统。 |
训练数据不是部署后生成的。 | 可以通过人工标注来改进评价和模型。理想情况下,每个新模型都必须手工构建和评估。 | 一个没有直接反馈的更大的NLP管道的子集。 |
低延迟模型,或者模型必须是在线的,具有接近实时的响应。 | 需要使用能够快速推断的模型。另一个选择是创建记忆策略,比如缓存,或者拥有更强大的计算能力。 | 需要立即响应的系统,比如聊天机器人或紧急跟踪系统。 |
不需要低延迟模型,或者模型可以以脱机方式运行。 | 可以使用更高级和更慢的模型。这也有助于在可行的情况下优化成本。 | 可以在批处理过程上运行的系统,如零售产品目录分析。 |
最后不得不说的是,知道上面这些,不代表能够开发更好的系统,还需要具备一些软件工程的知识,来指导你进行设计,比如需求分析就很重要,本文中没有涉及这方面的知识。毕竟需求是变化的,上面这些只是开发过程中你需要知道的常规步骤而已。本文只是抛砖引玉,更多的专业性知识读者还需要阅读更多的论文和专业团队的技术文章来进行补充。