Почему у меня разное количество терминов в word2ve c и TFIDF? Как я могу это исправить? - PullRequest
0 голосов
/ 02 марта 2020

Мне нужно умножить веса терминов в матрице TFIDF на вложения слов матрицы word2ve c, но я не могу этого сделать, потому что каждая матрица имеет различное количество терминов. Я использую один и тот же корпус для получения обеих матриц, я не знаю, почему у каждой матрицы разное количество терминов.

Моя проблема в том, что у меня есть матрица TFIDF с формой (56096, 15500) (соответствует: количество терминов, количество документов) и матрица Word2ve c с формой (300, 56184) (соответствует: количество вложений слов, количество терминов).
И мне нужно то же самое количество членов в обеих матрицах.

Я использую этот код для получения матрицы вложения слов Word2ve c:

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

И мне нужно одинаковое количество терминов в каждой матрице. Например, если у меня есть 56096 членов в TFIDF, мне нужно такое же число в матрице вложений, я имею в виду матрицу TFIDF с формой (56096, 1550) и матрицу вложений Word2ve c с формой (300, 56096). Как я могу получить одинаковое количество терминов в обеих матрицах? Поскольку я не могу удалить без большего количества данных, мне нужно умножение, чтобы иметь смысл, потому что моя цель - получить вложения из документов.

Большое спасибо заранее.

1 Ответ

0 голосов
/ 12 марта 2020

Проблема в том, что TFIDF исключает около 90 терминов. Это потому, что токенизация необходима. Это решение:

wpt = nltk.WordPunctTokenizer()
tv = TfidfVectorizer(min_df=0., max_df=1., norm='l2', use_idf=True, smooth_idf=True,
                     tokenizer=wpt.tokenize)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...