【发布时间】:2019-02-25 01:09:50
【问题描述】:
我正在尝试在预矢量化的数据库表上实现余弦相似度搜索(如三元相似度),具有此结构中的对象:
from django.contrib.postgres.fields import ArrayField
from django.db import models
class Information(object):
vectorized = ArrayField(models.FloatField(default=0.0)) # will contain 512-dimensional vector of floats
original_data = models.TextField(blank=True)
original_data_length = models.IntegerField(default=0)
其中属性vectorized 将包含从original_data 生成的512 维向量。
例如,用户输入一个字符串“什么是苹果?”:
- 输入转换为512维向量
A。 -
A遍历数据库上的所有对象x(或不遍历)。 - 在每次迭代中,在
A和x.vectorized之间计算归一化点积(余弦相似度)(请参阅cosine similarity definition)。 -
选择相似度最高的
x对象(与A的最高归一化内积),并打印出x.original_data。
我为此目的实现了简单的代码,它效率低下,因为它是在框架级别而不是数据库级别执行的,并且为数据库表中的所有对象分配了内存:
from core.models import Information
from numpy import dot # dot product = inner product limited for real numbers
from numpy.linalg import norm
user_input = user_input # let this be 512 dimensional vector converted from user input
most_similar = ("", 0)
for item in Information.objects.all():
similarity = dot(item, user_input)/norm(item, user_input)
if similarity > most_similar[1]:
most_similar = (item.original_data, similarity)
print(most_similar[0])
有什么方法可以实现上面代码的更有效的方法吗?
有没有办法使用 PostgreSQL 做到这一点?
谢谢!
【问题讨论】:
-
您找到解决方案了吗?我也有同样的问题。
标签: sql django postgresql search cosine-similarity