2016-09-02 9 views
1

Я хотел бы построить в простом векторном пространстве график сходства между разными словами. Я вычислил их, используя модель word2vec, данную gensim, но я не могу найти графических примеров в литературе. Мой код выглядит следующим образом:Графический сюжет схожести слов, заданный Word2Vec

## Libraries to download 
from nltk.tokenize import RegexpTokenizer 
from nltk.corpus import stopwords 
from nltk.stem.porter import PorterStemmer 
from gensim import corpora, models 
import gensim 

import json 
import nltk 
import re 
import pandas 


appended_data = [] 


#for i in range(20014,2016): 
# df0 = pandas.DataFrame([json.loads(l) for l in open('SDM_%d.json' % i)]) 
# appended_data.append(df0) 

for i in range(2005,2016): 
    if i > 2013: 
     df0 = pandas.DataFrame([json.loads(l) for l in open('SDM_%d.json' % i)]) 
     appended_data.append(df0) 
    df1 = pandas.DataFrame([json.loads(l) for l in open('Scot_%d.json' % i)]) 
    df2 = pandas.DataFrame([json.loads(l) for l in open('APJ_%d.json' % i)]) 
    df3 = pandas.DataFrame([json.loads(l) for l in open('TH500_%d.json' % i)]) 
    df4 = pandas.DataFrame([json.loads(l) for l in open('DRSM_%d.json' % i)]) 
    appended_data.append(df1) 
    appended_data.append(df2) 
    appended_data.append(df3) 
    appended_data.append(df4) 


appended_data = pandas.concat(appended_data) 
# doc_set = df1.body 

doc_set = appended_data.body 

## Building the deep learning model 
import itertools 

sent_detector = nltk.data.load('tokenizers/punkt/english.pickle') 
sentenized = doc_set.apply(sent_detector.tokenize) 
sentences = itertools.chain.from_iterable(sentenized.tolist()) # just to flatten 

from gensim.models import word2vec 


result = [] 
for sent in sentences: 
    result += [nltk.word_tokenize(sent)] 

model = gensim.models.Word2Vec(result) 

В простом векторном пространстве графа, я хотел бы поставить следующие слова: банк, финансы, рынок, недвижимость, нефть, энергетика, бизнес и экономика. Я могу легко вычислить сходство этих пар слов с функцией:

model.similarity('bank', 'property') 
0.25089364531360675 

Большое спасибо

+1

Учтите, что 'gensim.models.Word2Vec' по умолчанию производит 100-мерные векторы слов. Сначала нужно уменьшить размерность, если вы хотите построить положение вектора (до 2 или 3 измерения). –

+0

Очень хорошее предложение @ Альваро. У меня этого не было. Тем не менее, исходя из результатов, полученных с помощью функциональной модели. Я хотел бы ожидать простого способа построения расстояния в плоскости. –

+1

Уменьшение размерности - это то, что Микилов и др. [в своей статье] (https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-the-compositionality.pdf) (см. рисунок 2). К сожалению, я не думаю, что есть другой путь. –

ответ

2

Для построения всех слов-векторов в модели Word2Vec, вам необходимо выполнить снижение размерности. Вы можете использовать инструмент TSNE из sklearn python для визуализации многомерных векторов в двумерном пространстве.

t-distributed Stochastic Neighbor Embedding.

import sklearn.manifold.TSNE 

tsne = sklearn.manifold.TSNE(n_components = 0 , random_state = 0) 
all_vector_matrix = model.syn0 
all_vector_matrix_2d = tsne.fit_transform(all_vector_matrix) 

Это даст вам схожести матрицу 2-D, который можно дополнительно анализировать через панда, а затем сюжет с использованием Сиборна и функции pyplot Matplotlib в.