全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
1179 1
2020-12-24
使用Python的4大句子嵌入技术!
人类理解语言细微差别的能力是无与伦比的。具有感知能力的人脑能够很容易地在给定的句子中理解幽默,讽刺,负面情绪等等。唯一的标准是我们必须知道句子所使用的语言。
例如,如果有人用日语评论了我的文章,我当然不会理解该人想说些什么。这是一般规则,不是吗?为了进行有效的交流,我们需要以听众最能理解的语言与他进行互动。
对于要处理和理解任何类型的文本的机器,重要的是我们用机器可以理解的语言表示该文本。您认为机器最了解哪种语言?是的,这是数字。不论我们提供什么数据:视频,音频,图像或文本,一台机器只能使用数字。这就是为什么将文本表示为数字或将其嵌入,是研究最活跃的主题之一的原因。
句子嵌入
在本文中,我将介绍Python代码的前4种句子嵌入技术。此外,我将本文的范围限制为提供它们的体系结构以及如何在Python中实现这些技术的概述。我们将以一个基本的用例为例,在给定的句子中查找相似的句子,并演示如何将相同的技术用于相同的句子。我将从单词和句子嵌入的概述开始。
如果您想开始学习NLP的旅程,建议您参加本免费课程-自然语言处理入门
目录
什么是词嵌入?
句子嵌入简介
Doc2Vec
SentenceBERT
推断
通用句子编码器
什么是词嵌入?
最初的嵌入技术仅处理单词??。给定一组单词,您将为该集中的每个单词生成一个嵌入。最简单的方法是对提供的单词序列进行一次热编码,以使每个单词都由1表示,而其他单词则由0表示。虽然这在表示单词和其他简单的文本处理任务时很有效,但实际上并不起作用比较复杂的单词,例如查找相似的单词。
例如,如果我们搜索以下查询:德里的Best Italian restaurant,则希望获得与意大利美食,Delhi and best相对应的搜索结果。但是,如果我们得到的结果是:德里的顶级意大利美食,我们的简单方法将无法检测“最佳”与“顶级”之间或“食品”与“餐厅”之间的相似性。
这个问题引起了我们现在所说的词嵌入。基本上,单词嵌入不仅可以转换单词,还可以识别单词的语义和语法以构建此信息的矢量表示。一些流行的词嵌入技术包括Word2Vec,GloVe,ELMo,FastText等。
基本概念是使用与单词相邻的单词的信息。研究人员发现单词嵌入技术方面取得了突破性的创新,研究人员发现了更好的方法来表示越来越多的单词信息,并可能将其扩展为不仅表示单词,而且表示整个句子和段落。
我建议您阅读本文以了解更多信息-对单词嵌入的直观理解:从计数向量到Word2Vec
句子嵌入简介
如果我们可以直接处理单个句子而不是处理单个单词怎么办?在大文本的情况下,仅使用单词会非常乏味,并且我们会受到从单词嵌入中提取的信息的限制。
假设,我们遇到了一个类似“我不喜欢拥挤的地方”的句子,然后又出现了几句话,我们读到了“但是,我喜欢世界上最繁忙的城市之一,纽约”。我们如何使机器得出“拥挤的地方”与“繁忙的城市”之间的推论?
显然,单词嵌入在这里将不足够,因此,我们使用了句子嵌入。句子嵌入技术将整个句子及其语义信息表示为向量。这有助于机器理解全文中的上下文,意图和其他细微差别。
就像单词嵌入一样,句子嵌入也是一个非常受欢迎的研究领域,它具有非常有趣的技术,这些技术打破了帮助机器理解我们语言的障碍。
Doc2Vec
SentenceBERT
推断
通用句子编码器
我们假设您具有单词嵌入和其他基本NLP概念的先验知识。在继续之前,建议您阅读以下文章:
理解和实现自然语言处理的终极指南(Python中的代码)
NLP从业人员预训练单词嵌入的基本指南
现在让我们开始吧!
我们将首先建立一些基本库并定义句子列表。以下步骤将帮助您做到这一点-
第1步:
首先,导入库并下载“ punkt ”
第2步:
然后,我们定义句子列表。您可以使用更大的列表(最好使用句子列表,以便于处理每个句子)
第三步:
我们还将保留这些句子的标记化版本
句子嵌入
步骤4:
最后,我们定义一个函数,该函数返回两个向量之间的余弦相似度
让我们开始逐句探讨句子嵌入技术。
Doc2Vec
Doc2Vec嵌入是Word2Vec的扩展,是其中最受欢迎的技术之一。它于2014年推出,是一种无监督算法,并通过引入另一个“段落向量”将其添加到Word2Vec模型中。另外,有2种方法可以将段落向量添加到模型中。
1.1) PVDM(段落向量的分布式存储版本):我们在分配所有段落之间的单词向量的同时分配段落向量句子。然后,我们对(段落向量和词向量)进行平均或连接,以获得最终的句子表示形式。如果您注意到的话,它是Word2Vec的连续词袋类型的扩展,其中我们根据给定的一组单词来预测下一个单词。只是在PVDM中,我们根据给定的一组句子来预测下一个句子。
句子嵌入
1.2) PVDOBW(段落向量的分布式词袋版本):只是使用PVDM,PVDOBW是另一个扩展,这次是Skip-gram类型。在这里,我们仅从句子中抽取随机单词,然后使模型预测它来自哪个句子(分类任务)。
句子嵌入
该论文的作者建议将两者结合使用,但指出通常PVDM足以胜任大多数任务。
第1步:
我们将使用Gensim展示如何使用Doc2Vec的示例。此外,我们已经有了一个句子列表。我们将首先导入模型和其他库,然后构建标记的句子语料库。现在,每个句子都表示为TaggedDocument,其中包含单词列表以及与之关联的标签。
句子嵌入
第2步:
然后,我们使用参数训练模型:
句子嵌入
第三步:
现在,我们使用一个新的测试句子,并从我们的数据中找到前5个最相似的句子。我们还将按照相似度递减的顺序显示它们。infer_vector方法返回测试语句的矢量化形式(包括段落矢量)。most_similar方法返回相似的句子
SentenceBERT
目前,SentenceBERT是组件包中的佼佼者,于2018年推出,并立即成为Sentence Embeddings的领头羊。这个基于BERT的模型的核心是四个关键概念:
注意
变形金刚
伯特
连体网络
Sentence-BERT使用类似于Siamese网络的体系结构来提供2个句子作为输入。然后将这两个句子传递给BERT模型和池化层以生成其嵌入。然后使用这对句子的嵌入作为输入来计算余弦相似度。
我们可以使用以下命令安装Sentence BERT:
!pip install句子变形金刚
第1步:
然后,我们将加载预训练的BERT模型。还有许多其他的预训练模型。您可以在此处找到模型的完整列表。
第2步:
然后,我们将对提供的句子进行编码。我们还可以显示句子向量(只需取消注释下面的代码)
第三步:
然后,我们将定义一个测试查询并对其进行编码:
步骤4:
然后,我们将使用scipy计算余弦相似度。我们将检索句子和测试查询之间的相似度值:
到这里,我们获得了文本中的句子与测试句子之间的相似性。需要注意的一个关键点是,如果您想从头训练SentenceBERT,它的运行速度将非常慢。
推断
InferSent由Facebook AI Research在2018年提出,是一种受监督的句子嵌入技术。该模型的主要特征是,它是根据自然语言推理(NLI)数据,更具体地说是SNLI(斯坦福自然语言推理)数据集进行训练的。它由570k人为产生的英语句子对组成,并用三个类别之一手动标记-蕴涵,矛盾或中立。
就像SentenceBERT一样,我们采用一对句子并对它们进行编码以生成实际的句子嵌入。然后,使用以下命令提取这些嵌入之间的关系:
级联
元素积
元素之间的绝对差。
句子嵌入-推断
然后将这些操作的输出向量馈送到分类器,该分类器将向量分类为3个以上定义的类别之一。实际的论文提出了各种编码器架构,主要集中在GRU,LSTM和BiLSTM上。
另一个重要特征是InferSent使用GloVe向量进行预训练的词嵌入。InferSent的最新版本(称为InferSent2)使用fastText。
让我们看看句子相似性任务如何使用InferSent进行工作。我们将为此使用PyTorch,因此请确保从此处安装了最新的PyTorch版本。
第1步:
如上所述,有2个版本的InferSent。版本1使用GLovE,而版本2使用fastText向量。您可以选择使用任何模型(我已经使用了版本2)。因此,我们下载了InferSent模型和预训练的单词向量。为此,请首先从此处保存models.py文件,并将其存储在您的工作目录中。
我们还需要保存经过训练的模型和经过预训练的GLoVe词向量。根据下面的代码,我们的工作目录应该有一个“ encoders”文件夹和一个名为“ GLoVe”的文件夹。编码器文件夹将具有我们的模型,而GloVe文件夹应具有单词vector:
然后我们加载我们的模型和词嵌入:
第2步:
然后,我们从开头定义的句子列表中构建词汇表:
第三步:
像以前一样,我们有测试查询,我们使用InferSent对该测试查询进行编码并为其生成嵌入。
步骤4:
最后,我们计算此查询与文本中每个句子的余弦相似度:
通用句子编码器
目前,最出色的句子嵌入技术之一是通用句子编码器。谷歌已经提出了这一建议,这并不令人惊讶。这里的关键功能是我们可以将其用于多任务学习。
这意味着我们生成的句子嵌入可用于多种任务,例如情感分析,文本分类,句子相似度等,然后将这些询问的结果反馈给模型以得到比以前更好的句子向量。
最有趣的部分是,此编码器基于两个编码器模型,我们可以使用两个编码器之一:
变压器
深度平均网络(DAN)
这两个模型都能够将单词或句子作为输入并为其生成嵌入。以下是基本流程:
将句子转换为小写字母后对它们进行标记
根据编码器的类型,将句子转换为512维向量
如果使用变压器,则它类似于变压器体系结构的编码器模块,并使用自我关注机制。
DAN选项首先计算unigram和bigram嵌入,然后取它们的平均值以得到单个嵌入。然后将其传递到深度神经网络,以嵌入512维的最终句子。
然后将这些句子嵌入用于各种无监督和受监督的任务,例如Skipthoughts,NLI等。然后,再次使用经过训练的模型来生成新的512维句子嵌入。
句子嵌入-通用句子编码器资源
要开始使用USE嵌入,我们首先需要安装TensorFlow和TensorFlow集线器:
步骤1:首先,我们将导入以下必要的库:
第2步:可通过TFHub使用该模型。让我们加载模型:
步骤3:然后,我们将为句子列表和查询生成嵌入。这就像将句子传递给模型一样简单:
步骤4:最后,我们将计算测试查询与句子列表之间的相似度:
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2020-12-25 08:13:34
时光永痕 发表于 2020-12-24 20:32
使用Python的4大句子嵌入技术!
人类理解语言细微差别的能力是无与伦比的。具有感知能力的人脑能够很容易地 ...

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群