Используйте функцию wmd gensim для кластеризации предложений - PullRequest
0 голосов
/ 18 октября 2019

У меня есть список предложений. Я хочу сгруппировать свои предложения по сходству, используя ОМУ (дистанция словарей). Я использую модель word2vec из gensim для создания вложений для моих слов.

Алгоритмы кластеризации, которые я знаю (nltk, sklearn), используют числовые векторы в качестве входных данных, поэтому мне нужно дать предложения в виде массива (или списка)из вложений слов в них. Я думаю, что я могу использовать методы кластеризации nltk с пользовательской функцией расстояния. Я хочу использовать оружие массового поражения в качестве своей пользовательской функции. Но функция WMD gensim использует 2 списка строк в качестве входных данных.

Есть ли предварительно встроенная функция WMD, которая использует вложения, а не строки в качестве входных данных? Или есть кластеризация (kmeans или что-то еще), которая может обрабатывать списки строк в качестве входных данных и может иметь ОМУ в качестве пользовательской функции расстояния?

Спасибо

1 Ответ

0 голосов
/ 20 октября 2019

Алгоритмы кластеризации не принимают строки (или списки-строки-токены) в качестве входных данных. Скорее всего, вам всегда придется предварительно обрабатывать тексты в виде числовых данных для использования алгоритмом кластеризации.

Но в качестве документации для кластеризации 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] -образный ввод.

Я не уверен, что это будет работать так же хорошо, как алгоритм, разработанный для такого ввода, но если вы потратили время на вычисление всех парных расстояний (или сходств), стоит попробовать,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...