2016-12-18 107 views
0

我試圖從一個句子中獲取trigrams並將它們保存在字典中,並將它們的頻率值作爲值。 我寫這樣的:爲什麼我得到一個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

'單詞!=句子[-1]或句子[-2]':那不是你想要做的。 –

+0

我無法用最後兩個單詞作爲第一個單詞構建卦(right,now,???),所以我不會對它們做任何事情。因此,測試當前單詞是最後兩個單詞之一。 – 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

是的,這實際上看起來更容易,但我需要測試,如果他們在字典中是遺傳的。但是,我發現我的錯誤。感謝你們對我的幫助! – 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()中不存在的元素......因爲你檢查的方式是否接近列表的末尾(最後兩個元素)wasn'沒錯。

你正在使用的代碼:

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

是不對的,你最後,而不是指標比較字符串,這是這裏重要的!比較索引,而不是這些位置的值。

+0

是的,它工作,我用「和」替換了「或」。感謝你們對我的幫助! – spiderkitty

相關問題