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

2024-09-19 23:43:58 发布

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

我有两本词典——一本是由量词在句子中识别的名词词典;另一个是由正则表达式解析器识别的名词短语词典。这两本词典的关键是句子数字的字符串。 我想用名词短语来代替名词,如果它们重合的话

输出_分类器如下所示:

{'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']}

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


Tags: 解析器food单词句子词典staff名词sausage
2条回答

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

你可以这样做

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']}

显然,可能还有其他方法,但这是可伸缩的

首先,我要建立一个字典来定义您要进行的替换:

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()
}

相关问题 更多 >