2016-03-23 2 views
2

Я вычислил модель word2vec с использованием python и gensim в моем корпусе.Использование NearestNeighbors и word2vec для определения сходства предложений

Затем я вычислил средний вектор word2vec для каждого предложения (усредняющий все векторы для всех слов в предложении) и сохранил его в кадре данных pandas. Столбцы панд кадра df данных являются:

  • предложение
  • Название книги (книги, где предложение исходит от)
  • среднего вектора (среднее из word2vec векторов в предложении - размер 100)

Я пытаюсь использовать scikit-learnNearestNeighbors обнаружить высказывание подобия (я мог бы использовать doc2vec вместо этого, но одна из целей, чтобы сравнить этот метод против doc2vec).

Это мой код:

X = df['mean_vector'].values 
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X) 

Я получаю следующее сообщение об ошибке:

ValueError: setting an array element with a sequence. 

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

Это данные первой ячейки в df['mean_vector'][0]. Это полный векторный размер 100, усредненный по векторам предложения.

array([ -2.14208905e-02, 2.42093615e-02, -5.78106642e-02, 
    1.32915592e-02, -2.43393257e-02, -1.41872400e-02, 
    2.83471867e-02, -2.02910602e-02, -5.49359620e-02, 
    -6.70913085e-02, -5.56188896e-02, -2.95186806e-02, 
    4.97652516e-02, 7.16793686e-02, 1.81338750e-02, 
    -1.50108105e-02, 1.79438610e-02, -2.41483524e-02, 
    4.97504435e-02, 2.91026086e-02, -6.87966943e-02, 
    3.27585079e-02, 5.10644279e-02, 1.97029337e-02, 
    7.73109496e-02, 3.23865712e-02, -2.81659551e-02, 
    -9.69715789e-03, 5.23059331e-02, 3.81100960e-02, 
    -3.62489261e-02, -3.40068117e-02, -4.90736961e-02, 
    8.72346922e-04, 2.27111522e-02, 1.06063476e-02, 
    -3.93234752e-02, -1.10617064e-01, 8.05142429e-03, 
    4.56497036e-02, -1.73281748e-02, 2.35153548e-02, 
    5.13465842e-03, 1.88336968e-02, 2.40451116e-02, 
    3.79024050e-03, -4.83284928e-02, 2.10295208e-02, 
    -4.92134318e-03, 1.01532964e-02, 8.02216958e-03, 
    -6.74675079e-03, -1.39653292e-02, -2.07276996e-02, 
    9.73508134e-03, -7.37899616e-02, -2.58320477e-02, 
    -1.10700730e-05, -4.53227758e-02, 2.31859135e-03, 
    1.40053956e-02, 1.61973312e-02, 3.01702786e-02, 
    -6.96818605e-02, -3.47468331e-02, 4.79541793e-02, 
    -1.78820305e-02, 5.99209731e-03, -5.92620336e-02, 
    7.34678581e-02, -5.23381204e-05, -5.07357903e-02, 
    -2.55154949e-02, 5.06089740e-02, -3.70467864e-02, 
    -2.04878468e-02, -7.62404222e-03, -5.38200373e-03, 
    7.68705690e-03, -3.27000804e-02, -2.18365286e-02, 
    2.34392099e-03, -3.02998684e-02, 9.42565035e-03, 
    3.24523374e-02, -1.10793915e-02, 3.06244520e-03, 
    -1.82240941e-02, -5.70741761e-03, 3.13486941e-02, 
    -1.15621388e-02, 1.10221673e-02, -3.55655849e-02, 
    -4.56304513e-02, 5.54837054e-03, 4.38252240e-02, 
    1.57828294e-02, 2.65670624e-02, 8.08797963e-03, 
    4.55569401e-02], dtype=float32) 

Я также пытался сделать:

for vec in df['mean_vector']: 
X = vec 
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X) 

Но я только получаю следующее предупреждение:

DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. 

Если есть пример на GitHub с помощью word2vec и NearestNeighbors в подобном сценарий, который я хотел бы увидеть.

+1

как же X выглядит? можете ли вы обновить вопрос с помощью примера X? –

+0

Нужны некоторые данные для MWE. Я просто тестировал 'NearestNeighbors', используя данные из' gensim', и это работало отлично для меня, хотя. – ncfirth

+0

@Abhishek Thakur Я добавил примерный вектор (есть один для каждого предложения в корпусе, поэтому он довольно много). – Enzo

ответ

2

Причина, по которой вы редактируете ошибку, заключается в том, что sklearn ожидает двумерный вход, каждый из которых находится в новой строке. Вы можете либо использовать X.reshape(1, -1), либо [X], первая - это лучшая практика. Без необработанных данных или надлежащего MWE трудно сказать, что это происходит неправильно, но я предполагаю, что что-то не так, если вы помещаете данные в или из фрейма данных. Убедитесь, что X.shape имеет смысл для вас.

Ниже приведен пример, который я использовал, чтобы проверить все работало для меня:

from sklearn.neighbors import NearestNeighbors 
from gensim.models import Word2Vec 
import numpy as np 

a = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore 
magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea 
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla 
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est 
laborum.""" 
a = [x.split(' ') for x in a.split('\n') if len(x)] 
model = Word2Vec(a, min_count=1) 

# Get the average of all of the words to get data for a sentence 
b = np.array([np.mean([model[xx] for xx in x], axis=0) for x in a]) 
# Check it's the correct shape 
print b.shape 

nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(b) 
+0

Я полагаю, что моя проблема в том, что я использую dataframe pandas для хранения средних векторов. 'Печать (ДФ [ 'mean_vector'].shape) 'дает' (67680,) 'но' X = df ['mean_vector']. reshape (1, -1) 'и' nbrs = NearestNeighbors (n_neighbors = 2, algorithm = 'ball_tree'). fit (X) 'все еще дает' установку элемента массива с последовательностью. ' – Enzo

+0

Сколько предложений есть в вашем dataframe, 67680? Если это так, можно ожидать, что размер 'X' будет возвращен' (67680,100) ' – ncfirth

+0

Глядя на ваш пример (очень полезно!), Я вроде бы думаю, что проблема в форме моего фрейма данных. Не знаю, как это исправить ... – Enzo

Смежные вопросы