Словарь слов в качестве ключей и предложений, в которых он отображается в виде значений

#python #string #list #for-loop #list-comprehension

Вопрос:

У меня есть текст, который я разделяю на список уникальных слов с помощью набора. Я также разделил текст на список предложений. Затем я разделяю этот список предложений на список списков (слов в каждом предложении / возможно, мне не нужно делать последнюю часть)

 text = 'i was hungry. i got food. now i am not hungry i am full'

sents = ['i was hungry', 'i got food', 'now i am', 'not hungry i am full']

words = ['i', 'was', 'hungry', 'got', 'food', 'now', 'not', 'am', 'full']

split_sents = [['i', 'was', 'hungry'], ['i', 'got', 'food'], ['now', 'i', 'am', 'not','hungry','i','am','full']]
 

Я хочу написать цикл или понимание списка, который создаст словарь, в котором каждое слово в словах является ключом, и если слово появляется в предложении, каждое предложение записывается в виде значения списка, чтобы я мог получить некоторую статистику, такую как количество предложений, а также среднюю длину предложений для каждого предложения. word…so далеко у меня есть следующее, но это неправильно.

 word_freq = {}
for sent in split_sents:
  for word in words:
    if word in sent:
      word_freq[word]  = sent
    else:
      word_freq[word] = sent
 

он возвращает словарь ключей слов и пустых значений. В идеале я хотел бы сделать это без коллекций/счетчиков, хотя любое решение прилагается. Я уверен, что этот вопрос уже задавался раньше, но я не смог найти правильного решения, поэтому не стесняйтесь связываться и закрываться, если вы связываетесь с решением.

Ответ №1:

Вот подход, использующий понимание списка и словаря

Код:

 text = 'i was hungry. i got food. now i am not hungry i am full'

sents = ['i was hungry', 'i got food', 'now i am', 'not hungry i am full']

words = ['i', 'was', 'hungry', 'got', 'food', 'now', 'not', 'am', 'full']


word_freq = {w:[s for s in sents if w in s.split()] for w in words }

print(word_freq)
 

Выход:

 {
'i': ['i was hungry', 'i got food', 'now i am', 'not hungry i am full'], 
'was': ['i was hungry'], '
hungry': ['i was hungry', 'not hungry i am full'], 
'got': ['i got food'], 
'food': ['i got food'], 
'now': ['now i am'], 
'not': ['not hungry i am full'], 
'am': ['now i am', 'not hungry i am full'], 
'full': ['not hungry i am full']
}

 

Или, если вы хотите вывести предложения в виде списка слов:

 word_freq = {w:[s.split() for s in sents if w in s.split()] for w in words }
 

Выход:

 {
'i': [['i', 'was', 'hungry'], ['i', 'got', 'food'], ['now', 'i', 'am'], ['not', 'hungry', 'i', 'am', 'full']], 
'was': [['i', 'was', 'hungry']], 
'hungry': [['i', 'was', 'hungry'], ['not', 'hungry', 'i', 'am', 'full']], 
'got': [['i', 'got', 'food']], 
'food': [['i', 'got', 'food']], 
'now': [['now', 'i', 'am']], 
'not': [['not', 'hungry', 'i', 'am', 'full']], 
'am': [['now', 'i', 'am'], ['not', 'hungry', 'i', 'am', 'full']], 
'full': [['not', 'hungry', 'i', 'am', 'full']]}

 

Ответ №2:

 word_freq = {}
for word in set(words):
     word_freq[word] = list()

for sent in split_sents:
     for word in words:
     if word in sent:
          word_freq[word].append(sent)

print(word_freq)

=================================================================

{'am': [['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
 'food': [['i', 'got', 'food']],
 'full': [['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
 'got': [['i', 'got', 'food']],
 'hungry': [['i', 'was', 'hungry'],
            ['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
 'i': [['i', 'was', 'hungry'],
       ['i', 'got', 'food'],
       ['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
 'not': [['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
 'now': [['now', 'i', 'am', 'not', 'hungry', 'i', 'am', 'full']],
 'was': [['i', 'was', 'hungry']]}
 

Комментарии:

1. спасибо @Abhi_J, это понимание списка внутри понимания словаря? и также спасибо Daniel111 за решение.