2016-12-18 3 views
0

Я пытаюсь получить триграммы из предложения и сохранить их в словаре, с их частотой в качестве значения. я писал:Почему я получаю IndexError?

trigrams = {} 
sentence = ["What", "is", "happening", "right", "now"] 

for word in sentence: 
     if word != sentence[-1] or sentence[-2] and tuple((word, sentence[sentence.index(word) +1], sentence[sentence.index(word) +2])) not in trigrams: 
      trigrams.update({tuple((word, sentence[sentence.index(word) +1], sentence[sentence.index(word) +2])):1}) 

должен выглядеть следующим образом: ("что", "есть", "происходят"): 1 ("есть", "происходит", "право"): 1 etc

Но теперь я продолжаю получать IndexError в линии обновления.

+1

Подсказка: что происходит, когда вы находитесь на последнем слове? –

+0

'word! = Предложение [-1] или предложение [-2]': это не то, что вы хотели сделать. –

+0

Я не могу построить триграммы с двумя последними словами в качестве первого слова (справа, сейчас, ???), поэтому я не буду с ними ничего делать. Поэтому тест, если текущее слово является одним из двух последних слов. – spiderkitty

ответ

0

Я думаю if word != sentence[-1] or sentence[-2] это не то, что вы хотите. Вы имеете в виду if word != sentence[-1] and word != sentence[-2], что означает word не равно sentence[-1] или sentence[-2]?

+0

О да, это на самом деле вызывало проблему: D Большое вам спасибо, сейчас она работает! – spiderkitty

0

Вы можете использовать списки, как содержание ваших кортежей все из одного типа данных (строка)

Это, наверное, проще сделать:

trigrams = [] 
sentence = ["What", "is", "happening", "right", "now"] 

for i in range(2,len(sentence)): 
    trigrams.append([sentence[i-2],sentence[i-1],sentence[i]]) 
+0

Да, это на самом деле выглядит намного проще, но мне нужно протестировать, если они являются alredy в dict. Однако я нашел свою ошибку. Спасибо за помощь мне! – spiderkitty

0

Учитывая вы хотели бы сохранить структуру кода с кортежем и изменить минимально код, вы можете сделать это (не говоря это может быть хороший подход к вашей проблеме, и т.д.):

trigrams = {} 
sentence = ["What", "is", "happening", "right", "now"] 

for index, word in enumerate(sentence): 
    print index, word # to understand how the iteration goes on 
    if index < len(sentence)-2: 
     if tuple((word, sentence[index+1], sentence[index+2])) not in trigrams: 
      trigrams.update({tuple((word, sentence[index+1], sentence[index+2])):1}) 

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

Код, который вы использовали:

if word != sentence[-1] or sentence[-2] 

не является правильным, и вы были сравнения строк в конце концов, а не индексы, что и здесь важно! Сравните индексы, а не значения на этих позициях.

+0

Да, это сработало, когда я заменил «или» на «и». Спасибо за помощь мне! – spiderkitty

Смежные вопросы