具有不同类别的呼叫功能

时间:2017-09-09 17:38:28

标签: python-3.x function nltk apply

在下面的代码中:适用于匹配类别的条件是“重新创建”, - “如果加入重新创建:”。同样明智的,我有一个包含“娱乐”,“安全”,“医疗保健”等类别的列表。

def match_bigrams(row,RC):
    categories = []

    for bigram in row.bigram:
        joined = ' '.join(list(bigram))
        if joined in RC:
            categories.append(joined)

    return categories

df['Recreation_Amenities'] = df.apply(match_bigrams(Recreation), axis=1)

类别列表是:

category = [('Luxury Apartments', 'IN', 'Recreation_Ammenities'),
        ('CCTV', 'IN','Security'),
        ('Yoga', 'IN', 'HealthCare'),
        ('Jogging Tracks', 'IN', 'Recreation_Ammenities')]
Recreation = [e1 for (e1, rel, e2) in category if e2=='Recreation_Ammenities']
Security= [e1 for (e1, rel, e2) in category if e2=='Security']
HealthCare= [e1 for (e1, rel, e2) in category if e2=='HealthCare']

如何通过在此处传递类别名称作为参数来调用相同的函数? 我尝试传递类别名称:如果加入RC:但是它引发了一个TypeError:

  

TypeError:match_bigrams(Recreation)缺少1个必需的位置参数:RC

1 个答案:

答案 0 :(得分:2)

您需要一种方法将一个参数传递给您的函数,并最终得到一个新的(临时)函数,该函数需要多一个参数。这是一个简单的方法:

df['Recreation_Amenities'] = df.apply(lambda r: match_bigrams(r, Recreation), axis=1)

apply()方法将每行作为参数r

在函数式编程中,这称为“部分应用程序”,并且有一个函数funtools.partial()可以用于相同的目的。当预先提供的参数出现时,它最有效:

from functools import partial

def match_bigrams(RC, row):
    ...

df['Recreation_Amenities'] = df.apply(partial(match_bigrams, Recreation), axis=1)

此处Recreation将用作match_bigrams的第一个参数,partial将再次返回单参数函数(其参数将由apply()提供)