gensim

2017-05-04 10 views
10

से उत्पन्न word2vec को विज़ुअलाइज़ करें मैंने gensim का उपयोग करके अपने स्वयं के कॉर्पस पर एक doc2vec और इसी शब्द 2vec को प्रशिक्षित किया है। मैं शब्दों के साथ टी-एसएन का उपयोग कर word2vec को विज़ुअलाइज़ करना चाहता हूं। जैसा कि, आकृति में प्रत्येक बिंदु के साथ "शब्द" भी है।gensim

मैं एक ऐसी ही सवाल यहाँ को देखा:

जी के रूप में आयात gensim आयात gensim.models

from sklearn.manifold import TSNE 
import re 
import matplotlib.pyplot as plt 

modelPath="/Users/tarun/Desktop/PE/doc2vec/model3_100_newCorpus60_1min_6window_100trainEpoch.bin" 
model = g.Doc2Vec.load(modelPath) 

X = model[model.wv.vocab] 
print len(X) 
print X[0] 
tsne = TSNE(n_components=2) 
X_tsne = tsne.fit_transform(X[:1000,:]) 

plt.scatter(X_tsne[:, 0], X_tsne[:, 1]) 
plt.show() 

इस के साथ एक आंकड़ा देता है: t-sne on word2vec

यह बाद, मैं इस कोड है डॉट्स लेकिन कोई शब्द नहीं। मुझे नहीं पता कि कौन सा बिंदु किस शब्द का प्रतिनिधि है। मैं डॉट के साथ शब्द कैसे प्रदर्शित कर सकता हूं?

उत्तर

20

उत्तर में दो भाग: शब्द लेबल कैसे प्राप्त करें, और स्कैटरप्लॉट पर लेबल कैसे प्लॉट करें।

gensim के word2vec

model.wv.vocab में

वर्ड लेबल {: सांख्यिक वेक्टर की वस्तु शब्द} का एक dict है। टी-एसएनई के लिए डेटा को X में लोड करने के लिए, मैंने एक बदलाव किया।

vocab = list(model.wv.vocab) 
X = model[vocab] 

यह दो बातें सिद्ध: (1) यह आप अंतिम dataframe प्लॉट करने के लिए के लिए एक स्टैंडअलोन vocab सूची हो जाता है, और (2) जब तुम सूचकांक model, तो आप यह सुनिश्चित करें कि आप शब्दों के क्रम जानते हो सकता है ।

के रूप में पहले

tsne = TSNE(n_components=2) 
X_tsne = tsne.fit_transform(X) 

अब के साथ आगे बढ़ें के vocab सूची के साथ X_tsne डाल दें। पांडा के साथ यह आसान है, इसलिए import pandas as pd यदि आपके पास अभी तक नहीं है।

df = pd.DataFrame(X_tsne, index=vocab, columns=['x', 'y']) 

vocab शब्द सूचकांक dataframe की अब कर रहे हैं।

मैं आपके डेटासेट की जरूरत नहीं है, लेकिन other SO में आप उल्लेख किया है, एक उदाहरण df sklearn के समाचार समूह का उपयोग करता है

मैं वस्तु उन्मुख तरह तरह

     x    y 
politics -1.524653e+20 -1.113538e+20 
worry  2.065890e+19 1.403432e+20 
mu   -1.333273e+21 -5.648459e+20 
format  -4.780181e+19 2.397271e+19 
recommended 8.694375e+20 1.358602e+21 
arguing  -4.903531e+19 4.734511e+20 
or   -3.658189e+19 -1.088200e+20 
above  1.126082e+19 -4.933230e+19 

scatterplot कुछ ऐसा दिखाई देगा matplotlib के लिए दृष्टिकोण, तो यह थोड़ा अलग शुरू होता है।

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1) 

ax.scatter(df['x'], df['y']) 

आखिरकार, annotate विधि समन्वय लेबल करेगी। पहले दो तर्क टेक्स्ट लेबल और 2-टुपल हैं। iterrows() का उपयोग करना, यह बहुत ही संक्षिप्त हो सकता है:

for word, pos in df.iterrows(): 
    ax.annotate(word, pos) 

[धन्यवाद इस सुझाव के लिए टिप्पणियों में रिकार्डो के लिए।]

फिर plt.show() या fig.savefig() है।आपके डेटा के आधार पर, आपको घने बादल में देखने के लिए शायद ax.set_xlim और ax.set_ylim के साथ गड़बड़ करनी होगी।

scatterplot

आप डॉट आकार, रंग, आदि, भी संशोधित कर सकते हैं: यह किसी भी फेरबदल के बिना समाचार समूह उदाहरण है। हैप्पी फाइन-ट्यूनिंग!

+1

महान काम! मैं इस कोड सरलीकरण का सुझाव देता हूं: 'df = pd.DataFrame (X2, vocab, ['x', 'y']) 'और फिर' शब्द के लिए, df.iterrows में pos(): plt.annotate (शब्द, pos) '। यानी शब्दों को इंडेक्स के रूप में उपयोग करें। आप 'concat' और अन्य लाइनों से छुटकारा पा सकते हैं। –

+2

ने आपके दो बदलाव किए: 'vocab' डीएफ इंडेक्स और' iterrows 'सरलीकरण के रूप में। धन्यवाद, @ रिकार्डोक्रूज़! –

संबंधित मुद्दे