Python 实现接口的类集合的重写方法

Python 实现接口的类集合的重写方法,python,machine-learning,overriding,scikit-learn,porter-stemmer,Python,Machine Learning,Overriding,Scikit Learn,Porter Stemmer,我正在使用scikit学习并正在构建一个管道。管道构建完成后,我将使用GridSearchCV找到最佳模型。我正在处理文本数据,所以我正在试验不同的词干分析器。我创建了一个名为Preprocessor的类,它接受一个词干分析器和向量化器类,然后尝试覆盖向量化器的方法build_analyzer来合并给定的词干分析器。但是,我看到GridSearchCV的set_params只是直接访问实例变量——也就是说,它不会像我一直在做的那样,用新的分析器重新实例化向量器: class Preprocess

我正在使用scikit学习并正在构建一个管道。管道构建完成后,我将使用GridSearchCV找到最佳模型。我正在处理文本数据,所以我正在试验不同的词干分析器。我创建了一个名为Preprocessor的类,它接受一个词干分析器和向量化器类,然后尝试覆盖向量化器的方法build_analyzer来合并给定的词干分析器。但是,我看到GridSearchCV的set_params只是直接访问实例变量——也就是说,它不会像我一直在做的那样,用新的分析器重新实例化向量器:

class Preprocessor(object):
    # hard code the stopwords for now
    stopwords = nltk.corpus.stopwords.words()

    def __init__(self, stemmer_cls, vectorizer_cls):
        self.stemmer = stemmer_cls()
        analyzer = self._build_analyzer(self.stemmer, vectorizer_cls)
        self.vectorizer = vectorizer_cls(stopwords=stopwords,
                                         analyzer=analyzer,
                                         decode_error='ignore')

    def _build_analyzer(self, stemmer, vectorizer_cls):
        # analyzer tokenizes and lowercases
        analyzer = super(vectorizer_cls, self).build_analyzer()
        return lambda doc: (stemmer.stem(w) for w in analyzer(doc))

    def fit(self, **kwargs):
        return self.vectorizer.fit(kwargs)

    def transform(self, **kwargs):
        return self.vectorizer.transform(kwargs)

    def fit_transform(self, **kwargs):
        return self.vectorizer.fit_transform(kwargs)

所以问题是:如何为传入的所有矢量器类重写构建分析器?

是的,GridSearchCV直接设置实例字段,然后使用更改的字段调用fit-on分类器

scikit learn中的每个分类器都是以这样的方式构建的,
\uuuuu init\uuuu
仅设置参数字段,并且进一步工作所需的所有依赖对象(如在您的案例中调用u build\u analyzer)仅在fit方法中构建。您必须添加存储向量化器cls的附加字段,然后必须在fit方法中从向量化的cls和词干分析器cls对象构造依赖项

比如:

class Preprocessor(object):
    # hard code the stopwords for now
    stopwords = nltk.corpus.stopwords.words()

    def __init__(self, stemmer_cls, vectorizer_cls):
        self.stemmer_cls = stemmer_cls
        self.vectorizer_cls = vectorizer_cls

    def _build_analyzer(self, stemmer, vectorizer_cls):
        # analyzer tokenizes and lowercases
        analyzer = super(vectorizer_cls, self).build_analyzer()
        return lambda doc: (stemmer.stem(w) for w in analyzer(doc))

    def fit(self, **kwargs):
        analyzer = self._build_analyzer(self.stemmer_cls(), vectorizer_cls)
        self.vectorizer_cls = vectorizer_cls(stopwords=stopwords,
                                         analyzer=analyzer,
                                         decode_error='ignore')

        return self.vectorizer_cls.fit(kwargs)

    def transform(self, **kwargs):
        return self.vectorizer_cls.transform(kwargs)

    def fit_transform(self, **kwargs):
        return self.vectorizer_cls.fit_transform(kwargs)