【问题标题】:How to run tsne on word2vec created from gensim?如何在从 gensim 创建的 word2vec 上运行 tsne?
【发布时间】:2016-11-14 02:17:09
【问题描述】:

我想可视化从 gensim 库创建的 word2vec。我尝试了 sklearn,但似乎我需要安装开发人员版本才能获得它。我尝试安装开发人员版本,但这在我的机器上不起作用。是否可以修改此代码以可视化 word2vec 模型?

tsne_python

【问题讨论】:

    标签: scikit-learn gensim word2vec


    【解决方案1】:

    您不需要 scikit-learn 的开发人员版本 - 只需通过 pipconda 的常用方式 install scikit-learn

    要访问由 word2vec 创建的词向量,只需使用字典作为模型的索引:

    X = model[model.wv.vocab]
    

    以下是一个简单但完整的代码示例,它加载一些新闻组数据,应用非常基本的数据准备(清理和分解句子),训练 word2vec 模型,使用 t-SNE 减少维度,并可视化输出。

    from gensim.models.word2vec import Word2Vec
    from sklearn.manifold import TSNE
    from sklearn.datasets import fetch_20newsgroups
    import re
    import matplotlib.pyplot as plt
    
    # download example data ( may take a while)
    train = fetch_20newsgroups()
    
    def clean(text):
        """Remove posting header, split by sentences and words, keep only letters"""
        lines = re.split('[?!.:]\s', re.sub('^.*Lines: \d+', '', re.sub('\n', ' ', text)))
        return [re.sub('[^a-zA-Z]', ' ', line).lower().split() for line in lines]
    
    sentences = [line for text in train.data for line in clean(text)]
    
    model = Word2Vec(sentences, workers=4, size=100, min_count=50, window=10, sample=1e-3)
    
    print (model.wv.most_similar('memory'))
    
    X = model.wv[model.wv.vocab]
    
    tsne = TSNE(n_components=2)
    X_tsne = tsne.fit_transform(X)
    
    plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
    plt.show()
    

    【讨论】:

    • DeprecationWarning 使用 model[..] 更改为 - model.wv[model.wv.vocab]
    • 谢谢,我更新了答案以删除当前 gensim 版本的弃用警告。
    【解决方案2】:

    使用下面的代码,而不是 X,使用 numpy.vstack 将所有单词嵌入垂直连接到矩阵 X 中,然后 fit_transform 它。

    import numpy as np
    from sklearn.manifold import TSNE
    X = np.array([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]])
    model = TSNE(n_components=2, random_state=0)
    np.set_printoptions(suppress=True)
    model.fit_transform(X) 
    

    fit_transform 的输出形状为 vocab_size x 2,因此您可以对其进行可视化。

    vocab = sorted(word2vec_model.get_vocab()) #not sure the exact api
    emb_tuple = tuple([word2vec_model[v] for v in vocab])
    X = numpy.vstack(emb_tuple)
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      相关资源
      最近更新 更多