我有一个字符串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 powderhomemadegreenteapowder。然后,我可以尝试检查这些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/

10-12 21:05