这段代码按预期工作,并计算两个嵌入之间的cosign距离。但它需要很多时间。我有成千上万的记录要检查,我正在寻找一种方法,使它更快。
import pandas as pd
import numpy as np
from numpy import dot
from numpy.linalg import norm
import ast
df = pd.read_csv("https://testme162.s3.amazonaws.com/cosign_dist.csv")
for k, i in enumerate(df["embeddings"]):
df["dist" + str(k)] = df.embeddings.apply(
lambda x: dot(ast.literal_eval(x), ast.literal_eval(i))
/ (norm(ast.literal_eval(x)) * norm(ast.literal_eval(i)))
)
2条答案
按热度按时间lstz6jyr1#
不是在循环中多次应用
ast.literal_eval
,而是使用converters
选项一次加载具有所需结构的输入csv文件,以便使用numpy.fromstring
例程将所有'embeddings'
列数组字符串表示转换为"实数"数组。在上面的过程中,在我的测量中,
numpy.fromstring
比converters = {'embeddings': ast.literal_eval}
快6倍,尽管后者反过来比您最初的方法快。然后,为避免使用新的
dist<num>
列插入多个 Dataframe ,请将for
循环替换为pd.concat
:最终结果(前3条记录的片段):
一个二个一个一个
4xrmg8kj2#
我试图给出一个解决方案,为数据
embeddings
创建一个数据库,然后用库scipy.spatial.distance
计算距离,df3
是您预期的结果。它为您提供了包括加载数据在内的运行时间:
运行时间:2.0602212000012514秒
不包括加载数据:
运行时间:0.7129389000001538秒