поиск / сопоставление нескольких ключей в словаре и добавление в список - PullRequest
0 голосов
/ 26 ноября 2018

Мой текущий код:

from nltk.tag import pos_tag, map_tag
search_term = 'quaker lemon banana oatmeal'
lst = []
search_term_words = search_term.split()
for w in search_term_words:
  if w in flavor_grocer_mapping:
      for flavor in flavor_grocer_mapping[w]:
          if flavor in search_term:
              lst.append((flavor, 'FLAVOR'))
              for x in search_term.replace(flavor, '').split(): 
                  if x in brand_grocer_mapping:
                      for brand in brand_grocer_mapping[x]:
                          if brand in search_term.replace(flavor, '').split():
                              lst.append((brand, 'BRAND'))
                              for word, tag in pos_tag(word_tokenize(search_term.replace(flavor, '').replace(brand, '').strip())):
                                  lst.append((word, map_tag('en-ptb', 'universal', tag)))

Результат, который я получил:

[('lemon', 'FLAVOR'), 
 ('quaker', 'BRAND'),
 ('banana', 'NOUN'), 
 ('oatmeal', 'NOUN'),
 ('banana', 'FLAVOR'),
 ('quaker', 'BRAND'),
 ('lemon', 'ADJ'),
 ('oatmeal', 'NOUN')]

Мой ожидаемый результат:

[('lemon', 'FLAVOR'),
 ('banana', 'FLAVOR'),
 ('quaker', 'BRAND'),
 ('oatmeal', 'NOUN')]

Я знаю, проблема в том, чторазделенные слова в поисковых терминах рекурсивно запускаются в циклах for.Как можно искать / отображать целую строку, содержащую несколько ключей в словаре?(Например, lemon и banana находятся в строке запроса и являются ключами в словаре flavor_grocer_mapping.)

1 Ответ

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

Ну, я пытался воссоздать flavor_grocer_mapping на основе ваших результатов, ваш дополнительный код для поиска крайне не нужен.Вместо этого, поскольку у вас есть словарь, который соответствует search_term_words в качестве ключей, выполните правильный поиск по словарю в понимании списка.

search_term = 'quaker lemon banana oatmeal'
search_term_words = search_term.split()

#recreating your dictionary
flavor_grocer_mapping = [('lemon', 'FLAVOR'),
                         ('banana', 'FLAVOR'),
                         ('quaker', 'BRAND'),
                         ('oatmeal', 'NOUN')]
flavor_grocer_mapping = {k:v for (k,v) in flavor_grocer_mapping} 

#solution
results = [(word,flavor_grocer_mapping[word]) for word in search_term_words]
results
>>[('quaker', 'BRAND'),
 ('lemon', 'FLAVOR'),
 ('banana', 'FLAVOR'),
 ('oatmeal', 'NOUN')]

В случае вашего предоставленного примера я предлагаю вам объединить все словари в 1, а не повторять их циклически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...