字符串的一部分与字典键字符串匹配

时间:2018-11-29 19:50:04

标签: python string dictionary

我有一个字符串homemade green tea powder和一个字典dict = {'green tea': 'FLAVOR', 'banana': 'FLAVOR', 'homemade': 'CLAIM'}

我的问题是如何将字符串的一部分映射到字典键,然后获取相应的值。为了进一步说明,“绿茶”是字符串,它是字典中的键之一。与homemade项相同。我想得到这样的结果:

[('homemade', 'CLAIM'), ('green tea', 'FLAVOR'), ('powder', 'NOUN')]

我正在考虑考虑相邻的单词。我可以做ngram映射吗?如果我看一个字符串中的三个,两个和一个单词,那么它将是homemade green teagreen tea powderhomemade greengreen teatea powder,{ {1}},homemadegreentea。然后,我可以尝试检查这些ngram术语是否在字典键中。

我当前的代码:

powder

我的结果是:from nltk.tag import pos_tag, map_tag def get_pos_tup(string): lst=[] for word in string.split(): if word in dict.keys(): lst.append((word, dict[word])) else: for word, tag in pos_tag(word_tokenize(word)): lst.append((word, map_tag('en-ptb', 'universal', tag))) return lst

1 个答案:

答案 0 :(得分:1)

您可以结合字典的键来形成交替的正则表达式模式,以便可以使用re.findall查找所有匹配的关键字并将它们映射到列表理解中的值:

import re
d = {'green tea': 'FLAVOR', 'banana': 'FLAVOR', 'homemade': 'CLAIM', 'powder': 'NOUN'}
s = 'homemade green tea powder'
print([(k, d[k]) for k in re.findall(r'\b(?:%s)\b' % '|'.join(map(re.escape, d)), s)])

这将输出:

[('homemade', 'CLAIM'), ('green tea', 'FLAVOR'), ('powder', 'NOUN')]

如果您希望能够处理可能是其他关键字的子序列的关键字,则应首先按相反的单词数对关键字进行排序:

import re
d = {'green tea': 'FLAVOR', 'banana': 'FLAVOR', 'homemade': 'CLAIM', 'powder': 'NOUN', 'green': 'COLOR'}
s = 'green homemade green tea powder'
print([(k, d[k]) for k in re.findall(r'\b(?:%s)\b' % '|'.join(map(re.escape, sorted(d, key=lambda w: -w.count(' ')))), s)])

这将输出:

[('green', 'COLOR'), ('homemade', 'CLAIM'), ('green tea', 'FLAVOR'), ('powder', 'NOUN')]