2016-01-31 3 views
1

Я хочу, чтобы объект TfidfVectorizer возвращал нормализованный вектор l2. Я выполняю двоичную классификационную задачу с документами различной длины.Tfidvectorizer - нормализованный вектор L2

Я пытаюсь извлечь нормированные векторы каждого корпуса, поэтому я предположил, что могу просто подвести итог каждой строке матрицы Tfidfvectorizer. Однако сумма больше 1, я думал, что нормализованная копия преобразит все документы в диапазон между 0-1.

vect = TfidfVectorizer(strip_accents='unicode', 
stop_words=stopwords,analyzer='word', use_idf=True, tokenizer=tokenizer, ngram_range=(1,2),sublinear_tf= True , norm='l2') 

tfidf = vect.fit_transform(X_train) 
# sum norm l2 documents 
vect_sum = tfidf.sum(axis=1) 

Значение vect_sum больше 1, я думал, используя норму приведет все векторы быть между 0-1. Я только что узнал о препроцессорном объекте в scikit learn - preprocessing.normalizer. Это что-то, что я должен использовать в конвейере Gridsearch? См. Пример ниже.

pipeline = Pipeline([ 
    ('plb', normalize(tfidf, norm='l2')), #<-- sklearn.preprocessing 
    ('tfidf', tfidf_vectorizer), 
    ('clf', MultinomialNB()), 
]) 

В чем разница между preprocessing.normalizer и параметром нормы Tfidfvectorizer?

ответ

3

С L2, это не является суммой строк, равно 1, а сумма квадратов равна 1. L1 нормы будет производить норму, где сумма значений равна 1.

X_train = [" This is my first sentence", "Short sentence"] 
vect = TfidfVectorizer(strip_accents='unicode',analyzer='word', use_idf=True, ngram_range=(1,2),sublinear_tf= True , norm='l2') 

tfidf = vect.fit_transform(X_train) 
# sum norm l2 documents 
vect_sum = tfidf.multiply(tfidf).sum(axis=1) 
vect_sum 

# matrix([[ 1.], 
#   [ 1.]]) 

TF-IDF относится только к подсчетам. Вы можете добиться такого же эффекта, если вы выполните normalize после получения весов TF-IDF.

vect = TfidfVectorizer(strip_accents='unicode',analyzer='word', use_idf=True, ngram_range=(1,2), 
         sublinear_tf= True , norm=None) 

tfidf = vect.fit_transform(X_train) 
tfidf = normalize(tfidf) 

Это было бы эквивалентно TfidfVectorizer(..., norm='l2') в исходном примере.