Python: if/else 在函数内部构造

Python: if/else constructs inside functions

我有一个函数可以计算两个文本的 fuzzywuzzy 分数:

def fuzzywuzzy(text_1, text_2):

scores = {
        'ratio' : fuzz.ratio(tn.normalize_title(text_1),tn.normalize_title(text_2)) / 100,
        'partial_ratio' : fuzz.partial_ratio(tn.normalize_title(text_1),tn.normalize_title(text_2)) / 100,
        'token_sort_ratio' : fuzz.token_sort_ratio(tn.normalize_title(text_1),tn.normalize_title(text_2)) / 100,
        'token_set_ratio' : fuzz.token_set_ratio(tn.normalize_title(text_1),tn.normalize_title(text_2)) / 100}

return scores

从上面的代码可以看出,我在计算分数之前对文本1和2进行了归一化处理。 这里调用了fuzzywuzzy函数:

event['scores'] = scores(v_ data['text1'], event['_source']['event_record']['text2'])

我需要修改查询,如果 token_set_ratio 的模糊分数值大于 0.99,则 return 分数。我正在将此代码应用于 2000 多条记录。

请把你的想法留给我。

如果我理解正确你想做什么,我的建议是:

def fuzzywuzzy(text_1, text_2, cutoff=0.99):
    token_set_ratio = fuzz.token_set_ratio(tn.normalize_title(text_1),tn.normalize_title(text_2)) / 100
    if token_set_ratio > cutoff:
        return {
            'ratio' : fuzz.ratio(tn.normalize_title(text_1),tn.normalize_title(text_2)) / 100,
            'partial_ratio' : fuzz.partial_ratio(tn.normalize_title(text_1),tn.normalize_title(text_2)) / 100,
            'token_sort_ratio' : fuzz.token_sort_ratio(tn.normalize_title(text_1),tn.normalize_title(text_2)) / 100,
            'token_set_ratio' : token_set_ratio}
    return None

然后你可以做类似的事情(假设有一个事件列表):

   for event in events:
       s = scores(...)
       if s:
           event['scores'] = s

这里有一个更 pythonic 的形式:

import fuzz
import tn


def fuzzywuzzy(text_1, text_2, cutoff=0.99):
    def _compute_ratio(fn):
        return fn(tn.normalize_title(text_1), tn.normalize_title(text_2)) / 100

    token_set_ratio = _compute_ratio(fuzz.token_set_ratio)
    if token_set_ratio > cutoff:
        return {
            'ratio': _compute_ratio(fuzz.ratio),
            'partial_ratio': _compute_ratio(fuzz.partial_ratio),
            'token_sort_ratio': _compute_ratio(fuzz.token_sort_ratio),
            'token_set_ratio': token_set_ratio,
        }
    return None