帕特里克·托马索在 Unsplash上的照片
句子转换器是一个 Python 框架,用于句子的最新矢量表示。有了空间中的句子,我们可以计算它们之间的距离,这样,我们可以根据它们的语义找到最相似的句子。
举个例子,假设我们有这两个句子:
Coffee makes mornings better.Morning walks tend to start and end your day in a good mood.
我们想找出与下面这句话最相似的句子:
i like a nice cup of tea in the morning.
最接近的句子是“咖啡让早晨更美好。”因为他们都在谈论早上的饮料。即使他们不使用相同的单词,他们的矢量表示也会彼此接近。
为了获得两个句子向量的相似度,我们使用余弦相似度(1-余弦距离)。这是因为向量的方向在它们的语义中起着巨大的作用。例如,“咖啡”和“茶”的向量可能指向大致对应于“早晨饮料”的方向。现在,假设我们有向量 a=[1,1,-1],b=2a=[2,2,-2]。这两个向量大小不同,但方向相同。它们的余弦距离是 0,但它们的欧几里德距离,不考虑方向,是 4.58,在完全不同的方向上,很容易找到另一个距离更小的向量。
在本帖中,我们将使用 Kaggle 提供的歌曲歌词数据集,给定文本输入,我们将找到歌词最相似的歌曲。
管道如下:
- 获取数据集中每个歌词的嵌入
- 获取文本输入的嵌入
- 计算文本输入与每个歌词的余弦相似度
- 返回相似度最高的歌曲
首先,你需要安装句子转换器。
pip install -U sentence-transformers
然后,导入必要的库。
import pandas as pd
import numpy as np
from scipy import spatial
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
我们使用的是“ all-MiniLM-L6-v2 ”相关模型,但是您可以在 SBERT 模型页面上找到更多的句子转换器。
我们来读一读,看看数据。
df.read_csv('lyrics.csv')
df.head(3)
现在,为了获得歌词的嵌入,我们使用了 model.encode 函数。
df=df.assign(embeddings=df['Lyric'].apply(lambda x: model.encode(x)))
df.head(3)
如您所见,我们得到了一个数据集,其中包含歌曲的属性以及歌词嵌入。
最后,我们创建了一个函数来获取输入的嵌入,然后计算余弦相似度,即 1-余弦距离,然后返回具有最高余弦相似度的 5 首歌曲。
def closest_lyrics(inp):
data=df.copy()
inp_vector=model.encode(inp)
s=data['embeddings'].apply(lambda x: 1 - spatial.distance.cosine(x, inp_vector) )
data=data.assign(similarity=s)
return(data.sort_values('similarity',ascending=False).head(5))
让我们来试试:
closest_lyrics('thinking about you')
如你所见,我们得到了与输入相关的歌曲。
举个例子,我创建了一个香水推荐应用,它根据风景、笔记或对香水的描述来推荐香水。
在这篇文章中,我们讨论了如何使用句子转换器来表示空间中的句子,以及如何使用余弦相似度根据语义找到最相似的句子。
- 订阅我的简讯
- 在 Linkedin 上关注我
最初发表于https://predictivehacks.com。
参考文献: 1。歌词数据集|Kaggle,许可证:CC0 公共领域。来源