当存在部分匹配时,如何用一个值替换字典中的另一个值:python

How do I substitute one value for another in dictionaries when there is a partial match: python

我有两本词典——一本是分类器在句子中识别的名词词典;另一个是由正则表达式解析器识别的名词短语字典。两个词典的键都是句号的字符串。 如果名词一致,我想用名词短语代替。

output_classifier 看起来像这样:

{'47': ['staff_7', 'food_11', 'portion_17', 'portobello_25', 'gorgonzola_27', '/_28',  'sausage_29', 'appetizer_30', 'lobster_33', 'risotto_34']}

输出正则表达式解析器如下所示:

{'47': ['portion_17 size_18', 'sausage_29 appetizer_30', 'lobster_33 risotto_34']}

如果单个单词不在正则表达式解析器中,我想保留它们,并替换短语 - 摆脱原来的单个单词。

预期输出:

{'47': ['staff_7', 'food_11', 'portion_17 size_18', 'portobello_25', 'gorgonzola_27', '/_28',  'sausage_29 appetizer_30', 'lobster_33 risotto_34']}

替换后,我似乎无法摆脱单个单词。

首先我会建立一个字典来定义你想做的替换:

output_classifier = {'47': ['staff_7', 'food_11', 'portion_17', 'portobello_25', 'gorgonzola_27', '/_28',  'sausage_29', 'appetizer_30', 'lobster_33', 'risotto_34']}
output_parser = {'47': ['portion_17 size_18', 'sausage_29 appetizer_30', 'lobster_33 risotto_34']}
substitutions = {
    k: {
        word: [phrase for phrase in output_parser[k] if word in phrase] 
        for word in v
    } for k, v in output_classifier.items()
}

接下来就简单了:

output = {
    k: [
        s[word][0] if s[word] else word 
        for word in output_classifier[k]
    ] for k, s in substitutions.items()
}

这是一个通用的解决方案,可能对进一步处理也很有用。如果您将输出正则表达式解析器转换为字典,它可能对后期有用(可能取决于您的应用程序)。

你可以这样做

for sentno, val in outputregexdict.items():
    tempdict = {}
    for element in val:
        noun,phr = element.split()
        tempdict[noun] = phr
    outputregexdict[sentno] = tempdict

这应该会产生这样的字典:

{'47': {'portion_17': 'size_18', 'sausage_29': 'appetizer_30', 'lobster_33': 'risotto_34'}}

现在您可以转到原来的部分了。

for sentno, val in outputclassifier.items():
    for index, element in enumerate(val):
        try:
            val[index] = element + " " + outputregexdict[sentno][element]
            val.remove(outputregexdict[sentno][element])
        except:
            continue
    outputclassifier[sentno] = val

这给出了

{'47': ['staff_7', 'food_11', 'portion_17 size_18', 'portobello_25', 'gorgonzola_27', '/_28', 'sausage_29 appetizer_30', 'lobster_33 risotto_34']}

显然可能还有其他方法,但这是可扩展的