本文介绍各种用于向量检索的向量相似性计算方法,将会简单介绍各种方法的优缺点等信息,并用toy example给出代码示例。
使用sklearn.metrics.pairwise.cosine_similarity实现。
最终得到的值会在[-1,1]之间。
API官方文档:sklearn.metrics.pairwise.cosine_similarity — scikit-learn 1.1.2 documentation
对计算公式的介绍:https://scikit-learn.org/stable/modules/metrics.html#cosine-similarity
计算公式:
k
(
x
,
y
)
=
x
y
⊤
∥
x
∥
∥
y
∥
k(x, y) = \frac{x y^\top}{\|x\| \|y\|}
k(x,y)=∥x∥∥y∥xy⊤
计算一组向量之间的两两相似度,代码撰写方法:
from sklearn.metrics.pairwise import cosine_similarity
cos_sim_matrix = cosine_similarity(train_feature)
#入参是一个二维矩阵,每行是一个样本特征
使用sklearn.metrics.pairwise.linear_kernel实现。
API官方文档:sklearn.metrics.pairwise.linear_kernel — scikit-learn 1.1.2 documentation
计算公式:
k
(
x
,
y
)
=
x
⊤
y
k(x, y) = x^\top y
k(x,y)=x⊤y
pip install annoy#用TFIDF做向量(一个做文本表征的示例),然后用annoy算法计算相似度
#TFIDF部分
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf=TfidfVectorizer(max_features=500)
sp_tfidf=tfidf.fit_transform(corpus) #corpus是一个文本列表
#annoy部分
from annoy import AnnoyIndex
from tqdm import tqdm
#存储
f=sp_tfidf.shape[1] # Length of item vector that will be indexed
t = AnnoyIndex(f, 'angular')
for i in tqdm(range(len(corpus))):
t.add_item(i, sp_tfidf[i].toarray().squeeze()) #第2个元素是一个数组
t.build(10) # 10 trees
t.save('存储路径.ann')
#调用
u = AnnoyIndex(f, 'angular')
u.load('存储路径.ann') # super fast, will just mmap the file
print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors
#返回值是向量的索引
#如果用get_nns_by_vector的话第一个入参就改成向量,如sp_tfidf[0].toarray().squeeze()
一般来说顺序是先检索(返回一个集合)然后再排序