sklearn中的TfidfVectorizer默认预处理器是什么?

5

我正在查看sklearn的TfidfVectorizer,特别是输入参数preprocessor,它有以下文档:

"覆盖字符串转换阶段,同时保留标记化和n元生成步骤。"

当我没有覆盖此参数时,我试图弄清楚预处理阶段确切地做了什么(如果有的话)?

我有一个实验,我正在查看使用以下代码生成的稀疏矩阵中存储的元素数量:

vectorizer = TfidfVectorizer(stop_words=words, preprocessor=process, ngram_range=(1,1), strip_accents='unicode')
vect = vectorizer.fit_transform(twenty_train.data)
items_stored = vect.nnz
  • 当我没有覆盖预处理程序时,生成的矩阵存储了1278323个元素。
  • 当我用一个空方法覆盖预处理程序时,生成的矩阵存储了1441372个元素。
  • 当我用一个包含s = re.sub("[^a-zA-Z]", " ", s)的方法覆盖预处理程序时,生成的矩阵存储了1331597个元素。
  • 我无法通过任何其他处理步骤影响稀疏矩阵的大小(或在分类中使用时的准确性)。

很明显,与默认的sklearn结果、无预处理和我的尝试复制预处理步骤之间存在差异。我很难找到有关默认情况下预处理器具体执行什么操作的文档。

我还检查了TfidfVectorizer的源代码,但我也无法从这里弄清楚预处理器正在执行什么操作。

是否有人知道sklearn默认预处理器执行的代码或采取的预处理步骤呢?


你有看过这个吗?(https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/feature_extraction/text.py#L1307) - Scratch'N'Purr
如果您不覆盖它,最终将调用此处的build_preprocessor方法:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/feature_extraction/text.py#L231-259 - Mohamed Ali JAMAOUI
预处理器默认情况下只更改字符串的大小写(取决于其他参数是否保持默认设置)。因此,你的第二种情况,在其中传递一个空方法,将会产生更多的标记,因为现在相同的字符串将根据它们的大小写不同而被视为不同的。 - Vivek Kumar
至于你的第三点和第四点,你需要展示你所做的实际代码。 - Vivek Kumar
1个回答

1
你要找这个吗?
def build_preprocessor(self):
    """Return a function to preprocess the text before tokenization"""
    if self.preprocessor is not None:
        return self.preprocessor

    # unfortunately python functools package does not have an efficient
    # `compose` function that would have allowed us to chain a dynamic
    # number of functions. However the cost of a lambda call is a few
    # hundreds of nanoseconds which is negligible when compared to the
    # cost of tokenizing a string of 1000 chars for instance.
    noop = lambda x: x

    # accent stripping
    if not self.strip_accents:
        strip_accents = noop
    elif callable(self.strip_accents):
        strip_accents = self.strip_accents
    elif self.strip_accents == 'ascii':
        strip_accents = strip_accents_ascii
    elif self.strip_accents == 'unicode':
        strip_accents = strip_accents_unicode
    else:
        raise ValueError('Invalid value for "strip_accents": %s' %
                         self.strip_accents)

    if self.lowercase:
        return lambda x: strip_accents(x.lower())
    else:
        return strip_accents

从这里开始:https://github.com/scikit-learn/scikit-learn/blob/bac89c2/sklearn/feature_extraction/text.py#L230


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接