我有一个字符串homemade green tea powder
和一个字典dict = {'green tea': 'FLAVOR', 'banana': 'FLAVOR', 'homemade': 'CLAIM'}
我的问题是如何将字符串的一部分映射到字典键,然后获取相应的值。为了进一步说明,“绿茶”是字符串,它是字典中的键之一。与homemade
术语相同。我想得到这样的结果:
[('homemade', 'CLAIM'), ('green tea', 'FLAVOR'), ('powder', 'NOUN')]
我正在考虑考虑相邻的单词。我可以做ngram映射吗?如果我看一个字符串中的三个,两个和一个单词,那么它将是
homemade green tea
,green tea powder
,homemade green
,green tea
,tea powder
,homemade
,green
,tea
,powder
。然后,我可以尝试检查这些ngram术语是否在字典键中。我当前的代码:
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
我的结果是:
[('homemade', 'NOUN'), ('green', 'ADJ'), ('tea', 'NOUN'), ('powder', 'NOUN')]
最佳答案
您可以连接字典的键以形成交替的正则表达式模式,以便可以使用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')]
关于python - 字符串的一部分与字典键字符串匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53546534/