我有一個由單個推文(id、text、author_id、nn_list)組成的資料框,其中 nn_list 是其他推文索引的串列,這些索引以前被確定為潛在的最近鄰居。現在我必須通過查看 tfidf 矩陣中的索引來比較向量來計算索引和此串列中每個條目的余弦相似度,但使用我目前的方法,這有點慢。當前代碼如下所示:
for index, row in data_df.iterrows():
for candidate in row["nn_list"]:
candidate_cos = float("%.2f" % pairwise_distances(tfidf_matrix[candidate], tfidf_matrix[index], metric='cosine'))
if candidate_cos < nn_distance:
current_nn_candidate = candidate
nn_distance = candidate_cos
有沒有明顯更快的方法來計算這個?
uj5u.com熱心網友回復:
假設您的 ID 范圍不是太大,以下代碼應該可以作業:
import pandas as pd
import numpy as np
from scipy.sparse import csr_matrix
from sklearn.metrics.pairwise import cosine_similarity
df = pd.DataFrame({"nn_list": [[1, 2], [1,2,3], [1,2,3,7], [11, 12, 13], [2,1]]})
# Data consistent with https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html
df["data"] = df["nn_list"].apply(lambda x: np.repeat(1, len(x)))
df["row"] = df.index
df["row_ind"] = df[['row', 'nn_list']].apply(lambda x: np.repeat(x[0], len(x[1])), axis=1)
df["col_ind"] = df['nn_list'].apply(lambda x: np.array(x))
m = csr_matrix(
(np.concatenate(df['data']),
(np.concatenate(df['row_ind']), np.concatenate(df['col_ind']))))
cosine_similarity(m)
將回傳:
array([[1. , 0.81649658, 0.70710678, 0. , 1. ],
[0.81649658, 1. , 0.8660254 , 0. , 0.81649658],
[0.70710678, 0.8660254 , 1. , 0. , 0.70710678],
[0. , 0. , 0. , 1. , 0. ],
[1. , 0.81649658, 0.70710678, 0. , 1. ]])
如果您有更大范圍的 ID,我建議使用 spark 或使用 numpy 在大型稀疏矩陣上查看余弦相似度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371126.html
上一篇:創建一個流以生成三個的倍數
