Я пытаюсь создать генератор текста Маркова, но я продолжаю получать KeyError
, что я не понимаю.устранение неполадок python keyerror печать случайных значений из словарей со списком значений
В этой функции я продолжаю получать Keyerror
в строке w1, w2 = w2, random.choice(self.wordlog[w1])
.
self.gensize
это количество слов, которые я хочу создать,
self.size
общее число слов в моем тексте,
self.wordlog
является словарь - т.е. {'secondly': ['because', 'because'], 'pardon': ['cried', 'cried', 'said', 'said', 'your', 'she'], 'limited': ['to', 'warranty', 'right', 'right', 'to'], etc...}
def generate(self):
startseed = random.randint(0, self.size - 1)
w1, w2 = self.words[startseed], self.words[startseed+1]
#at this point, w1 and w2 are a random word and a following word-i.e. alice ran
wordlist = []
for i in range(self.gensize):
wordlist.append(w1)
w1, w2 = w2, random.choice(self.wordlog[w1])
#i.e. self.wordlog[alice] should return a list of all the values the word alice precedes
wordlist.append(w2)
print wordlist
Когда я запустите функцию (print markov("alice.txt", 5).generate()
), я просто продолжаю получать KeyError
- другое слово каждый раз (что следует ожидать, как начальное семя и r andom.choice приведет к этому).
Кто-нибудь видит, что в этом плохого и как это исправить?
EDIT:
Вот остальная часть кода, так что вы можете увидеть, где self.words
и все остальное приходит от:
class markov(object):
def __init__(self, filename, gensize):
self.wordlog = {}
self.filename = filename
self.words = self.file_to_words()
self.size = len(self.words)
self.gensize = gensize
def file_to_words(self):
with open(self.filename, "r") as file_opened:
text = file_opened.read().translate(None, string.punctuation)
mixedcasewords = text.split()
words = [x.lower() for x in mixedcasewords]
return words
def doubles(self):
for i in range((self.size)-1):
yield (self.words[i], self.words[i+1])
def catalog(self):
for w1, w2 in self.doubles():
self.wordlog.setdefault(w1, []).append(w2)
print self.wordlog
Конечно, вы видите другое слово каждый раз, потому что 'w1' случайно также, вы использовали' случайным образом.randint() 'для создания индекса, который извлекает строку из' self.words'. –
Затем вы меняете 'w1' и' w2' и сохраняете другое случайное слово в 'w2'. Вы уверены, что все слова, выбранные таким образом, находятся в 'self.wordlog'? –
Вы не показали нам, что находится в 'self.words', и не показывали, что * все * слова в списках в значениях' self.wordlog' также являются ключами в этом словаре. –