手把手教您解决90%的自然语言处理问题

摘要: 本文将讲解如何从零开始,有效地处理自然语言问题的指南和技巧:首先解释如何构建机器学习解决方案来解决上面提到的问题。然后转向更细致的解决方案。


如何将5W和H应用于文本数据!

文本数据无处不在

从文本数据中提取有意义和值得学习的数据是自然语言处理(NLP)的一个非常重要的研究课题。NLP是一个非常大的领域,NLP有几个最常使用的关键应用:

·识别不同的用户/客户群。

·准确的检测和提取不同类别的反馈。

·根据意图对文本进行分类。

本文将讲解如何从头开始有效地处理这些问题的指南和技巧:首先解释如何构建机器学习解决方案来解决上面提到的问题。然后转向更细致的解决方案,比如特性工程、单词向量和深度学习。


第一步:收集你的数据

每个机器学习问题都始于数据。本文中,我们将使用一个名为“社交媒体上的灾难”的数据集:投稿人查看了超过一万条的推文,然后指出每条推文是否提到了灾难事件。

我们的任务是检测哪些推文是关于灾难事件的,因为有潜在的应用专门收集紧急事件并通知执法部门。这个任务的特殊挑战是两个类都包含用于查找推文的相同搜索条件,所以我们不得不用更微妙的差异来区分它们。

在本文中,我们将有关灾难的推文称为“灾难”,其他推文称为“无关紧要的”。正如Richard Socher所描述的那样,查找和标记足够的数据来训练模型比试图优化复杂的无监督方法通常更快、更简单、更便宜。


第二步:清理你的数据

“你的模型只能和你的数据一样好”。一个干净的数据集能够使模型学习有意义的特征,所以应当是先查看数据然后再清理数据。

以下是用来清理你的数据的清单(详见代码):

1、删除所有不相关的字符,例如任何非字母数字字符。

2、把你的文章分成一个个单独的单词。

3、删除不相关的单词。

4、将所有字符转换为小写。

5、考虑将拼错的单词或拼写单词组合成一个单独的表示。

6、考虑词形化。

在遵循这些步骤并检查额外的错误之后,我们可以开始使用干净的、标记的数据来训练模型!


第三步:找到一个好的数据表示

机器学习模型以数值作为输入。我们的数据集是一个句子的列表,所以为了能够提取数据。我们首先要找到一种方法使我们的算法能理解它:也就是数字列表。

 

一组以数据矩阵表示的笑脸

独热编码(Bag of Words

计算机文本表示的一种方法是将每个字符单独编码为一个数字(例如ASCII)。这对于大多数数据集来说是不可能的,所以我们需要更高层次的方法。

例如,我们可以在我们的数据集中建立一个所有的单词的词汇表,并将一个唯一的索引与词汇表中的每个单词联系起来。每个句子被表示为一个列表,只要我们的词汇表中有不同单词的数量。在这个列表中的每个索引中,我们标记出在我们的句子中出现了多少次给定的单词。这被称为Bag of Words模型,因为它是一种完全无视我们句子中词语顺序的表现形式。

 

可视化嵌入

为了查看嵌入是否捕获了与我们的问题相关的信息(例如,tweet是否与灾难有关),我们选择可视化并查看这些类这个方法,但是由于词汇表通常非常大,并且在20000个维度中可视化数据是不可能的,像PCA这样的技术将有助于将数据压缩到两个维度。如下图。

 

嵌入后这两个类依旧不太好分开,仅仅是降低了维度。为了看Bag of Words特征是否有用,我们根据它们来训练一个分类器。


第四步:分类

当涉及到对数据进行分类时,逻辑回归是最简单可用的工具,训练简单,结果可解释,可以很容易的从模型中提取最重要的系数。将数据分成一个适用于我们的模型和测试集的训练集,以了解它如何推广到不可见的数据。训练结束后得到了75.4%的准确度,虽然这个精度足够满足我们的需求,但是我们还是应该试图去理解它是如何工作的。


第五步:检查

混淆矩阵

第一步是了解我们模型的错误类型,以及哪种类型的错误是最不可取。在我们的例子中,误报是将不相关的tweet归为灾难,而漏报是将灾难归类为不相关的tweet。如果要优先处理每个潜在的事件,就要降低漏报率,如果受到资源的限制,那么会游戏那考虑降低误报率。将这些信息可视化的一个好方法是使用混淆矩阵,将我们的模型与真实标签的预测相比较。理想情况下,矩阵将是从左上角到右下角的对角线。

 

混淆矩阵

结果显示该分类器漏报率更高。换句话说,我们的模型最常见的错误是将灾难分类为不相关的。

解释我们的模型

验证我们的模型并解释它的预测结果,重要的是看它使用哪些词作出预测。在数据有偏差时,分类器能在样本数据中做出准确预测,但是这个模型在现实世界中不能很好地推广。在这里,我们为灾难和不相关的推文绘制了最关键的单词表。

 

我们分类器的词汇库能够处理大量的词汇。然而,有些词是非常频繁的,而且只会对我们的预测造成干扰。所以接下来,我们将尝试用一种方法来表示能够解释单词频率的句子,看看我们是否能从我们的数据中获得更多的信息。


第六步:掌握词汇结构

TF-IDF

为了帮助我们的模型更多地关注有意义的单词,我们可以在我们的单词模型包上使用TF-IDF评分,下图为新嵌入的PCA投影。

 

可视化TF-IDF嵌入

我们可以看到这两个颜色之间的区别更明显了,这使我们的分类器更容易区分。我们在新的嵌入式系统上培训另一个逻辑回归,并最终达到了76.2%的精确度。一个轻微的改善,提高了模型的性能,所以我们可以考虑升级这个模型了。

 

TF-IDF:文字的重要性

第七步:Leveraging semantics

Word2Vec

即使是最新的模型也没法将训练中没有遇到的单词进行分类,哪怕是非常相似的单词。为了解决这个问题,我们所用的工具叫做Word2Vec。

Word2Vec是一种查找单词连续嵌入的技术。它可以从阅读大量的文本中学习,并记住在类似的语境中出现的单词。论文的作者开放了一个在非常大的语料库中预先训练的模型,预先训练的向量可以在与这个帖子相关的存储库中找到。

语句级别的表示

为我们的分类器获得一个句子嵌入的一个快速方法是平均Word2Vec得分。这跟以前一样是Bag of Words的方法,但是这次我们只丢掉句子的语法,同时保留一些语义信息。

 

Word2Vec句子嵌入

下图是我们使用以前的技术实现的新嵌入的可视化:

 

可视化Word2Vec嵌入

在训练了相同的模型三次(逻辑回归)后,我们得到了77.7%的精度分数,这是现阶段得到的最好的结果!

复杂性/ Explainability trade-oG

由于我们的嵌入没有像以前的模型那样被表示为每个单词一维的矢量,所以很难看出哪些单词与我们的分类最相关。虽然我们仍然可以访问我们的逻辑回归的系数,但它们与我们嵌入的300个维度相关,而不是词的索引。然而,对于更复杂的模型,我们可以利用LIME等黑盒解释器来了解我们的分类器如何工作。

LIME

在GitHub上可以获得开源的LIME。它是一种允许用户解释任何分类器决定的黑盒解释器。

 

正确的灾难词语被识别为“相关的”

 

在这里,词语对分类的贡献似乎不那么明显

我们需要在一个有代表性的测试用例上运行LIME,看看那些词最关键,用这种方法可以得到像以前模型一样重要的分数,并验证我们模型的预测结果。


Word2Vec:文字的重要性

由上图可得,这个模型收集了相关性非常高的词,暗示它做出了可以解释的预测结果,所以可以放心的部署到生成中。


第八步:使用端到端的方法来利用语法

由于以上方法省略了单词的顺序,丢弃了句子的句法信息,所以这些方法不能提供足够准确的结果。为此您可以使用更复杂的模型,一种常见的方法是将一个句子作为单个单词向量的序列,使用Word2Vec或者如GloVe、CoVe这样的方法。

 

一个高度eGective端到端架构(源)

卷积神经网络用于句子分类的训练非常迅速,并且是入门级的深度学习体系结构。卷积神经网络在文本相关的任务中表现非常出色,而且通常比大多数复杂的NLP方法(例如LSTMs和编码器/解码架构)要快得多。这个模型保存了单词的顺序,并学习了有价值的信息,其中的单词序列可以预测我们的目标类。训练这个模型不会比之前的方法麻烦,并且能获得79.5%的准确性。所以下一步应该是使用我们描述的方法来探索和解释预测,以验证它确实是部署到用户的最佳模型。

作者:阿里云云栖社区

原文地址:https://zhuanlan.zhihu.com/p/33797826

干货好文,请关注扫描以下二维码:



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot整合swagger2(生成有左右菜单式的api文档界面)

一、pom.xml内容&#xff1a; <!--依赖swagger2 zhongzk 2019.7.7 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency> <depend…

你会感觉容器使用起来很痛苦吗?

摘要&#xff1a; 容器问世4年了&#xff0c;它终于逐渐褪去神秘光环。不过&#xff0c;真正运用自如并不是件容易的事情。 在将容器用于生产环境中的过程中&#xff0c;你是否有很多痛苦&#xff0c;是否踩过很多坑&#xff0c;要吐好多苦水&#xff1f; 其实很大的一个问题在…

如何证明你不是在开发垃圾?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 珍妮兔 来源| 轻松做软件需要懂垃圾分类的不仅仅只有家庭主妇和煮夫&#xff0c;还有程序员。如果你开发的功能跑不通&#xff0c;你是在开发干垃圾&#xff1b;如果你的代码害得别人的功能跑不通&#xff0c;你是在开发湿垃…

你的专属云资源管家!阿里云正式对外发布云解析PrivateZone!

摘要&#xff1a; 近日&#xff0c;阿里云宣布云解析PrivateZone正式对外公测&#xff0c;该产品是基于阿里云专有网络VPC&#xff08;Virtual Private Cloud&#xff09;环境的私有域名解析和管理服务&#xff0c;使用户在自定义的一个或多个专有网络VPC中快速构建DNS系统&…

当你和天猫精灵对话时,它在想什么?阿里智能对话技术深度解读

摘要&#xff1a; 术语对齐 TaskBot引擎&#xff1a; 核心处理对象是“技能”&#xff0c;我们把技能定义成结构化(querycontent)、垂直场景化的任务&#xff0c;比如实时场景查询、工具类、控制类等QABot引擎&#xff1a;包括KG-QA引擎、QAPair引擎、DeepQA引擎。术语对齐Task…

训练softmax分类器实例_知识蒸馏:如何用一个神经网络训练另一个神经网络

公众号关注 “ML_NLP”设为 “星标”&#xff0c;重磅干货&#xff0c;第一时间送达&#xff01;转载自&#xff1a;AI公园作者&#xff1a;Tivadar Danka编译&#xff1a;ronghuaiyang导读知识蒸馏的简单介绍&#xff0c;让大家了解知识蒸馏背后的直觉。如果你曾经用神经网络来…

10个业界最流行的Kubernetes发行版

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Serdar来源 | RancherLabs如果你需要大规模的容器编排&#xff0c;想必Kubernetes毋庸置疑是你的首要选择&#xff0c;这一由谷歌推出的开源容器编排系统近年来发展飞速&#xff0c;大受业界及广大用户好评。尽管如此&#x…

神经进化是深度学习的未来

摘要&#xff1a; 本文主要讲了神经进化是深度学习的未来&#xff0c;以及如何用进化计算方法&#xff08;EC&#xff09;优化深度学习&#xff08;DL&#xff09;。过去几年时间里&#xff0c;我们有一个完整的团队致力于人工智能研究和实验。该团队专注于开发新的进化计算方法…

深度学习的关键术语

摘要&#xff1a; 本文着重介绍了深度学习的一些关键术语&#xff0c;其中包括生物神经元&#xff0c;多层感知器&#xff08;MLP&#xff09;&#xff0c;前馈神经网络和递归神经网络。对于初学者来说&#xff0c;掌握它们可以防止在学习请教时的尴尬~深度学习已经成为编程界的…

虚拟化精华问答 | 虚拟化技术分类

虚拟化是一种资源管理技术, 是将计算机的各种物理资源, 如服务器、网络、内存及存储等&#xff0c;予以抽象、转换后呈现出来&#xff0c;打破物理设备结构间的不可切割的障碍&#xff0c;使用户可以比原本的架构更好的方式来应用这些资源。这些资源的虚拟部分是不受现有资源的…

远程服务器 上传公钥,SecureCRT+Ubuntu SSH服务器的远程公钥登陆

有耐心地往下看&#xff0c;哥是实现了的&#xff0c;并且所有细节会给的相当的丰富哈。Ubuntu: Ubuntu 14.04 LTSopensshWindow10(64位):SecureCRT8.0看网上的列为同牛们说gitssh用&#xff0c;自己搭建git服务器&#xff0c;so嗨&#xff0c;所以行动起来&#xff0c;先给win…

理解卷积神经网络的利器:9篇重要的深度学习论文(上)

摘要&#xff1a; 为了更好地帮助你理解卷积神经网络&#xff0c;在这里&#xff0c;我总结了计算机视觉和卷积神经网络领域内许多新的重要进步及有关论文。手把手教你理解卷积神经网络(一)手把手教你理解卷积神经网络(二)本文将介绍过去五年内发表的一些重要论文&#xff0c;并…

理解卷积神经网络的利器:9篇重要的深度学习论文(下)

摘要&#xff1a; 为了更好地帮助你理解卷积神经网络&#xff0c;在这里&#xff0c;我总结了计算机视觉和卷积神经网络领域内许多新的重要进步及有关论文。手把手教你理解卷积神经网络(一)手把手教你理解卷积神经网络(二)继“理解卷积神经网络的利器&#xff1a;9篇重要的深度…

工作流实战篇_01_flowable 流程Demo案例

由于群里有些朋友对这个flowable还不是 很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都是…

antd 进行ajax请求,react+dva+antd接口调用方式

一丶 安装通过 npm 安装 dva-cli 并确保版本是0.8.1或以上。$ npm install dva-cli -g$ dva -v0.8.1二丶创建新应用安装完dva-cli之后&#xff0c;就可以在命令行里访问到dva命令(不能访问&#xff1f;)。现在&#xff0c;你可以通过dva new创建新应用。$ dva new dva-quicksta…

基于MaxCompute的拉链表设计

摘要&#xff1a; 简单的拉链表设计 背景信息&#xff1a; 在数据仓库的数据模型设计过程中&#xff0c;经常会遇到这样的需求&#xff1a; 数据量比较大; 表中的部分字段会被update,如用户的地址&#xff0c;产品的描述信息&#xff0c;订单的状态、手机号码等等; 需要查看…

2019全球编程语言高薪排行榜登场;余承东正式宣布华为IFA2019 或发布麒麟990;OPPO、vivo和小米成立互传联盟…...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 全新的索尼PS5&#xff08;图…

python文件输出log_Python同时向控制台和文件输出日志logging的方法

#-*- coding:utf-8 -*- import logging # 配置日志信息 logging.basicConfig(levellogging.DEBUG, format%(asctime)s %(name)-12s %(levelname)-8s %(message)s, datefmt%m-%d %H:%M, filenamemyapp.log, filemodew) # 定义一个Handler打印INFO及以上级别的日志到sys.stderr c…

MaxCompute使用常见问题总结

摘要&#xff1a; Maxcompute常见问题的总结&#xff0c;方便广大用户可以快速排查问题 计费相关 存储计费&#xff1a;按照存储在 MaxCompute 的数据的容量大小进行阶梯计费。 计算计费&#xff1a;MaxCompute 分按量后付费和按 CU 预付费两种计算计费方式。 按量后付费&#…

工作流实战_02_flowable 流程模板导入

由于群里有些朋友对这个flowable还不是很熟悉&#xff0c;在群里的小伙伴的建议下&#xff0c;师傅(小学生05101)制作一个开源的项目源码&#xff0c;一共大家学习和交流&#xff0c;希望对有帮助&#xff0c;少走弯路 如果有不懂的问题可以入群&#xff1a;633168411 里面都是…