当存在部分匹配时,如何用一个值替换字典中的另一个值: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']}
显然可能还有其他方法,但这是可扩展的
我有两本词典——一本是分类器在句子中识别的名词词典;另一个是由正则表达式解析器识别的名词短语字典。两个词典的键都是句号的字符串。 如果名词一致,我想用名词短语代替。
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']}
显然可能还有其他方法,但这是可扩展的