Tfidvectorizer - L2归一化向量

时间:2016-01-31 13:20:32

标签: python scikit-learn normalization tf-idf

我想确保TfidfVectorizer对象返回一个l2规范化的向量。我正在使用不同长度的文档运行二进制分类问题。

我正在尝试提取每个语料库的规范化向量,所以我假设我只能总结Tfidfvectorizer矩阵的每一行。然而总和大于1,我认为标准化的copora会将所有文档转换为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,我认为使用norm会导致所有向量都在0-1之间。我刚刚知道scikit中的预处理对象 - preprocessing.normalizer。 这是我应该在Gridsearch的管道中使用的东西吗?见下面的例子。

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

preprocessing.normalizer与Tfidfvectorizer规范参数有什么区别?

1 个答案:

答案 0 :(得分: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仅适用于计数。如果在生成TF-IDF权重后执行normalize,则可以达到相同的效果。

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')