Как извлечь векторы из модели Word2Vec для кластеризации - PullRequest
1 голос
/ 30 апреля 2019

У меня есть модель word2vec, которую я обучил.Модель основана на корпусе из 95 000 слов.Я хотел бы выбрать только те слова в корпусе, которые, например, прилагательные.Для этого предположим, что у меня есть adj, список всех прилагательных в корпусе.Я хочу, чтобы они сохранили свои вложения по всему корпусу, но я хочу извлечь эти векторы и выполнить какой-то кластерный анализ только прилагательных.

Из того, что я понимаю, если у меня есть X,который является словарем из модели word2vec, я могу извлечь векторы всех прилагательных следующим образом:

adj = [ 'x', 'y', 'z']
X = model1[model1.wv.vocab]
adjvsm = []
for i in adj:
    adjvsm.append([i, X[i]])

Это создаст следующий список:

adjsvm[1]
['x', array([ 1.0772455 ,  0.481113  , -0.19076753, -0.31512445,  2.700769], dtype=float32)]

Обычно, если я хочу кластеризоватьМодель word2vec я бы сделал следующее:

kclusterer = KMeansClusterer(some_number_of_cluster, distance=nltk.cluster.util.cosine_distance, repeats=25)

assigned_clusters = kclusterer.cluster(X, assign_clusters=True)
print(assigned_clusters)

Что бы вывести список наподобие следующего, если бы я указал двоичный кластер:

x = 1
y = 0
z = 0

Конечно, это не работает,Одна проблема, которую я могу найти, состоит в том, что я вытаскиваю из пустого массива и помещаю в список, который kclustering не использует.Ему нравились массивы NumPy.

Мой вопрос: как извлечь набор (на основе списка идентификаторов слов) векторов из модели word2vec, сохранив их в виде массива и сохранив связь между идентификатором слова (например, 'у ') и вложения?

Спасибо за чтение!

1 Ответ

0 голосов
/ 30 апреля 2019

Вы уже знаете ответ.Создайте пустой массив.

X = np.array([model1[word] for word in adj])

Может быть, вы даже можете просто сделать

X = model1[adj]

Создание массивов смешанных данных, как вы это сделали, неэффективно.

...