我有一个字符串自制绿茶粉
和一本字典dict = {'green tea': 'FLAVOR', 'banana': 'FLAVOR', 'homemade': 'CLAIM '}
我的问题是如何将字符串的一部分映射到字典键,然后获取相应的值。进一步解释一下,“绿茶”是字符串,它是字典中的键之一。与“自制”术语相同。我想要得到这样的结果:
[('homemade', 'CLAIM'), ('green tea', 'FLAVOR'), ('powder', 'NOUN')]
我正在考虑考虑相邻的单词。我可以做 ngram 映射吗?如果我看一个字符串中的三个、两个和一个单词,那么它将是 homemade green tea
、green tea Powder
、homemade green
, 绿茶
, 茶粉
, 自制
, 绿
, 茶
, 粉末
。然后,我可以尝试检查这些 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/