2017-10-06 19 views
2

我試圖在聖經風格中生成一個句子。但是每當我運行它時,它都會停在一個KeyError上。這是令人困惑的,因爲它只使用自己的密鑰,並且每次發生錯誤時都是同一個單詞,儘管有random.choice。同一個單詞上的KeyError

這是txt文件,如果你想運行它:ftp://ftp.cs.princeton.edu/pub/cs226/textfiles/bible.txt

import random 

files = [] 
content = "" 
output = "" 

words = {} 

files = ["bible.txt"] 
sentence_length = 200 

for file in files: 
    file = open(file) 
    content = content + " " + file.read() 

content = content.split(" ") 

for i in range(100): # I didn't want to go through every word in the bible, so I'm just going through 100 words 
    words[content[i]] = [] 
    words[content[i]].append(content[i+1]) 

word = random.choice(list(words.keys())) 

output = output + word 

for i in range(int(sentence_length)): 
    word = random.choice(words[word]) 
    output = output + word 

print(output) 
+0

錯誤的確切文字是什麼? –

+0

Midst是你的字典中的一個值,而不是一個關鍵字。 –

+0

如果將範圍增加到200,它會自行解決,但它會陷入循環並反覆打印相同的東西。您可能需要重新編寫此代碼以避免出現此問題。請嘗試將範圍增加至200並查看。 –

回答

2

KeyError發生在這條線:

word = random.choice(words[word]) 

它總是會發生的單詞「之中」。

怎麼樣? 「中間」是文中第100個字。 第100個位置是第一次看到它。 結果是,「中間」本身從未放在words作爲關鍵。因此,KeyError

爲什麼程序這麼快到達這個詞?部分原因是因爲這裏的錯誤:

for i in range(100): 
    words[content[i]] = [] 
    words[content[i]].append(content[i+1]) 

這裏的錯誤是words[content[i]] = []聲明。 每次看到一個單詞 時,都會爲其重新創建一個空列表。 「midst」之前的詞是「the」。 這是一個很常見的詞, 文中的很多其他詞都有「the」。 而且由於words["the"]["midst"], 儘管存在隨機性,但問題往往會發生很多。

您可以修復創造words的錯誤:

for i in range(100): 
    if content[i] not in words: 
     words[content[i]] = [] 
    words[content[i]].append(content[i+1]) 

然後當你選擇的話隨機, 我建議增加一個if word in words條件, 處理的最後一個字的角落情況下,在輸入。

0

「midst」是源文本中的第101個單詞,它是第一次出現。當你這樣做:

words[content[i]].append(content[i+1]) 

你是一個鍵:值對,但你不能保證該值將是等同於現有的密鑰。所以當你使用這個值來搜索一個不存在的鍵時,你會得到一個KeyError。

如果將範圍更改爲101而不是100,則會看到程序幾乎可以正常工作。那是因爲第102個單詞是「你的源文本中已經出現的」。

這取決於你如何處理這種邊緣情況。你可以這樣做:

if i == (100-1): 
     words[content[i]].append(content[0]) 
    else: 
     words[content[i]].append(content[i+1]) 

它基本上循環回到源文本的開頭,當你到達最後。

相關問題