Пример #1
0
 def test_double_word_not_found(self):
     # It should look for a match to both a & c first,
     # and when it doesn't find anything, should return the match for c
     mc = MarkovChain(self.corpus, 2)
     mc.fit()
     self.assertEqual(mc.next_word(['a','c']),'a')
     self.assertEqual(mc.next_word(['alef','gimel']),'alef')
Пример #2
0
 def test_double_word_found(self):
     # It should look for a match to both a & b first,
     mc = MarkovChain(self.corpus, 2)
     mc.fit()
     self.assertEqual(mc.next_word(['a','b']),'c')
     self.assertEqual(mc.next_word(['b','c']),'a')
     self.assertEqual(mc.next_word(['alef','bet']),'gimel')
     self.assertEqual(mc.next_word(['bet','gimel']),'alef')
Пример #3
0
 def test_double_word_found(self):
     # It should look for a match to both a & b first,
     mc = MarkovChain(self.corpus, 2)
     mc.fit()
     self.assertEqual(mc.next_word(["a", "b"]), "c")
     self.assertEqual(mc.next_word(["b", "c"]), "a")
     self.assertEqual(mc.next_word(["alef", "bet"]), "gimel")
     self.assertEqual(mc.next_word(["bet", "gimel"]), "alef")
Пример #4
0
    def test_single_word(self):
        mc = MarkovChain(self.corpus, 1)
        mc.fit()

        # First line
        self.assertEqual(mc.next_word(['a']),'b')
        self.assertEqual(mc.next_word(['b']),'c')
        self.assertEqual(mc.next_word(['c']),'a')

        # Second line
        self.assertEqual(mc.next_word(['alef']),'bet')
        self.assertEqual(mc.next_word(['bet']),'gimel')
        self.assertEqual(mc.next_word(['gimel']),'alef')
Пример #5
0
    def test_single_word(self):
        mc = MarkovChain(self.corpus, 1)
        mc.fit()

        # First line
        self.assertEqual(mc.next_word(["a"]), "b")
        self.assertEqual(mc.next_word(["b"]), "c")
        self.assertEqual(mc.next_word(["c"]), "a")

        # Second line
        self.assertEqual(mc.next_word(["alef"]), "bet")
        self.assertEqual(mc.next_word(["bet"]), "gimel")
        self.assertEqual(mc.next_word(["gimel"]), "alef")
Пример #6
0
class MCMarkov():

    def __init__(self, corpus, n_order=1, reverse=True):
        if reverse:
            self.corpus = [line[::-1] for line in corpus]
        else:
            self.corpus = corpus
        self.reverse = reverse
        self.markovchain = MarkovChain(self.corpus, n_order)
        self.markovchain.fit()
        self.starting_words = [line[0] for line in self.corpus if line]
        self.rhymedict = {}
        for word in self.starting_words:
            keys = rhymesyls(word)
            for key in keys:
                if key in self.rhymedict:
                    self.rhymedict[key].append(word)
                else:
                    self.rhymedict[key] = [word]
        self.words_to_rhyme = {}
        for key in self.rhymedict.keys():
            if len(set(self.rhymedict[key]))>1:
                self.words_to_rhyme[key] = self.rhymedict[key]


    def create_line(self, startingword, syllable_count): # To be changed to syllable count
        line = [startingword]
        remaining_syllable_count = syllable_count - nsyl(startingword)
        i = 0
        while remaining_syllable_count > 0:
            if i == 0:
                word = self.markovchain.next_word([startingword])
            else:
                word = self.markovchain.next_word([word])
            if word == '\n': # If previous word has no following words, backup and start again
                prevword = line.pop()
                remaining_syllable_count += nsyl(prevword)
            if nsyl(word) <= remaining_syllable_count:
                line.append(word)
                remaining_syllable_count -= nsyl(word)
                i += 1
        if self.reverse:
            line = line[::-1]
        return line

    def create_song(self, couplet_count, syllable_count, syllable_map = None):
        if syllable_map is not None:
            couplet_count = len(syllable_map)
        song = []
        for i in range(0,couplet_count):
            if syllable_map is not None:
                line_map = syllable_map[i]
                line1_syllable_count = line_map[0]
                line2_syllable_count = line_map[1]
            else:
                line1_syllable_count = syllable_count
                line2_syllable_count = syllable_count
            rhymewords = set(self.words_to_rhyme[random.choice(self.words_to_rhyme.keys())])
            thisrhymes = random.sample(rhymewords,2)
            startingword1 = thisrhymes[0]
            startingword2 = thisrhymes[1]
            line1 = self.create_line(startingword1, line1_syllable_count)
            line2 = self.create_line(startingword2, line2_syllable_count)
            couplet = [line1, line2]
            song.append(couplet)
        return song
Пример #7
0
from markov.markov import MarkovChain
import pickle

corpus = pickle.load(open( "eminemcorpus.pickle", "rb" ) )
mc = MarkovChain(corpus, 4)
print "Fitting..."
mc.fit()
print "Fit complete!"

generated_lyrics = []
word = None
print('starting lyric generation!')
for i in range(0,50):
    print i
    if word:
        # NOTE: this argument has to a be a list
        word = mc.next_word([word])
        print word
    else:
        word = mc.next_word()
        print word
    generated_lyrics.append(word)

print(generated_lyrics)
Пример #8
0
 def test_no_word(self):
     # If no word is passed, markov should return something
     # TODO: Test this is actually random?
     mc = MarkovChain(self.corpus, 1)
     mc.fit()
     self.assertNotEqual(mc.next_word([]),None)