如何在Python中正确重写和调用supermethod

2024-03-29 12:18:45 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,当前的问题。{I}正在为cda}编写语法问题。我要实现的是重写fit_transform函数,它只稍微改变输入,然后用新参数调用它的super-方法:

from sklearn.feature_extraction.text import TfidfVectorizer

class TidfVectorizerWrapper(TfidfVectorizer):
    def __init__(self):
        TfidfVectorizer.__init__(self)  # is this even necessary?

    def fit_transform(self, x, y=None, **fit_params):
        x = [content.split('\t')[0] for content in x]  # filtering the input
        return TfidfVectorizer.fit_transform(self, x, y, fit_params)  
                            # this is the critical part, my IDE tells me for
                            # fit_params: 'unexpected arguments'

这个程序到处崩溃,从Multiprocessing exception开始,没有告诉我任何有用的东西。如何正确地执行此操作?在

附加信息:我之所以需要这样包装它是因为我使用sklearn.pipeline.FeatureUnion来收集特性提取器,然后再将它们放入sklearn.pipeline.Pipeline。这样做的结果是,我只能在所有特征提取程序中提供一个数据集——但是不同的提取程序需要不同的数据。我的解决方案是以一种易于分离的格式提供数据,并在不同的提取器中过滤不同的部分。如果这个问题有更好的解决办法,我也很乐意听到。在

编辑1: 添加**来解压dict似乎没有任何改变: Screenshot

编辑2: 我刚刚解决了剩下的问题——我需要移除构造函数重载。显然,通过尝试调用父构造函数,希望所有实例变量都能正确启动,我做的恰恰相反。我的包装器不知道它能得到什么样的参数。一旦我取消了多余的电话,一切都很顺利。在


Tags: theself程序for参数initisdef
1条回答
网友
1楼 · 发布于 2024-03-29 12:18:45

您忘记了对作为dict传递的fit_params进行解压缩,而您想将其作为需要解压缩运算符**keyword arguments来传递。在

from sklearn.feature_extraction.text import TfidfVectorizer

class TidfVectorizerWrapper(TfidfVectorizer):

    def fit_transform(self, x, y=None, **fit_params):
        x = [content.split('\t')[0] for content in x]  # filtering the input
        return TfidfVectorizer.fit_transform(self, x, y, **fit_params)  

另一个直接调用TfidfVectorizer的{}的方法可以通过super方法调用重载版本

^{pr2}$

要理解它,请检查以下示例

def foo1(**kargs):
    print kargs

def foo2(**kargs):
    foo1(**kargs)
    print 'foo2'

def foo3(**kargs):
    foo1(kargs)
    print 'foo3'

foo1(a=1, b=2)

它打印字典{'a': 1, 'b': 2}

foo2(a=1, b=2)

同时打印字典和foo2,但是

foo3(a=1, b=2)

当我们向foo1发送一个与字典相等的位置参数时引发错误,该参数不接受此类内容。但我们可以这么做

def foo4(**kargs):
    foo1(x=kargs)
    print 'foo4'

它工作得很好,但是打印了一个新字典{'x': {'a': 1, 'b': 2}}

相关问题 更多 >