2019-12-05 20:53:41

作者:Josh Taylor

编译:ronghuaiyang

导读

5分钟内构建一个基于ELMo的语义搜索引擎,在NLP中,上下文就是一切。

使用最先进的ELMo自然语言模型得到的语义句子相似度

本文将探讨自然语言建模的最新进展,深度上下文词嵌入。本文的重点是实践而不是理论,它提供了一个工作示例,说明如何使用最先进的ELMo模型来检查给定文档中的句子相似性,并创建一个简单的语义搜索引擎。完整的代码可以在Colab笔记本中查看:https://colab.research.google.com/drive/13f6dKakC-0yO6_DxqSqo0Kl41KMHT8A1。

上下文在NLP中的重要性

众所周知,语言是复杂的。上下文可以完全改变一个句子中单个单词的意思。例如:

He kicked the bucket.

I have yet to cross-off all the items on my bucket list.

The bucket was filled with water.

在这些句子中,虽然“bucket”这个词总是一样的,但它的意思是非常不同的。

根据不同的上下文单词可以有不同的意思

虽然我们可以很容易地理解语言中的这些复杂性,但是创建一个模型来理解周围文本中单词意义的不同细微差别是很困难的。

正是由于这个原因,传统的词嵌入(word2vec、GloVe、fastText)不够完善。它们每个单词只有一个表示,因此它们无法捕获每个单词的含义如何根据周围的上下文变化。

ELMo介绍,深度上下文词表示

ELMo,由AllenNLP于2018年开发,它超越了传统的嵌入技术。它使用深度的、双向的LSTM模型来创建单词表示。

ELMo不是一本单词字典和它们对应的向量,而是在使用它们的上下文中分析单词。它也是基于字符的,允许模型形成词汇表外的单词表示。

因此,这意味着ELMo的使用方式与word2vec或fastText非常不同。ELMo不使用字典“查找”单词及其对应的向量,而是通过深度学习模型传递文本来动态创建向量。

一个工作示例,5分钟内实战ELMo

我们开始!这里我会写出主要的代码,但是如果你想了解全部的代码,请参阅这里:https://colab.research.google.com/drive/13f6dKakC-0yO6_DxqSqo0Kl41KMHT8A1。

根据我最近的几篇文章,我们将使用的数据是基于Modern Slavery returns。这些都是公司的强制性声明,以传达他们如何在内部和供应链内部解决Modern Slavery。在本文中,我们将深入探讨ASOS的return(一家英国在线时尚零售商)。

1. 获取文本数据,清洗并且做成tokens

使用Python字符串函数和spaCy来实现是非常简单的。这里我们做一些基本的文本清理:

a)删除换行符、制表符、多余的空格以及神秘的“xa0”字符;

b)使用spaCy的‘.sents’ 迭代器将文章分成句子。

ELMo可以接收一个句子字符串列表,也可以接收一个列表的列表(句子和单词)。这里我们选择了前者。我们知道ELMo是基于字符的,因此标记单词不应该对性能有任何影响。

 nlp = spacy.load('en_core_web_md')#text represents our raw text documenttext = text.lower().replace('\n', ' ').replace('\t', ' ').replace('\\xa0',' ') #get rid of problem charstext = ' '.join(text.split()) #a quick way of removing excess whitespacedoc = nlp(text)sentences = []for i in doc.sents:if len(i)>1:sentences.append(i.string.strip()) #tokenize into sentences

2. 使用TensorFlow Hub获取ELMo模型:

如果你还没有用过TensorFlow Hub,它提供了大量的预先训练的模型在TensorFlow中使用。幸运的是,ELMo就是其中之一。我们只需两行代码就可以加载一个完全训练好的模型。

 url = "https://tfhub.dev/google/elmo/2"embed = hub.Module(url)

要使用这个模型,我们只需要多几行代码,将它指向文本文档,并创建句子向量:

 # This tells the model to run through the 'sentences' list and return the default output (1024 dimension sentence vectors).embeddings = embed(sentences,signature="default",as_dict=True)["default"]#Start a session and run ELMo to return the embeddings in variable xwith tf.Session() as sess:sess.run(tf.global_variables_initializer())sess.run(tf.tables_initializer())x = sess.run(embeddings)

3. 使用可视化来检查输出

可视化作为一种获得更多数据理解的方式,经常被忽视。图片胜过千言万语,我们将创建一个包含一千个单词的图来证明这一点(实际上是8511个单词)。

在这里,我们使用PCA和t-SNE来把ELMo的输出从1024个维度降到2,以便我们可以查看模型的输出。

 from sklearn.decomposition import PCApca = PCA(n_components=50) #reduce down to 50 dimy = pca.fit_transform(x)from sklearn.manifold import TSNEy = TSNE(n_components=2).fit_transform(y) # further reduce to 2 dim using t-SNE

使用Plotly库,我们可以画出非常漂亮的图。下面的代码展示了如何呈现降维的结果,并将其连接回句子文本。还根据句子的长度添加了颜色。

创建这个的代码如下:

 import plotly.plotly as pyimport plotly.graph_objs as gofrom plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplotinit_notebook_mode(connected=True)data = [go.Scatter(x=[i[0] for i in y],y=[i[1] for i in y],mode='markers',text=[i for i in sentences],marker=dict(size=16,color = [len(i) for i in sentences], #set color equal to a variableopacity= 0.8,colorscale='Viridis',showscale=False))]layout = go.Layout()layout = dict(yaxis = dict(zeroline = False),xaxis = dict(zeroline = False))fig = go.Figure(data=data, layout=layout)file = plot(fig, filename='Sentence encode.html')from google.colab import filesfiles.download('Sentence encode.html')

在探索这种可视化的过程中,我们可以看到ELMo在根据语义相似性分组句子方面做了出色的工作。事实上,这个模型的效果是相当令人难以置信的:

下载你自己的HTML(上面的链接),看看ELMo是如何工作的

4. 构造一个语义搜索引擎:

现在我们确信我们的语言模型运行良好,让我们将其应用到语义搜索引擎中。其思想是,我们搜索文本的时候,不是通过关键字,而是通过语义接近我们的搜索查询。

这实际上很容易实现:

  • 首先,我们进行一个搜索的query并且在上面运行ELMo;
  • 然后在,我们使用余弦相似性来比较这我们的文本文件中的向量;
  • 然后从文件中我们可以返回n个最接近的匹配搜索查询。
 search_string = "example text" #@param {type:"string"}

除了使用Colab来输入,我还使用了' IPython.display.HTML '美化输出文本和一些基本的字符串匹配,突出搜索查询和结果之间的常见单词。

让我们来测试一下。让我们看看ASOS在他们的Modern Slavery return中是如何对待道德准则的:

在短短几分钟完成了一个完全互动的语义搜索引擎!

太神奇了!除了关键字之外,谷歌还清楚地知道“ethics”和“ethical”是密切相关的。两者都与我们的搜索查询相关,但不直接基于关键字链接。

英文原文:https://towardsdatascience.com/elmo-contextual-language-embedding-335de2268604

ELMo:基于上下文的语言模型,5分钟构建语义搜索引擎代码实战相关推荐

  1. sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss)

    sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss) # 广义线性模型中的各种连接函数: ...

  2. 2引擎帮助文档_使用Sentence Transformers和Faiss构建语义搜索引擎

    介绍 您是否曾经想过如何使用Sentence Transformers创建嵌入向量,并在诸如语义文本相似这样的下游任务中使用它们? 在本教程中,您将学习如何使用Sentence Transformer ...

  3. 使用Sentence Transformers和Faiss构建语义搜索引擎

    介绍 您是否曾经想过如何使用Sentence Transformers创建嵌入向量,并在诸如语义文本相似这样的下游任务中使用它们? 在本教程中,您将学习如何使用Sentence Transformer ...

  4. 使用深度RNN模型构建语义搜索引擎

    /*版权声明:可以任意转载,转载时请标明文章原始出处和作者信息.*/ author: 张俊林 本文讨论如何用深度学习系统来构造语义搜索引擎的问题.这里所谓的语义搜索,是指的能做用户查询和搜索网页之间的 ...

  5. python读取dat数据anaconda_基于python的大数据分析-pandas数据读取(代码实战)

    我们常见的数据存储格式无非就是csv.excel.txt以及数据库等形式. 数据读取 在pandas中可以使用一些函数完成数据的读取.比如read_csv.read_excel.read_table. ...

  6. R语言构建ElasticNet回归模型实战:基于mtcars数据集

    R语言构建ElasticNet回归模型实战:基于mtcars数据集 目录 R语言构建ElasticNet回归模型实战:基于mtcars数据集 #ElasticNet回归

  7. 斯坦福NLP名课带学详解 | CS224n 第13讲 - 基于上下文的表征与NLP预训练模型(ELMo, transformer)(NLP通关指南·完结)

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/36 本文地址:https://ww ...

  8. 基于上下文的rpn_构建事物-产品评论视频中基于上下文的情感分析

    基于上下文的rpn The word "Social" has taken a whole new meaning in today's digital era. Simply g ...

  9. 基于上下文的智能化代码复用推荐

    点击上方蓝字关注我们 基于上下文的智能化代码复用推荐 彭鑫1,2, 陈驰1,2, 林云3 1 复旦大学计算机科学技术学院,上海 200438 2 上海市数据科学重点实验室,上海 200438 3 新加 ...

最新文章

  1. Flink1.7.2 sql 批处理示例
  2. php 图片库 加星,PHP使用imagick_st类库把JPG生成GIF动画图片
  3. php验证数字100倍数,js如何实现一个文本框只能输入数字 且是100的倍数
  4. 关于ibatis.net 和 Nhibernate的选择
  5. SP703 SERVICE - Mobile Service[DP]
  6. 【svn】设置过滤文件
  7. 数据源管理 | PostgreSQL环境整合,JSON类型应用
  8. 超级终端设置-基本配置(华为)
  9. ACM ICPC 2011-2012 Northeastern European Regional Contest(NEERC)B Binary Encoding
  10. 对Linux的cp命令的思考
  11. 基于 Gitlab 交付 Go 程序的 Docker 镜像
  12. c 调用python clion_CLion 2018.1.3 功能超级强大的跨平台 C 开发工具
  13. android markdown 框架,Android Studio MarkDown风格README的正确打开姿势
  14. 【第10章】深入理解Session与Cookie
  15. JDK常见问题 环境变量配置
  16. 关于SVN报错问题错误码E175002的解决方案
  17. C++_华氏度转换摄氏度
  18. 高考数学必考知识点数学高考常考考点
  19. Python实战:获取bing必应壁纸首页的每日一图(仅做学习用)
  20. 真正的互联网诞生:TCP/IP协议的出现

热门文章

  1. HESSIAN 海森矩阵
  2. [深度学习] Pytorch nn.CrossEntropyLoss()和nn.NLLLoss() 区别
  3. JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用。
  4. php 直接定义json,PHP json_dncode()函数定义与使用方法
  5. 多核之后,CPU 的发展方向是什么?中科院计算所包云岗提 20 点新思考
  6. 智源论坛报名 | 智能信息检索与挖掘报告会(9月17日)
  7. 【连载】优秀程序员的45个习惯之37——提供有用的错误信息
  8. 【TAMU】最新《时间序列分析》课程笔记
  9. 外卖平台涉嫌大数据杀熟,处理不能“自说自话”
  10. 独家 | 准备数据时如何避免数据泄漏