Я делаю что-то о строках dedup. Мой главный рабочий поток:разреженное умножение матрицы вычисляет только верхний треугольник
df = pd.read_csv(some_path)
vect = TfidfVectorizer(min_df=1)
tfidf = vect.fit_transform(df.title.astype(unicode))
sml_matrix = (tfidf * tfidf.T)
sml_matrix = sml_matrix> similar_ratio
sml_matrix будет, как:
│CHEESE CHORES GEESE GLOVES
───────┼───────────────────────────
CHEESE │ 1 0.222 0.177 0.444
CHORES │0.222 1 0.422 0.333
GEESE │0.177 0.422 1 0.300
GLOVES │0.444 0.333 0.300 1
Очевидно, вычислить верхний треугольник sml_matrix является достаточно.
Но я не знаю, как вычислить только верхний треугольник с scipy.sparse матрицей (только forloop я могу себе представить, но, кажется, не так эффективно)
, например, петли (только псевдо-код):.
A = tfidf
T = tfidf.T
side_length = len(A)
for i in range(side_length):
for j in range(side_length):
if j < i:
# avoid calculate lower triangle and diagonal
continue
maxtrix[i,j] = A(i)* T(j)
из here, я вижу NumPy имеет np.apply_along_axis(d, 0, _)
только вычислить верхний треугольник, но scipy.sparse
нет.
обновление:
Независимо от того, как большой набор данных есть только вычислить верхний треугольник будет стоить меньше ресурсов центрального процессора resource.I не знаком с вычислением матрицы, любопытство не заставит меня задать этот вопрос (Как только вычислять верхний треугольник в разреженной матрице), а не для решения ошибки памяти.
Возможно, у вас возникнут проблемы с заполнением. 'tfidf * tfidf.T', вероятно, будет довольно плотным - например, если бы у вас был только один плотный столбец в' tfidf' (т.е. единственная функция, присутствующая во всех документах), тогда ваша 'sml_matrix' была бы на 100% плотной, даже если остальные ваши функции встречаются очень редко. Если вы предположили, что 'tfidf * tfidf.T' был полностью плотным, можете ли вы поместиться только в его верхний треугольник в памяти? –