часть строки соответствует ключевой строке словаря - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть строка 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, teapowder.Затем я могу попытаться проверить эти термины 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')]

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете соединить ключи dict, чтобы сформировать шаблон чередования регулярных выражений, чтобы вы могли использовать 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')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...