Elasticsearch: 基于Text Embedding的文本相似性搜索
本文探讨了Text Embedding和ElasticSearch的向量类型如何用于支持文本相似性搜索。本文将首先概述Text embedding技术,介绍该技术的一些应用场景,后使用ElasticSearch完成一个简单的基于Text embedding的文本相似性搜索demo。
从一开始Elasticsearch就作为全文搜索引擎提供快速而强大的全文搜索功能。在Elasticsearch 7.0中,ES引入了高维向量的字段类型,现在7.3版本支持在文档评分中使用这些向量。
相似性搜索的一个简单方法是根据文档与查询共享的单词数对文档进行排名。但是文档可能与查询类似,即使它们没有太多共同的单词——更强大的相似性概念也会考虑到它的语法和语义内容。
自然语言处理(NLP)社区开发了一种称为文本嵌入的技术,它将单词和句子编码为数字向量。这些向量表示被设计用来捕获文本的语言内容,并且可以用来评估查询和文档之间的相似性。
什么是词向量
Word embeddings 词嵌入
单词嵌入模型将单词表示为密集数字向量。这些向量旨在捕获单词的语义属性 - 向量靠近在一起的单词在语义上应该是相似的。在一个训练较好的embedding中,向量空间中的方向与单词意义的不同方面相关联。例如,“加拿大”的向量可能在一个方向上接近“法国”,而在另一个方向上接近“多伦多”。
一段时间以来,自然语言处理(NLP)和搜索社区一直对单词的向量表示感兴趣。在过去的几年中,人们对单词嵌入的兴趣再次兴起,当时许多传统的任务正在使用神经网络进行重新审视。开发了一些成功的Word embedding算法,包括word2vec和GloVe,还有后来的训练速度更快的Fasttext。这些方法使用大型文本集合,并检查每个单词出现的上下文以确定其向量表示:
- word2vec:Skip-gram模型训练神经网络以预测句子中单词周围的上下文单词。
- GloVe:单词的相似性取决于它们与其他上下文单词出现的频率。该算法训练单词共现计数的简单线性模型。
- Fasttext:Facebook的词向量模型,其训练速度比word2vec的训练速度更快,效果又不丢失。
许多研究小组分发的模型已在大型文本语料库(如维基百科)上进行了预训练,使其便于下载和插入下游任务。尽管经常使用预训练版本,但调整模型以适应特定目标数据集和任务会很有帮助。这通常通过在预训练模型上运行轻量级微调步骤来实现。
Word embedding已被证明非常强大和有效,现在NLP任务(如机器翻译和情感分类)中使用Word embedding已经越来越多。
Sentence embeddings 句子嵌入
近,研究人员不仅关注单词级别的Word embedding,而且开始关注较长的文本如何进行词向量表示。当前大多数的方法基于复杂的神经网络架构,并且有时在训练期间需要不断标记数据以帮助捕获语义信息和提高训练效果。
一旦经过训练,模型就能够获取一个句子并为上下文中的每个单词生成一个向量,以及整个句子的向量。与嵌入字词类似,许多模型的预训练版本可用,允许用户跳过昂贵的培训过程。虽然训练过程可能非常耗费资源,但调用模型的重量要轻得多。训练好的Sentence embeddings足够快,可以用作实时应用程序的一部分。
一些常见的句子嵌入技术包括InferSent,Universal Sentence Encoder,ELMo和BERT。改进单词和句子嵌入是一个活跃的研究领域,并且可能会引入更多强大的模型。
与传统搜索方法的比较
在传统的信息检索中,我们基于大多使用TF-IDF等基于单词个数的搜索方法,我们只是计算单词出现而不考虑句子结构。而基于text embedding等技术的搜索,将会考虑句子意思。比如“上午吃饭吗”和“我eat早餐了”这两个句子没有一个单词一样,但是其语义是完全接近的,使用text embedding将能够很好的搜索出来。
文本嵌入在某些重要方面与传统的矢量表示不同:
- Text embedding的向量通常纬度比较低,100~1000。而传统的words vectors纬度可以到5000+。Text embedding技术将文本编码为低维空间向量,同义词和短语在新的向量空间中表示形式会十分相似。
- 在确定向量表示时,Text embedding可以考虑单词的顺序。例如,短语“明天”可以被映射为与“天明”非常不同的向量。
- Text embedding通常适用于短文本。
应用场景
Elasticsearch支持词向量搜索能够在很多场景下进行应用,这里进行列举一些简单的应用,有些并不是当前场景下的佳选择。
- QA:用户输入一段描述,给出佳匹配的答案。传统基于关键字搜索问答的局限性之一在于用户必须了解一些特殊的名词,假如关键字没有匹配上则没有返回结果。而在使用词向量之后,直接输入类似的描述性语言可以获得佳匹配的答案。
- 文章搜索:有时候只记得一篇文章在表达什么意思,而忘记了文章标题和关键字。这时候只需要输入自己记得的大致意思和记得句子,即可根据描述中隐藏的语义信息搜索到佳匹配的文章。
- 图片搜索:这里的图片搜索有两种含义,一种是讲图片中的特征值进行提取生成向量,实现以图搜图模式的搜索。另一种是基于图片tag的方式,将tag进行向量化,这样可以搜索到语义相近的tag的图片,而不必完全相等。这两种方式在ES的词向量搜索中都可以支持。
- 社交网络:社交网络中的人都是一个单词,而其关注和粉丝都是和其相关的单词,因此可以每一个人的关注和粉丝形成一段“文本”去训练模型。想计算两个人是否相似或者两个的距离,只需要计算两个人的向量即可。
Elasticsearch的词向量搜索可以理解为提供了一个计算平台,而具体的应用场景需要自己评估是否适合。具体的效果好坏,其实还是取决于本身的模型训练质量和模型使用方式。
佳实践
本例子以医疗领域的“智能问诊”为例进行了一个展示。在此说明这里仅仅是一个demo,重点介绍具体场景里如何使用Elasticsearch的向量搜索,其模型是否有更适合的或者效果是否满足用户使用在不做过多讨论。
预期功能
用户A生病了,在demo中输入一段症状描述,demo返回给用户得了什么病。
数据准备
demo需要准备的数据主要有两个:
- 用以训练模型的文本数据(下方流程图的Texts):这是大量的和医疗相关的文本,可以是从维基百科爬取的整篇整篇的文章,或者免费版权的医学杂志、网站等获得的文本段落。该数据只要和医疗相关即可,格式为一行一个段落,如下:
xxxxx一行医学相关的文本,百姓所说的感冒是指“普通感冒”,又称“伤风”、急性鼻炎或上呼吸道感染。感冒是一种常见的急性上呼吸道病毒性感染性疾病,多由鼻病毒、副流感病毒、呼吸道合胞病毒、埃可病毒、柯萨奇病毒、冠状病毒、腺病毒等引起。临床表现为鼻塞、喷嚏、流涕、发热、咳嗽、头痛等,多呈自限性。大多散发,冬春季节多发,但不会出现大流行。
一行医学相关的文本xxxxx
一行医学相关的文本xxxxx
相关文章