【问题标题】:Why I have a different number of terms in word2vec and TFIDF? How I can fix it?为什么我在 word2vec 和 TFIDF 中有不同数量的术语?我该如何解决?
【发布时间】:2020-06-15 02:24:22
【问题描述】:

我需要将 TFIDF 矩阵中项的权重乘以 word2vec 矩阵的词嵌入,但我不能这样做,因为每个矩阵都有不同数量的项。 我使用相同的语料库来获取两个矩阵,我不知道为什么每个矩阵的项数不同 .

我的问题是我有一个形状为 (56096, 15500) 的矩阵 TFIDF (对应于:术语数,文档数)和形状为 (300, 56184) 的矩阵 Word2vec (对应于:单词嵌入数,数字条款)。
而且我需要两个矩阵中相同数量的项。

我用这段代码来获取词嵌入Word2vec的矩阵:

def w2vec_gensim(norm_corpus):
    wpt = nltk.WordPunctTokenizer()
    tokenized_corpus = [wpt.tokenize(document) for document in norm_corpus]
    # Set values for various parameters
    feature_size = 300
    # Word vector dimensionality
    window_context = 10
    # Context window size
    min_word_count = 1
    # Minimum word count
    sample = 1e-3
    # Downsample setting for frequent words
    w2v_model = word2vec.Word2Vec(tokenized_corpus, size=feature_size, window=window_context, min_count =  min_word_count, sample=sample, iter=100)
    words = list(w2v_model.wv.vocab)
    vectors=[]
    for w in words:
        vectors.append(w2v_model[w].tolist())
    embedding_matrix= np.array(vectors)
    embedding_matrix= embedding_matrix.T
    print(embedding_matrix.shape)

    return embedding_matrix

获取 TFIDF 矩阵的代码:

tv = TfidfVectorizer(min_df=0., max_df=1., norm='l2', use_idf=True, smooth_idf=True)


def matriz_tf_idf(datos, tv):
    tv_matrix = tv.fit_transform(datos)
    tv_matrix = tv_matrix.toarray()
    tv_matrix = tv_matrix.T
    return tv_matrix

而且我需要每个矩阵中的项数相同。例如,如果我在 TFIDF 中有 56096 个术语,我需要在嵌入矩阵中使用相同的数字,我的意思是形状为 (56096, 1550) 的矩阵 TFIDF 和形状为 (300, 56096) 的嵌入矩阵 Word2vec。如何在两个矩阵中获得相同数量的项? 因为没有更多数据我无法删除,因为我需要乘法才有意义,因为我的目标是从文档中获取嵌入。

非常感谢您。

【问题讨论】:

  • 不要因反对票而灰心。您的问题看起来令人生畏和复杂,但可能有一个简单的答案。为了帮助您和我们,请查看stackoverflow.com/help/minimal-reproducible-example,了解如何生成我们可以提供帮助的最小且可重复的示例,然后将其扩展到您的项目。

标签: python matrix word2vec embedding


【解决方案1】:

问题在于 TFIDF 删减了大约 90 个术语。这是因为标记化是必要的。 这是解决方案:

wpt = nltk.WordPunctTokenizer()
tv = TfidfVectorizer(min_df=0., max_df=1., norm='l2', use_idf=True, smooth_idf=True,
                     tokenizer=wpt.tokenize)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多