作者:Josh Taylor
编译:ronghuaiyang
导读
5分钟内构建一个基于ELMo的语义搜索引擎,在NLP中,上下文就是一切。
![759520b240c9920c8c2d9b04bb1c1b24.gif](https://i-blog.csdnimg.cn/blog_migrate/49c1f0f39a6af3636c95b9f7186bf484.gif)
使用最先进的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”这个词总是一样的,但它的意思是非常不同的。
![346e7a1f55798b9df638e29b5090e8ba.png](https://i-blog.csdnimg.cn/blog_migrate/c35b4a1c49b617317e70c2c2c00aa7bb.jpeg)
根据不同的上下文单词可以有不同的意思
虽然我们可以很容易地理解语言中的这些复杂性,但是创建一个模型来理解周围文本中单词意义的不同细微差别是很困难的。
正是由于这个原因,传统的词嵌入(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 document
text = text.lower().replace('', ' ').replace('', ' ').replace('xa0',' ') #get rid of problem chars
text = ' '.join(text.split()) #a quick way of removing excess whitespace
doc = 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