Ваш kmeans_model
ожидает вектор признаков, аналогичный тому, который был предоставлен во время первоначальной кластеризации, а не токены списка строк, которые вы получите от gensim.simple_preprocess()
.
Фактически, вы хотите использовать модель Doc2Vec
, чтобы взять такие списки токенов и превратить их в совместимые с моделью векторы с помощью метода infer_vector()
.Например:
testdoc_words = gensim.utils.simple_preprocess('Microsoft excel')
testdoc_vector = d2vmodel.infer_vector(testdoc_words)
cluster_label = kmeans_model.predict(array(testdoc_vector))
Обратите внимание, что как Doc2Vec
, так и логический вывод лучше работают с документами длиной не менее десятков слов (а не крошечными 2-словосочетаниями, такими как ваш тест здесь), и этот вывод можеттакже часто полезно использовать необязательный параметр epochs
больше, чем по умолчанию (особенно для коротких документов).
Обратите внимание, что ваш тестовый документ должен быть действительно предварительно обработан и токенизирован точно так же, как ваши данные обучения - поэтому, если для подготовки train_corpus
использовался какой-то другой процесс, используйте тот же процесс для документов после обучения.(Слова, не распознаваемые моделью Doc2Vec
, поскольку они не присутствовали во время обучения, будут игнорироваться, поэтому ошибка, такая как выполнение другого стиля выравнивания регистра во время вывода, значительно ослабит результаты.)