首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

女人的嘴,骗人的鬼?ELMo教你用算法分辨女人心

全文共8884字,预计学习时长23分钟

“语境”有多重要呢?

比如:你写了一篇论文放在桌上,一般人问你:“这是什么东西?”那可能只是纯粹地问这是什么东东。但如果是你的导师问你,那问题就严重了,潜台词是:这TM写的是什么玩意儿?

语言有着人类最复杂的游戏法则。尤其是在恋爱关系中,女孩子往往游刃有余,她们一时兴起笑里藏刀抛出的问题,往往让男生分分钟“送命”,比如这样的:

没有男友的小编只能调戏Siri,它的回答是这样的:

好吧,“直男”中的战斗机,不配在爱情界拥有姓名!

机器无法理解句子的真正含义,一直是NLP从业者心中的一根刺。传统的NLP技术和框架只能满足基本的语言任务。但当试图增加语境时,形势便急转而下。

不过,近18个月以来,NLP的形势发生了显著变化。像 Google的BERT和Zalando的 Flair这样的NLP框架能够通过句子进行解析,并掌握它们的语境。

语言模型嵌入(ELMo)

在这方面最大的突破之一来自于Elmo,一个由AllenNLP开发的最先进的NLP框架。本文,我们将探讨ELMo(语言模型嵌入),并使用它在真实数据集上用Python构建一个令人兴奋的NLP模型。

目录

1.什么是ELMo?

2.了解ELMo的工作原理

3.ELMo与其他单词嵌入有什么不同?

4.实现:ELMO用于Python中的文本分类

4.1 理解问题陈述

4.2 关于数据集

4.3 导入库

4.4 读取和检查数据

4.5 文本清理及预处理

4.6 TensorFlow Hub简介

4.7 准备ELMO向量

4.8 建模与评估

5.ELMo的其他用途是什么?

ELMo是什么?

不,这里的ELMo不是SesameStreet中的人物!而是一种在向量或嵌入中表示单词的新方法。这些单词嵌入有助于在一些NLP任务中实现最先进的(SOTA)结果:

全球的NLP科学家已经开始将ELMo用于各种NLP任务,包括研究和工业。

了解ELMo的工作原理

在用Python实现ELMo之前,让我们先直观了解一下它是如何工作的。

想象一下:你已经成功地将ELMo代码从GitHub复制到了Python中,并在自定义文本数据上构建了一个模型。你得到了平均的结果,所以现在需要改进模型。如果不了解ELMo的架构,你会怎么做?如果没有研究过,你会调整哪些参数?

这一思路适用于所有机器学习算法。你不需要了解其他分支,但是你应该具备足够的知识来将其用于模型改进中。现在,让我们回到ELMo的工作方式。

ELMo字向量是在两层双向语言模型(biLM)之上计算的。这个biLM模型有两层堆叠在一起。每层有2个通道-前向通道和后向通道:

• 上述架构使用字符级卷积神经网络(CNN)将文本字符串中的单词表示为原始单词向量。

• 这些原始单词向量作为biLM第一层的输入。

• 前向通道包含关于某个单词及该单词之前语境(其他词)的信息

• 后向通道包含有关单词及该单词之后语境的信息

• 来自前向通道和后向通道的这对信息,形成中间词向量。

• 这些中间字向量被送入biLM的下一层

•(ELMO的)最终表示是原始单词向量和两个中间字向量的加权和。

由于biLM的输入是根据字符而不是单词来计算的,因此它获得了单词的内部结构。例如,biLM可以理解类似beauty和beautiful这样的术语某种程度上是相关的,甚至不需要考虑它们经常出现的语境。听起来太不可思议了!

ELMo和其他单词嵌入有什么不同?

与传统的单词嵌入(如word2vec和GLoVe)不同,分配给标记或单词的ELMo向量实际上是包含该单词的整个句子的函数。因此,在不同的语境下,同一个单词可以有不同的词向量。

也许你们会问:知道这些如何帮助处理NLP问题?让我用一个例子来解释这一点。

假设有以下几个句子:

1. Iread the book yesterday.

2. Canyou read the letter now?

花点时间思考一下这两者之间的区别。第一句中的动词“read”是过去式。同一个动词在第二句中转换成现在时态。这是一种一词多义现象,一个词可以有多种含义或意义。

语言是如此的复杂。

传统的单词嵌入为两个句子中的单词“read”提供了相同的向量。因此,该系统无法区分多义词。这些单词嵌入无法掌握单词使用的语境。

ELMo 单词向量成功解决了这个问题。ELMo单词表示法将整个输入语句转化为公式,用于计算单词嵌入。因此,“read”一词在不同的语境中具有不同的ELMo向量。

实现:用于Python中文本分类的ELMo

现在是你一直在等待的时刻——在Python中实现ELMo!让我们一步一步来。

1.理解问题陈述

处理任何数据科学挑战的第一步是定义问题陈述。这是我们未来行动的基础。

对于本文,我们已经准备好了问题陈述:

情感分析仍然是自然语言处理(NLP)广泛应用的关键问题之一。这一次,考虑到客户关于制造和销售手机、电脑、笔记本电脑等的各种科技公司的tweet,任务是确定tweet是否对这些公司或产品有负面情绪。

这显然是一个二元文本分类任务,其中我们必须从摘取的推特中预测情感。

2.关于数据集

以下是我们所拥有的数据集的分类:

•训练集包含7920条推特

•测试集包含1953条推特

你可以从此页下载数据集。请注意,必须注册或登录才能下载。

警告:推特中的大多数亵渎和粗俗词汇已被替换为“$&@*#”。但是,请注意,数据集可能仍然包含可能被认为是亵渎、粗俗或冒犯的文本。

好吧,让我们启动最喜欢的Python IDE并进行编码!

3.导入库

导入将在notebook中使用的库:

4.读取并检查数据

输出: ((7920, 3), (1953, 2))

训练集有7920条推特,而测试组只有1953条。现在检查一下训练集中的类别分布:

输出:

0 0.744192

1 0.255808

Name: label, dtype: float64

在这里,“1”表示否定的tweet,而“0”表示非否定的tweet。

快速浏览一下训练集的前5行:

我们有三列要处理。“tweet”列是独立变量,而“label”列是目标变量。

5.文本清洗和预处理

我们将拥有一个干净、结构化的数据集,以便在理想情况下使用。但是在NLP中事情还没有那么简单。

我们需要花费大量的时间清理数据,以便为模型构建阶段做好准备。从文本中提取特征较为容易,甚至特征中包含更多信息。数据质量变得越高,模型的性能的改善越有意义。

所以,让我们清理一下收到的文本,并进行探索。

在推特中似乎有相当多的URL链接。他们没有告诉我们太多(如果有的话)关于推特的情感,所以将其直接删除。

我们使用正则表达式(或RegEx)来删除URL。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190409A07NKH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券