-
Notifications
You must be signed in to change notification settings - Fork 0
/
markovGenerator.py
105 lines (76 loc) · 3.37 KB
/
markovGenerator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# -*- coding:utf-8 -*-
from random import randrange
class MarkovGenerator:
def __init__(self, baseString = ""):
self.dictionary = {}
self.firstWords = []
self.lastWords = []
if(baseString is not ""):
self.add_sentence(baseString)
"""Add a string to the dictionary"""
def add_sentence(self, baseString):
splitted = baseString.split()
# Add the reference of the first word
if splitted[0].lower() not in (word.lower() for word in self.firstWords):
self.firstWords.append(splitted[0])
# Add the reference of the last word
if splitted[len(splitted) - 1].lower() not in (word.lower() for word in self.lastWords):
self.lastWords.append(splitted[len(splitted) - 1])
# Add words to the dictionary
splitSize = len(splitted)
currentWord = ""
nextWord = ""
for i in range(0, splitSize):
currentWord = splitted[i]
if i+1 >= splitSize:
nextWord = ""
else:
nextWord = splitted[i+1]
self.add_word(currentWord, nextWord)
# Last word of the string is followed by an EOL
self.add_word(currentWord, "")
""" Add "nextword" in the array of the given key. If the key doesn't already exist, it will be created. """
def add_word(self, key, nextWord):
try:
self.dictionary[key].append(nextWord)
except:
self.dictionary[key] = [nextWord]
""" Generate a sentence using a random first word from the dictionary """
def generate_sentence(self, maxChar = 0, forceLastWord = True):
result = ""
while True:
# Get the first word randomly
randomKey = self.firstWords[randrange(len(self.firstWords))]
currentWord = randomKey
nextWord = ""
result += currentWord + " "
# Generating the new sentence
while True:
# Are we exceeding the character limit?
if maxChar != 0 and len(result.strip()) >= maxChar:
result = ""
break
nextWord = self.dictionary[currentWord][randrange(len(self.dictionary[currentWord]))]
# Do we met the ending conditions? (either no more word or exceeding the char limit)
if nextWord == "" or (maxChar != 0 and (len(result.strip()) + len(nextWord)) >= maxChar):
# Check if the last word is in the dictionary of the last word
tmp = result.split()
# if forceLastWord == true: Loop until the last word of the generated sentence is
# in the dictionary of the last words (self.lastWords)
# if not, just return the generated sentence
if (forceLastWord and tmp[-1].lower() in (word.lower() for word in self.lastWords)) or not forceLastWord:
return result.strip()
else:
break
result += nextWord + " "
currentWord = nextWord
def get_indexed_key(self, index):
i = 0
for key in self.dictionary.keys():
if i == index:
return key
i += 1
print("NO KEY RETURNED")
if __name__ == '__main__':
print("Please execute main.py")
exit()