Как получить TF, используя только TfidfVectorizer? - PullRequest
1 голос
/ 05 октября 2019

У меня есть такой код:

 corpus = [
        'This is the first document.',
        'This document is the second document.',
        'And this is the third one.',
        'This document is the fourth document.',
        'And this is the fifth one.',
        'This document is the sixth.',
        'And this is the seventh one document.',
        'This document is the eighth.',
        'And this is the nineth one document.',
        'This document is the second.',
        'And this is the tenth one document.',
    ]

    vectorizer = skln.TfidfVectorizer() 
    X = vectorizer.fit_transform(corpus)
    tfidf_matrix = X.toarray()
    accumulated = [0] * len(vectorizer.get_feature_names())

    for i in range(tfidf_matrix.shape[0]):
        for j in range(len(vectorizer.get_feature_names())):
            accumulated[j] += tfidf_matrix[i][j]

    accumulated = sorted(accumulated)[-CENTRAL_TERMS:]
    print(accumulated)

, где я печатаю CENTRAL_TERMS слова, которые получают самые высокие оценки tf-idf среди всех документов корпуса.

Тем не менее, я также хочу получить слова MOST_REPEATED_TERMS для всех документов корпуса. Это слова, которые имеют самые высокие оценки. Я знаю, что могу получить, просто используя CountVectorizer, но я хочу использовать только TfidfVectorizer (чтобы не выполнять сначала vectorizer.fit_transform(corpus) для TfidfVectorizer и затем vectorizer.fit_transform(corpus) для CountVectorizer. IТакже я знаю, что сначала я мог бы использовать CountVectorizer (для получения tf-баллов), а затем TfidfTransformer (для получения tf-idf-баллов). *

Дайте мне знать, если есть способ сделать это (любая информация приветствуется).

Ответы [ 2 ]

1 голос
/ 06 октября 2019

По умолчанию TfidfVectorizer выполняет нормализацию l2 после умножения tf и idf. Следовательно, мы не можем получить частоту термина, когда у вас есть norm='l2'. См. здесь и здесь

Если вы можете работать без нормы, тогда есть решение.

import scipy.sparse as sp
import pandas as pd 

vectorizer = TfidfVectorizer(norm=None) 
X = vectorizer.fit_transform(corpus)
features = vectorizer.get_feature_names()
n = len(features)
inverse_idf = sp.diags(1/vectorizer.idf_,
                       offsets=0,
                       shape=(n, n),
                       format='csr',
                       dtype=np.float64).toarray()

pd.DataFrame(X*inverse_idf, 
            columns=features)

enter image description here

0 голосов
/ 05 октября 2019

Вы можете сделать свою работу следующим образом

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
        'This is the first document.',
        'This document is the second document.',
        'And this is the third one.',
        'This document is the fourth document.',
        'And this is the fifth one.',
        'This document is the sixth.',
        'And this is the seventh one document.',
        'This document is the eighth.',
        'And this is the nineth one document.',
        'This document is the second.',
        'And this is the tenth one document.',
    ]
#define the vectorization model
vectorize = TfidfVectorizer (max_features=2500, min_df=0.1, max_df=0.8)

#pass the corpus into the defined vectorizer
vector_texts = vectorize.fit_transform(corpus).toarray()
vector_texts
  • Вы должны изменить значения max_features, min_df, max_df, чтобы получить наилучшее соответствие вашей модели. В моем случае
out[1]:
array([[0.        , 0.        , 0.        ],
       [0.        , 0.        , 1.        ],
       [0.70710678, 0.70710678, 0.        ],
       [0.        , 0.        , 0.        ],
       [0.70710678, 0.70710678, 0.        ],
       [0.        , 0.        , 0.        ],
       [0.70710678, 0.70710678, 0.        ],
       [0.        , 0.        , 0.        ],
       [0.70710678, 0.70710678, 0.        ],
       [0.        , 0.        , 1.        ],
       [0.70710678, 0.70710678, 0.        ]])
...