Gensim: составьте список слов из модели Word2Vec - PullRequest
0 голосов
/ 10 мая 2019

У меня есть модель, обученная с Word2Vec. Это работает хорошо. Я хотел бы построить только список слов , которые я ввел в список. Я написал нижеприведенную функцию (и повторно использовал найденный код) и получаю следующее сообщение об ошибке при добавлении вектора в arr : 'ValueError: все входные массивы должны иметь одинаковое количество измерений'

def display_wordlist(model, wordlist):
    vector_dim = model.vector_size
    arr = np.empty((0,vector_dim), dtype='f') #dimension trained by the model
    word_labels = [word]

    # get words from word list and append vector to 'arr'
    for wrd in wordlist:
        word_array = model[wrd]
        arr = np.append(arr,np.array(word_array), axis=0) #This goes wrong

    # Use tsne to reduce to 2 dimensions
    tsne = TSNE(perplexity=65,n_components=2, random_state=0)
    np.set_printoptions(suppress=True)
    Y = tsne.fit_transform(arr)

    x_coords = Y[:, 0]
    y_coords = Y[:, 1]
    # display plot
    plt.figure(figsize=(16, 8)) 
    plt.plot(x_coords, y_coords, 'ro')

    for label, x, y in zip(word_labels, x_coords, y_coords):
        plt.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points')
    plt.xlim(x_coords.min()+0.00005, x_coords.max()+0.00005)
    plt.ylim(y_coords.min()+0.00005, y_coords.max()+0.00005)
    plt.show()

Ответы [ 2 ]

1 голос
/ 10 мая 2019

arr имеет форму (0, vector_dim), а word_array имеет форму (vector_dim,). Вот почему вы получаете эту ошибку.

Простая перестройка word_array делает свое дело:

word_array = model[wrd].reshape(1, -1)

Sidenote

Почему вы передаете список слов вместо того, чтобы "запрашивать" модель для него?

wordlist = list(model.wv.vocab)
0 голосов
/ 13 мая 2019

Спасибо. Теперь я изменил свой код, и он дает правильный результат:

def display_wordlist(model, wordlist):
    vectors = [model[word] for word in wordlist if word in model.wv.vocab.keys()]
    word_labels = [word for word in wordlist if word in model.wv.vocab.keys()]
    word_vec_zip = zip(word_labels, vectors)

    # Convert to a dict and then to a DataFrame
    word_vec_dict = dict(word_vec_zip)
    df = pd.DataFrame.from_dict(word_vec_dict, orient='index')

    # Use tsne to reduce to 2 dimensions
    tsne = TSNE(perplexity=65,n_components=2, random_state=0)
    np.set_printoptions(suppress=True)
    Y = tsne.fit_transform(df)

    x_coords = Y[:, 0]
    y_coords = Y[:, 1]
    # display plot
    plt.figure(figsize=(16, 8)) 
    plt.plot(x_coords, y_coords, 'ro')

    for label, x, y in zip(df.index, x_coords, y_coords):
        plt.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points')
    plt.xlim(x_coords.min()+0.00005, x_coords.max()+0.00005)
    plt.ylim(y_coords.min()+0.00005, y_coords.max()+0.00005)
    plt.show()
...