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

标签 python string dictionary

我有一个字符串自制绿茶粉和一本字典dict = {'green tea': 'FLAVOR', 'banana': 'FLAVOR', 'homemade': 'CLAIM '}

我的问题是如何将字符串的一部分映射到字典键,然后获取相应的值。进一步解释一下,“绿茶”是字符串,它是字典中的键之一。与“自制”术语相同。我想要得到这样的结果:

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

我正在考虑考虑相邻的单词。我可以做 ngram 映射吗?如果我看一个字符串中的三个、两个和一个单词,那么它将是 homemade green teagreen tea Powderhomemade 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/

相关文章:

python - 字典只返回 for 循环中的最后一个键值对

string - 如何检测字符串中某个单词的多次出现

python - 如何在某个位置添加字符串?

r - 如何将一串不同长度的数字和字母分成R中的不同列?

vba - Excel VBA 字典可以用来调用函数吗?

python - 如何在 SWIG/Python 中将结构列表传递给 C

python - 递归树中的每条路径

python - 易于实现内存高效元组列表的结构

Python 笛卡尔积无法按主列表的要求工作

python - 使类可转换为元组和字典