为什么我在 word2vec 和 TFIDF 中有不同数量的术语?我该如何解决?
Why I have a different number of terms in word2vec and TFIDF? How I can fix it?
我需要将 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。如何在两个矩阵中获得相同数量的项?
因为没有更多数据我无法删除,因为我需要乘法才能有意义,因为我的目标是从文档中获取嵌入。
非常感谢您。
问题在于 TF IDF 删除了大约 90 个术语。这是因为标记化是必要的。
这是解决方案:
wpt = nltk.WordPunctTokenizer()
tv = TfidfVectorizer(min_df=0., max_df=1., norm='l2', use_idf=True, smooth_idf=True,
tokenizer=wpt.tokenize)
我需要将 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。如何在两个矩阵中获得相同数量的项?
因为没有更多数据我无法删除,因为我需要乘法才能有意义,因为我的目标是从文档中获取嵌入。
非常感谢您。
问题在于 TF IDF 删除了大约 90 个术语。这是因为标记化是必要的。 这是解决方案:
wpt = nltk.WordPunctTokenizer()
tv = TfidfVectorizer(min_df=0., max_df=1., norm='l2', use_idf=True, smooth_idf=True,
tokenizer=wpt.tokenize)