Алгоритмы кластеризации не принимают строки (или списки-строки-токены) в качестве входных данных. Скорее всего, вам всегда придется предварительно обрабатывать тексты в виде числовых данных для использования алгоритмом кластеризации.
Но в качестве документации для кластеризации scikit-learn
примечания:
Важно отметить, что алгоритмы, реализованные в этом модуле, могут принимать различные виды матрицы в качестве входных данных. Все методы принимают стандартные матрицы данных формы [n_samples, n_features]
. Их можно получить из классов в модуле sklearn.feature_extraction
. Для AffinityPropagation
, SpectralClustering
и DBSCAN
можно также ввести матрицы подобия формы [n_samples, n_samples]
. Они могут быть получены из функций в модуле sklearn.metrics.pairwise
.
Для дальнейшего разъяснения того, что он говорит: если алгоритм принимает ввод формы [n_samples, n_features]
, то он предполагает, что каждый из ваших текстов имеетуже был уменьшен до вектора фиксированного размера (размером n_features
). Такие вычисления, как «Расстояние для Word Mover», по сути не сводят один текст к вектору фиксированного размера - как вы заметили, ОМУ работает только с парами текстов. Таким образом, вы не сможете напрямую использовать ОМУ для преобразования отдельных текстов в n_features
-мерные векторы этих алгоритмов. (Но также: см. «Заключительную ноту» внизу.)
С другой стороны, если алгоритм способен принимать входные данные формы [n_samples, n_samples]
, то ему нужны все возможные попарные сходства. Это можно предварительно рассчитать, используя ОМУ, в нескольких циклах над вашими текстами (или с помощью служебной функции scikit-learn
pairwise_distances()
). И обратите внимание, что для этих scikit-learn
алгоритмов необходимо указать affinity='precomputed'
и ожидать значения подобия , где более похожие пары возвращают более высокие значения, а не значения distance , где более похожиепары возвращают более высокие значения. Таким образом, вам нужно преобразовать расстояния ОМУ в какую-то шкалу сходства. (Один простой способ, который может быть достаточным, - это отменить значение расстояния.)
Например, если texts
включает все ваши (токенизированные) тексты и wv
ваши gensim
слова-векторы:
import numpy as np
from sklearn.metrics import pairwise_distances
dist_matrix = pairwise_distances(texts, lambda t1, t2: wv.wmdistance(t1, t2))
sim_matrix = -dist_matrix
То, что sim_matrix
должно работать внутри одного из scikit-learn
алгоритмов, который принимает опцию affinity='precomputed'
.
Но будьте осторожны: ОМУ довольно дорого для вычисления (особенно для длинных текстов)поэтому в зависимости от размера вашего набора предложений простое предварительное вычисление всех парных расстояний может занять очень много времени.
Последнее замечание: вы также можете рассмотреть, как и в случае с матрицей сходства, преобразование вашего индивидуума. тексты в векторы фиксированного размера с использованием вычислений ОМУ, но путем преобразования каждого текста в вектор его расстояний (или сходств) в всех других текстов .
То есть, по сути, используйте тот же парный процесс, описанный выше - но затем передайте полученную матрицу в один из алгоритмов, которые принимают [n_samples, n_features]
-образный ввод.
Я не уверен, что это будет работать так же хорошо, как алгоритм, разработанный для такого ввода, но если вы потратили время на вычисление всех парных расстояний (или сходств), стоит попробовать,