Muokkaa Markovin ketjua. Poista ylimääräinen tiedosto
This commit is contained in:
parent
5c799d9764
commit
81586d7af8
3 changed files with 36 additions and 31 deletions
|
@ -16,6 +16,7 @@ class MarkovKetju:
|
||||||
raise ValueError("Aste ei voi olla < 1!")
|
raise ValueError("Aste ei voi olla < 1!")
|
||||||
|
|
||||||
self._trie = trie
|
self._trie = trie
|
||||||
|
self._opetusdata = []
|
||||||
self._aste = aste
|
self._aste = aste
|
||||||
self._menneet_tilat = deque()
|
self._menneet_tilat = deque()
|
||||||
|
|
||||||
|
@ -25,8 +26,9 @@ class MarkovKetju:
|
||||||
["ABC", "ABB", "AAAAAA"]
|
["ABC", "ABB", "AAAAAA"]
|
||||||
"""
|
"""
|
||||||
self._trie = Trie()
|
self._trie = Trie()
|
||||||
|
self._opetusdata = opetusdata
|
||||||
|
|
||||||
for jono in opetusdata:
|
for jono in self._opetusdata:
|
||||||
if len(jono) > self._aste:
|
if len(jono) > self._aste:
|
||||||
alkio = deque(jono[0:self._aste+1])
|
alkio = deque(jono[0:self._aste+1])
|
||||||
self._trie.lisaa(alkio)
|
self._trie.lisaa(alkio)
|
||||||
|
@ -38,11 +40,20 @@ class MarkovKetju:
|
||||||
|
|
||||||
def aseta_alkuosa(self, alkuosa):
|
def aseta_alkuosa(self, alkuosa):
|
||||||
"""Asettaa alkuosan, jonka perusteella Markovin ketju luo seuraavan merkin.
|
"""Asettaa alkuosan, jonka perusteella Markovin ketju luo seuraavan merkin.
|
||||||
Alkuosan pituus on sama kuin ketjun aste, liian pitkästä alkuosasta jätetään
|
Alkuosan pituus on vähintään yksi, liian pitkästä alkuosasta jätetään
|
||||||
loppu pois.
|
loppu pois. Liian lyhyttä täydennetään opetusdatan perusteella.
|
||||||
"""
|
"""
|
||||||
if len(alkuosa) < self._aste:
|
while len(alkuosa) < self._aste:
|
||||||
raise ValueError("Liian lyhyt alkuosa!")
|
ketju = MarkovKetju(len(alkuosa))
|
||||||
|
ketju.kasittele_opetusdata(self._opetusdata)
|
||||||
|
ketju.aseta_alkuosa(alkuosa)
|
||||||
|
alkuosa = [x for x in alkuosa]
|
||||||
|
|
||||||
|
seuraava = ketju.seuraava()
|
||||||
|
if not seuraava:
|
||||||
|
raise ValueError("Alkuosan täydennys ei onnistunut!")
|
||||||
|
alkuosa.append(seuraava)
|
||||||
|
|
||||||
self._menneet_tilat = deque([alkuosa[i] for i in range(0, self._aste)])
|
self._menneet_tilat = deque([alkuosa[i] for i in range(0, self._aste)])
|
||||||
|
|
||||||
def seuraava(self):
|
def seuraava(self):
|
||||||
|
|
|
@ -10,6 +10,9 @@ class TestMarkovKetju(unittest.TestCase):
|
||||||
ketju = MarkovKetju(1)
|
ketju = MarkovKetju(1)
|
||||||
opetusdata = ["ABCDEA"]
|
opetusdata = ["ABCDEA"]
|
||||||
ketju.kasittele_opetusdata(opetusdata)
|
ketju.kasittele_opetusdata(opetusdata)
|
||||||
|
|
||||||
|
self.assertRaises(ValueError, ketju.seuraava)
|
||||||
|
|
||||||
ketju.aseta_alkuosa("E")
|
ketju.aseta_alkuosa("E")
|
||||||
|
|
||||||
self.assertEqual("A", ketju.seuraava())
|
self.assertEqual("A", ketju.seuraava())
|
||||||
|
@ -35,10 +38,25 @@ class TestMarkovKetju(unittest.TestCase):
|
||||||
self.assertEqual("E", ketju.seuraava())
|
self.assertEqual("E", ketju.seuraava())
|
||||||
self.assertEqual("A", ketju.seuraava())
|
self.assertEqual("A", ketju.seuraava())
|
||||||
|
|
||||||
self.assertRaises(ValueError, ketju.aseta_alkuosa, "F")
|
|
||||||
ketju.aseta_alkuosa("EF")
|
ketju.aseta_alkuosa("EF")
|
||||||
self.assertFalse(ketju.seuraava())
|
self.assertFalse(ketju.seuraava())
|
||||||
|
|
||||||
|
def test_alkuosan_taydennys(self):
|
||||||
|
ketju = MarkovKetju(2)
|
||||||
|
opetusdata = ["ABCDEAB"]
|
||||||
|
ketju.kasittele_opetusdata(opetusdata)
|
||||||
|
|
||||||
|
self.assertRaises(ValueError, ketju.aseta_alkuosa, "F")
|
||||||
|
|
||||||
|
ketju.aseta_alkuosa("A")
|
||||||
|
|
||||||
|
self.assertEqual("C", ketju.seuraava())
|
||||||
|
self.assertEqual("D", ketju.seuraava())
|
||||||
|
self.assertEqual("E", ketju.seuraava())
|
||||||
|
self.assertEqual("A", ketju.seuraava())
|
||||||
|
self.assertEqual("B", ketju.seuraava())
|
||||||
|
self.assertEqual("C", ketju.seuraava())
|
||||||
|
|
||||||
def test_seuraava_todennakoisyys(self):
|
def test_seuraava_todennakoisyys(self):
|
||||||
"""Testaa, että Markovin ketjun antamat merkit ilmenevät likimain oikeilla yleisyyksillä"""
|
"""Testaa, että Markovin ketjun antamat merkit ilmenevät likimain oikeilla yleisyyksillä"""
|
||||||
ketju = MarkovKetju(1)
|
ketju = MarkovKetju(1)
|
||||||
|
@ -64,7 +82,7 @@ class TestMarkovKetju(unittest.TestCase):
|
||||||
a_maara += 1
|
a_maara += 1
|
||||||
elif merkki == "B":
|
elif merkki == "B":
|
||||||
b_maara += 1
|
b_maara += 1
|
||||||
elif merkki == "C":
|
else:
|
||||||
c_maara += 1
|
c_maara += 1
|
||||||
|
|
||||||
a_osuus = a_maara / yhteensa # Pitäisi olla noin 1/6
|
a_osuus = a_maara / yhteensa # Pitäisi olla noin 1/6
|
||||||
|
|
24
test.py
24
test.py
|
@ -1,24 +0,0 @@
|
||||||
base_str = ''.join(random.choice(string.ascii_lowercase) for i in range(100000000))
|
|
||||||
start_time = time.time()
|
|
||||||
durations = []
|
|
||||||
|
|
||||||
dictionary = {}
|
|
||||||
|
|
||||||
for i in range(26):
|
|
||||||
dictionary[string.ascii_lowercase[i]] = i
|
|
||||||
|
|
||||||
start_time = time.time()
|
|
||||||
result = []
|
|
||||||
for c in base_str:
|
|
||||||
result.append(dictionary[c])
|
|
||||||
durations.append(time.time() - start_time)
|
|
||||||
|
|
||||||
start_time = time.time()
|
|
||||||
result = []
|
|
||||||
for c in base_str:
|
|
||||||
result.append(ord(c)-97)
|
|
||||||
durations.append(time.time() - start_time)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
print(durations)
|
|
Reference in a new issue