Matthew Kaney at ITP

Final Project: Code and Description

Reading and Writing Electronic Text


233

Generative text easily lends itself to conceptual, often humorous writing, a tone that I frequently adopt in my work. So for my final project, I wanted push myself towards a more personal approach to electronic text. As a source, I looked to Gmail chat messages sent between my husband and myself. We’ve sent roughly 45,000 messages back and forth, covering the six-year span of our relationship (except for several months where we used the now-defunct Google Wave.) Chatting has always been an important, and sometimes primary, form of communication, and these chats form a rich sample. Loving, angry, depressed, intimate, and often painfully banal, these chats archive the daily facts of what happened and how we felt in our respective lives.

In a previous post, I discuss how I collected the data. Once I had the data collected and parsed, the writing could begin. To begin, I wrote a series of prototype programs, each trying to randomly extract different types of information from the messages. From these loose experiments, I developed my favorites, eventually turning them into self-contained methods.

Grabbing Noun Phrases

One thing I immediately noticed what how much of our communication was basically “Are you there? What’s up?” type of messages. Reading 200 such messages back to back could be compelling poetry, but it’s not very narrative. I really wanted to tell the story of the things that happened to us, so noun phrases seemed like a good place to start. I used TextBlob to do part of speech tagging, though instead of using their built-in noun phrase extraction, I did my own, because it allowed me a bit more control over what phrases I looked for (and I was happier with the results I got).

from textblob import TextBlob

#------------ From a set of rows, get all noun phrases -----
# (Very simplified; "noun phrase" here mean x * adj + y * noun)
def getNounPhrases(chatList):
    phrases = []
    
    for row in chatList:
        newBlob = TextBlob(row[2])
        
        phrase = [];
        hasNoun = False;
        
        for tag in getTags(newBlob):
            if len(tag[0]) > 1:
                if tag[1] == 'JJ':
                    phrase.append(tag[0]);
                elif tag[1] == 'NN' or tag[1] == 'NNS' or tag[1] == 'NNP':
                    hasNoun = True;
                    phrase.append(tag[0]);
                else:
                    if hasNoun and len(phrase) > 1:
                        phrases.append(' '.join(phrase));
                    hasNoun = False;
                    phrase = [];
        
        if hasNoun and len(phrase) > 1:
            phrases.append(' '.join(phrase));
            hasNoun = False;
    
    return phrases

Running this code on things I said in 2010 yields “good inspiration, empty box, other box, half full, organic mac cheeses”, among others.

Getting Simple Sentences

From there, I realized that I could similarly search for tiny sentences, in the most basic “sentence = noun + verb” elementary grammar sense. These have even more narrative thrust than a mere list of noun phrases.

#-------------- Get Subject + Verb ---------------------------
def getTinySentences(chatList):
    phrases = []
    
    for row in chatList:
        newBlob = TextBlob(row[2])
        
        for sentence in newBlob.sentences:
            phrase = []
            
            for tag in getTags(sentence):
                # Ignore single-character "words"
                if len(tag[0]) > 1:
                    if tag[1][0:2] == 'VB':
                        # If we get a verb, check if we already
                        # have a noun. If so, add the verb to our
                        # phrase.
                        if len(phrase) > 0:
                            phrase.append(tag)
                    elif (tag[1] == 'NN' or tag[1] == 'NNS' or
                          tag[1] == 'NNP' or tag[1] == 'PNP'):
                        # Otherwise, if we have a noun or pronoun,
                        # start assembling the phrase
                        phrase = [tag]
                    else:
                        # If we get any other word, then we're no
                        # longer looking at a phrase. If we've already
                        # collected a phrase, append it to the output.
                        if len(phrase) > 1:
                            newPhrase = ''
                            
                            for word in phrase:
                                newPhrase += word[0] + ' '
                                
                            phrases.append(newPhrase[:-1])
                        
                        phrase = []
    return phrases

For example, “circle indicates, girls watch, noise got” and so on.

Getting “—ing” Words

From there, I looked at getting all gerunds (or rather, all words ending in “—ing” except for words that were variants of “thing”, because that was obnoxious to show up in a list of verbs). The code here is pretty simple:

#-------------------- Get a list of "gerunds" from a chat list -----------
def getGerunds(chatList):
    gerunds = set();

    for row in chatList:
        blob = TextBlob(row[2])
        
        for word in blob.words:
            if word.lower()[-3:] == 'ing' and word.lower()[-5:] != 'thing':
                gerunds.add(word.lower());
    
    return gerunds;

This yields “saying, walking, breaking, pointing” etc. Nice, but it got much better when I sorted by phonetic similarity, as I did in a much older project. I built a second function that sorted the output of the first function (while not allowing duplicates, hence the set in the gerund function).

# Given a word and a list of words/phrases, sort the list of words/phrases
# based on how similarly they sound to the given word. Not rhyming per se,
# but a nice combo of rhyme, alliteration, assonance, and so on.
def rankProximity(comparison, wordList):
    comparison = pronouncer.cleanWord(comparison)
    outputList = []
    
    for word in wordList:
        cleanWord = pronouncer.cleanWord(word.split()[0])
        
        if cleanWord in pronouncer.phoneticDict and comparison != cleanWord:
            matcher = difflib.SequenceMatcher(None,
                                pronouncer.phoneticDict[comparison][0],
                                pronouncer.phoneticDict[cleanWord][0])
            similarity = matcher.ratio()
            
            outputList.append([word, similarity]);
    
    outputList.sort(key=lambda x: x[1])
    outputList.reverse();
    
    return outputList;

Sorting a given list (again, me in 2010) by their proximity to the word “making” gives us: mocking and taking (at 80% match), breaking (73% match), moneymaking (71% match), and so on.

General Search and a Couple Utilities

Also, I just wanted to be able to search for specific words, and this general-purpose code fit the bill:

def chatGrep(search, chatList, maxLength=10):
    output = []
    
    for row in chatList:
        blob = TextBlob(row[2])
        
        for sentence in blob.sentences:
            if search.lower() in sentence.lower() and len(sentence.words) < maxLength:
                output.append(sentence)
    
    return output

Finally, you might notice that I use getWords() and getTags() methods several times above. Basically, TextBlob parses apostrophes and contractions out as separate tokens, which is I’m sure sometimes useful, but more trouble than it’s worth here. So, I wrote a couple methods to reassemble contractions, while still performing the useful natural language stuff that TextBlob gives us.

def getWords(sentence):
    phrase = sentence.words
    
    out = []
    
    suffixes = ["n't", "'s", "'m", "'re", "'ve", "'d", "'ll"]
    
    for word in phrase:
        if word.lower() in suffixes:
            out[-1] = out[-1] + word
        else:
            out.append(word)
            
    return out

def getTags(sentence):
    phrase = sentence.tags
    
    out = []
    
    suffixes = ["t", "s", "m", "re", "ve", "d", "ll"]
    suffix = False
    
    for word in phrase:
        if len(out) > 0 and (word[0].lower() == "'" or word[0].lower() == "n"):
            out[-1][0] = out[-1][0] + word[0]
            suffix = True
        elif suffix and word[0].lower() in suffixes:
            out[-1][0] = out[-1][0] + word[0]
        else:
            out.append([word[0], word[1]])
            suffix = False
            
    return out

Pulling it all Together

Of course, the important thing about these chats was that I knew who said them, and when. In my final poem, I wanted to sort things chronologically by year, and distinguish the things that Caleb and I said, so I wrote a simple program for returning a subset of rows, before passing that data into any of the above functions.

#------------ Basic filtered rows -------------------------
def filteredRows(person, year):
    subset = []
    
    for row in rows:
        if row[1] == person and row[0].year == year:
            subset.append(row)
    
    return subset

With all these functions, I wrote a script for assembling them. First into lines, and then into a poem:

# From a set of gerunds, make a list of a certain number of syllables, where
# each no word is repeated, and each word sounds similar to the previous.
def getGerundList(gerunds, maxSyllableLength):
    firstWord = random.choice(list(gerunds))
    
    while pronouncer.cleanWord(firstWord) not in pronouncer.phoneticDict:
        firstWord = random.choice(list(gerunds))
    
    gerundList = [firstWord]
    syllableLength = len(pronouncer.getMeter(firstWord))
    
    while syllableLength < maxSyllableLength:
        gerunds.remove(gerundList[-1])
        sortedList = rankProximity(gerundList[-1], gerunds)
        
        gerundList.append(random.choice(sortedList[:3])[0])
        syllableLength += len(pronouncer.getMeter(gerundList[-1]))
    
    return gerundList

# From a set of phrases, string together a list of phrases of the desired
# syllable length.
def getPhraseList(phrases, maxSyllableLength):
    firstPhrase = random.choice(phrases)
    
    while not pronouncer.check(firstPhrase):
        firstPhrase = random.choice(phrases)
    
    phraseList = [firstPhrase]
    syllableLength = len(pronouncer.getMeter(firstPhrase))
    
    tries = 0
    
    while syllableLength < maxSyllableLength and tries < 300:
        newPhrase = random.choice(phrases)
        
        if pronouncer.check(newPhrase):
            phraseList.append(newPhrase)
            syllableLength += len(pronouncer.getMeter(newPhrase))
            tries = 0
        
        tries += 1
    
    return phraseList

#-------------------------------------------------------------
# Generate one stanza for each year (2010-2015)
for year in range(2010, 2016):
    myRows = filteredRows('matthew', year)
    hisRows = filteredRows('caleb', year)
    
    print 'In ' + str(year) + ':\n'
    
    # Each stanza has six pairs of lines
    for i in range(0, 6):
        # The speaker alternates each line
        if i % 2 == 0:
            currRows = myRows
            currPerson = 'i'
        else:
            currRows = hisRows
            currPerson = 'you'
        
        # The speaker can say one of three types of things, randomly chosen
        path = random.randint(0, 2)
        
        if path == 0:
            gerunds = getGerunds(currRows)
            gerundList = getGerundList(gerunds, 8);
            print currPerson + ' said: ' + ', '.join(gerundList)
            gerundList = getGerundList(gerunds, 10);
            print ', '.join(gerundList)
        elif path == 1:
            tinySentences = getTinySentences(currRows)
            tinySentenceList = getPhraseList(tinySentences, 8)
            print currPerson + ' said: ' + ', '.join(tinySentenceList)
            tinySentenceList = getPhraseList(tinySentences, 10)
            print ', '.join(tinySentenceList)
        elif path == 2:
            nounPhrases = getNounPhrases(currRows)
            nounPhraseList = getPhraseList(nounPhrases, 8)
            print currPerson + ' said: ' + ', '.join(nounPhraseList)
            nounPhraseList = getPhraseList(nounPhrases, 10)
            print ', '.join(nounPhraseList)
        
        print ''
    
    #---- End each year/stanza with a pair of sentences where ----
    #--------------- each of us addresses the other --------------
    mySentences = pronouncer.findWordsWithLength(8, chatGrep('you ', myRows))
    mySentence = random.choice(mySentences)
    
    if mySentence[-1] == '?':
        verb = 'asked'
    else:
        verb = 'said'
    
    print 'i ' + verb + ': ' + str(mySentence)
    
    hisSentences = pronouncer.findWordsWithLength(7, chatGrep('you ', hisRows))
    hisSentence = random.choice(hisSentences)
    
    if hisSentence[-1] == '?':
        verb = 'asked'
    else:
        verb = 'said'
    
    print 'you ' + verb + ': ' + str(hisSentence) + '\n'

Bonus: Better Pronouncing Module Functionality

I used my CMU Pronouncing Dictionary functions on this project to get lines with certain numbers of syllables, and compare the similarity of two words. Unfortunately, this only works for words in the speaking dictionary, which was limiting, especially considering I write linguistic monstrosities like “bit-shifting/packing/masking”. So, I updated my pronouncing library to break apart such compound words and then evaluate them based on the sum of the pronunciation of each part. In the interest of full disclosure, that code is here too:

import string

# Array of all vowel sounds in the CMU speaking dictionary
vowelSounds = ["AA", "AE", "AH", "AO", "AW", "AY", "EH", "ER", "EY",
               "IH", "IY", "OW", "OY", "UH", "UW"]

# Now, import and populate the CMU speaking dictionary
cmu = open('cmudict', 'r')

phoneticDict = {}

for line in cmu:
    tokens = line.split()
    
    # Only grab the first pronunciation in the dictionary, for now
    if tokens[1] == "1":
        key = tokens[0]
        phonemes = []
        stresses = []

        # Some phonemes have a number indicating stress (e.g. "EH1").
        for phoneme in tokens[2:]:
            # If this is one of those, split the phoneme from the stress
            if not phoneme.isalpha():
                stresses.append(int(phoneme[-1]))
                phoneme = phoneme[:-1]

            phonemes.append(phoneme)

        phoneticDict[key] = (phonemes, stresses)

cmu.close()

# Convert tokens (with attached whitespace, punctuation, and irregular
# capitalization) to a clean, all-caps form
def cleanWord(word):
    newWord = word.upper()
    newWord = newWord.strip(string.punctuation)
    return newWord

# Check whether two words are both a) in the pronouncing dictionary and
# b) rhyming. Returns True or False.
def rhymingWords(firstWord, secondWord):
    firstWord = cleanWord(breakUpWords(firstWord)[-1])
    secondWord = cleanWord(breakUpWords(secondWord)[-1])
    
    if firstWord == secondWord:
        return False
    
    if firstWord in phoneticDict:
        searchSyllables, searchStresses = phoneticDict[firstWord]
    else:
        return False
    
    if secondWord in phoneticDict:
        wordSyllables, wordStresses = phoneticDict[secondWord]
    else:
        return False
    
    lastPhoneme = ''
    stressCounter = 1
    lastStress = 0

    for i in range(1, 1 + min(len(searchSyllables), len(wordSyllables))):
        if (searchSyllables[-i] == wordSyllables[-i] and
           stressCounter <= len(wordStresses) and
           stressCounter <= len(searchStresses)):
            lastPhoneme = searchSyllables[-i]

            if lastPhoneme in vowelSounds:
                lastStress = (wordStresses[-1 * stressCounter] and
                             searchStresses[-1 * stressCounter])

                stressCounter += 1
        else:
            break

    if (lastPhoneme in vowelSounds) and (lastStress > 0):
        return True
    else:
        return False

# For a given string, split the string into individual words and then return
# the meter of the entire string of words, in terms of stresses where
# 0 = no stress, 1 = primary stress, and 2 = secondary stress.
# For example, [1, 0, 1, 1, 0, 2]
def getMeter(line):
    words = breakUpWords(line)
    meter = [];
    
    for word in words:
        currWord = cleanWord(word);
        
        if currWord in phoneticDict:
            meter += phoneticDict[currWord][1]
        else:
            return False;
    
    return meter

# Get a list of words that rhyme with a certain word. The first parameter
# is the word that the results should rhyme with. The optional second
# parameter is the list of words for searching in. If no list is specified,
# the function will search the entire pronouncing dictionary.
def findWordsWithRhyme(rhyme, searchList=phoneticDict.keys()):
    result = [];
    
    for word in searchList:
        if rhymingWords(rhyme, word):
            result.append(word);
    
    return result;

# Return a list of words that have the given pattern of stresses. The first
# parameter is a list of stresses (0, 1, or 2). The optional second parameter
# is the list of words for searching in. If no list is specified, the
# function will search the entire pronouncing dictionary.
def findWordsWithMeter(meter, searchList=phoneticDict.keys()):
    result = [];
    
    for word in searchList:
        searchMeter = getMeter(word);
        
        if searchMeter == meter:
        	result.append(word);
    
    return result;

# Return a list of words with a certain syllable length. The first parameter
# is a number of syllables, and the optional second parameter is a list of
# legal words or phrases. If no list is specified, the function will
# search the entire pronouncing dictionary.
def findWordsWithLength(syllableLength, searchList=phoneticDict.keys()):
    result = [];
    
    for word in searchList:
        searchMeter = getMeter(word);
        
        if searchMeter and len(searchMeter) == syllableLength:
        	result.append(word);
    
    return result;

# Convert a phrase (multiple words, as well as compound words formed with
# hyphens or slashes) into a list of single words.
def breakUpWords(phrase):
    if cleanWord(phrase) in phoneticDict:
        return [phrase]

    input1 = phrase.split()
    output = []

    for word1 in input1:
        input2 = word1.split('-')

        for word2 in input2:
            input3 = word2.split('/')

            for word3 in input3:
                output.append(word3)
    return output

# Check whether a phrase consists of a legal (that is, in the pronouncing
# dictionary) word, or a series of legal words (either in a phrase, or in
# compound words). Returns True or False.
def check(phrase):
    words = breakUpWords(phrase)

    for word in words:
        if cleanWord(word) not in phoneticDict:
            return False

    return True

Comments

  1. FFXIV Gil Store on November 22, 2015 at 11:29 am

    FFXIV Gil Store

    You are nothing like us .

  2. eso gold store on November 25, 2015 at 9:02 pm

    eso gold store

    You are looking sharp !

  3. fut 16 coins on November 29, 2015 at 12:49 am

    fut 16 coins

    What is with that guy?

  4. buy MUT Coins on January 2, 2016 at 7:26 pm

    buy MUT Coins

    hello!this is extremely good game website!

  5. madden 16 coins android for sale on January 4, 2016 at 6:05 pm

    madden 16 coins android for sale

    I’m all yours!

  6. Blade & Soul Power leveling on February 2, 2016 at 11:28 pm

    Blade & Soul Power leveling

    youre looking sharp!

  7. MS Mesos on February 2, 2016 at 11:28 pm

    MS Mesos

    You are looking sharp !

  8. BNS Gold on February 2, 2016 at 11:29 pm

    BNS Gold

    I’ve been through this!

  9. Albion Online Items on February 2, 2016 at 11:29 pm

    Albion Online Items

    you have a good sense of humor.

  10. Cheap BNS Gold on February 2, 2016 at 11:29 pm

    Cheap BNS Gold

    I respect your work.

  11. Blade And Soul Items on February 2, 2016 at 11:29 pm

    Blade And Soul Items

    If I have the guts to quit my job .

  12. Blade & Soul Power leveling on February 2, 2016 at 11:30 pm

    Blade & Soul Power leveling

    How come you are working here?

  13. Albion Online Power Leveling on February 2, 2016 at 11:30 pm

    Albion Online Power Leveling

    Not that I know of.

  14. Albion Online Silver on February 2, 2016 at 11:30 pm

    Albion Online Silver

    You always love it.

  15. Albion Online Gold on February 2, 2016 at 11:30 pm

    Albion Online Gold

    Take my word for it.

  16. Cheap Albion Online Gold on February 2, 2016 at 11:31 pm

    Cheap Albion Online Gold

    The youre really talented .

  17. Albion Online Power Leveling on February 2, 2016 at 11:31 pm

    Albion Online Power Leveling

    You bet !

  18. Cheap Blade And Soul Gold on February 2, 2016 at 11:31 pm

    Cheap Blade And Soul Gold

    were so proud of you.

  19. MS Mesos on February 2, 2016 at 11:31 pm

    MS Mesos

    Good !|Cool! I love your this bolg.

  20. buy Albion Online Gold on February 2, 2016 at 11:32 pm

    buy Albion Online Gold

    Come on, cut it out!

  21. Cheap Albion Online Gold on February 2, 2016 at 11:32 pm

    Cheap Albion Online Gold

    Im very pleased with your work.

  22. Buy Blade And Soul Gold on February 2, 2016 at 11:32 pm

    Buy Blade And Soul Gold

    How do you work here ?

  23. Buy Blade And Soul Gold on February 2, 2016 at 11:32 pm

    Buy Blade And Soul Gold

    That’s not the issue.

  24. Blade & Soul Power leveling on February 2, 2016 at 11:33 pm

    Blade & Soul Power leveling

    You started it !

  25. Blade And Soul Gold on February 2, 2016 at 11:33 pm

    Blade And Soul Gold

    I do not know

  26. Blade & Soul Power leveling on February 2, 2016 at 11:33 pm

    Blade & Soul Power leveling

    Nobody can do a better job than you.

  27. Buy MapleStory Mesos on February 2, 2016 at 11:33 pm

    Buy MapleStory Mesos

    Why don’t we give this a try?

  28. Cheap Blade And Soul Gold on February 2, 2016 at 11:34 pm

    Cheap Blade And Soul Gold

    hello!this is very good site!

  29. Cheap Blade And Soul Gold on February 2, 2016 at 11:34 pm

    Cheap Blade And Soul Gold

    To hell with that bitch!

  30. Buy Albion Online Gold on February 2, 2016 at 11:34 pm

    Buy Albion Online Gold

    Take my word for it.

  31. Albion Online Silver on February 2, 2016 at 11:34 pm

    Albion Online Silver

    Do not rush me.

  32. Blade & Soul Power leveling on February 2, 2016 at 11:35 pm

    Blade & Soul Power leveling

    I will be there for you.

  33. Blade And Soul Gold on February 2, 2016 at 11:35 pm

    Blade And Soul Gold

    Today looks great .

  34. BNS Gold on February 2, 2016 at 11:35 pm

    BNS Gold

    This is really a nice place.

  35. Cheap Blade And Soul Gold on February 2, 2016 at 11:35 pm

    Cheap Blade And Soul Gold

    Take my word for it.

  36. Albion Online Gold on February 2, 2016 at 11:36 pm

    Albion Online Gold

    look great today.

  37. Albion Online Gold on February 2, 2016 at 11:36 pm

    Albion Online Gold

    this is a very helpful web site!

  38. Blade & Soul Items on February 2, 2016 at 11:36 pm

    Blade & Soul Items

    youre really talented.

  39. Cheap BNS Gold on February 2, 2016 at 11:36 pm

    Cheap BNS Gold

    You are the savior of my life.

  40. Cheap BNS Gold on February 2, 2016 at 11:37 pm

    Cheap BNS Gold

    Your company is very impressive .

  41. Albion Online Silver on February 2, 2016 at 11:37 pm

    Albion Online Silver

    This is really a nice place.

  42. Albion Online Silver on February 2, 2016 at 11:37 pm

    Albion Online Silver

    The youre very eloquent .

  43. Albion Online Gold on February 2, 2016 at 11:37 pm

    Albion Online Gold

    That’s not the issue.

  44. Blade And Soul Items on February 2, 2016 at 11:38 pm

    Blade And Soul Items

    it’s a excellent weblog and i enjoy it greatly!

  45. Cheap Blade And Soul Gold on February 2, 2016 at 11:38 pm

    Cheap Blade And Soul Gold

    this website can help me personally to locate good quality suggestions!

  46. Cheap BNS Gold on February 2, 2016 at 11:38 pm

    Cheap BNS Gold

    You are looking sharp !

  47. buy Albion Online Gold on February 2, 2016 at 11:38 pm

    buy Albion Online Gold

    You’re so smart.

  48. Buy Blade And Soul Gold on February 2, 2016 at 11:39 pm

    Buy Blade And Soul Gold

    That makes two of us.

  49. Blade And Soul Gold on February 2, 2016 at 11:39 pm

    Blade And Soul Gold

    Take my word for it.

  50. Cheap Blade And Soul Gold on February 2, 2016 at 11:39 pm

    Cheap Blade And Soul Gold

    What is that guy?

  51. Blade & Soul Power leveling on February 2, 2016 at 11:39 pm

    Blade & Soul Power leveling

    My way or the highway.

  52. Buy BNS Gold on February 2, 2016 at 11:40 pm

    Buy BNS Gold

    You are so cute.

  53. Buy Blade And Soul Gold on February 2, 2016 at 11:40 pm

    Buy Blade And Soul Gold

    You are so cute.

  54. Albion Online Gold on February 2, 2016 at 11:40 pm

    Albion Online Gold

    Up yours!

  55. MapleStory Mesos on February 2, 2016 at 11:40 pm

    MapleStory Mesos

    I have no idea what you have said

  56. Blade & Soul Gold on February 2, 2016 at 11:41 pm

    Blade & Soul Gold

    You always know the right thing to say.

  57. Cheap BNS Gold on February 2, 2016 at 11:41 pm

    Cheap BNS Gold

    Why do not we try this ?

  58. Blade And Soul Gold on February 2, 2016 at 11:41 pm

    Blade And Soul Gold

    You started it !

  59. Buy Blade And Soul Gold on February 2, 2016 at 11:41 pm

    Buy Blade And Soul Gold

    I do not have a clue !

  60. Buy MapleStory Mesos on February 2, 2016 at 11:42 pm

    Buy MapleStory Mesos

    i like this website so much!

  61. Blade & Soul Gold on February 2, 2016 at 11:42 pm

    Blade & Soul Gold

    You are so cute.

  62. Buy Albion Online Gold on February 2, 2016 at 11:42 pm

    Buy Albion Online Gold

    Good !|Cool! I love your this bolg.

  63. Cheap BNS Gold on February 2, 2016 at 11:42 pm

    Cheap BNS Gold

    What if I had the guts to quit my job.

  64. Albion Online Silver on February 2, 2016 at 11:43 pm

    Albion Online Silver

    You have a good taste.

  65. Cheap MapleStory Mesos on February 2, 2016 at 11:43 pm

    Cheap MapleStory Mesos

    To hell with that bitch!

  66. Cheap Albion Online Gold on February 2, 2016 at 11:43 pm

    Cheap Albion Online Gold

    Good !|Cool! I love your this bolg.

  67. Blade & Soul Gold on February 2, 2016 at 11:43 pm

    Blade & Soul Gold

    Even call it.

  68. MapleStory Mesos on February 2, 2016 at 11:44 pm

    MapleStory Mesos

    Now you tell me that she was not a knockout !

  69. Blade & Soul Items on February 2, 2016 at 11:44 pm

    Blade & Soul Items

    You have a good taste.

  70. Buy Blade And Soul Gold on February 2, 2016 at 11:44 pm

    Buy Blade And Soul Gold

    Why do not we try this ?

  71. Cheap Albion Online Gold on February 2, 2016 at 11:44 pm

    Cheap Albion Online Gold

    You’re very professional.

  72. Cheap Blade And Soul Gold on February 2, 2016 at 11:45 pm

    Cheap Blade And Soul Gold

    it’s a very good weblog and i like it greatly!

  73. Blade And Soul Gold on February 2, 2016 at 11:45 pm

    Blade And Soul Gold

    You are looking sharp !

  74. Albion Online Power Leveling on February 2, 2016 at 11:45 pm

    Albion Online Power Leveling

    were so proud of you.

  75. Albion Online Power Leveling on February 2, 2016 at 11:45 pm

    Albion Online Power Leveling

    I let myself become a fool .

  76. Albion Online Power Leveling on February 2, 2016 at 11:46 pm

    Albion Online Power Leveling

    No one can do it better than you.

  77. Buy BNS Gold on February 2, 2016 at 11:46 pm

    Buy BNS Gold

    No, I know.

  78. Buy Blade And Soul Gold on February 2, 2016 at 11:46 pm

    Buy Blade And Soul Gold

    Not that I know of.

  79. Cheap BNS Gold on February 2, 2016 at 11:46 pm

    Cheap BNS Gold

    i can discover numerous great solutions if i have any trouble!

  80. Buy Blade And Soul Gold on February 2, 2016 at 11:47 pm

    Buy Blade And Soul Gold

    You fall for it every time.

  81. Buy Blade And Soul Gold on February 2, 2016 at 11:47 pm

    Buy Blade And Soul Gold

    Where were we?

  82. Buy Blade And Soul Gold on February 2, 2016 at 11:47 pm

    Buy Blade And Soul Gold

    Take my word .

  83. Cheap Albion Online Gold on February 2, 2016 at 11:47 pm

    Cheap Albion Online Gold

    Hold it!

  84. BNS Gold on February 2, 2016 at 11:48 pm

    BNS Gold

    Too bad we must return them.

  85. Buy Blade And Soul Gold on February 2, 2016 at 11:48 pm

    Buy Blade And Soul Gold

    If I have the guts to quit my job .

  86. Blade & Soul Power leveling on February 2, 2016 at 11:48 pm

    Blade & Soul Power leveling

    i’m able to discover numerous good solutions basically have trouble!

  87. Cheap Albion Online Gold on February 2, 2016 at 11:48 pm

    Cheap Albion Online Gold

    You started it !

  88. Buy MapleStory Mesos on February 2, 2016 at 11:49 pm

    Buy MapleStory Mesos

    How do you work here ?

  89. Cheap Albion Online Gold on February 2, 2016 at 11:49 pm

    Cheap Albion Online Gold

    I don’t know what you are saying

  90. Albion Online Gold on February 2, 2016 at 11:49 pm

    Albion Online Gold

    Come on, Stop!

  91. Buy Blade And Soul Gold on February 2, 2016 at 11:49 pm

    Buy Blade And Soul Gold

    You’re very professional.

  92. Blade & Soul Power leveling on February 2, 2016 at 11:50 pm

    Blade & Soul Power leveling

    Hold it!

  93. Cheap Albion Online Gold on February 2, 2016 at 11:50 pm

    Cheap Albion Online Gold

    Now you tell me that she was not a knockout !

  94. Albion Online Silver on February 2, 2016 at 11:50 pm

    Albion Online Silver

    Where were we?

  95. Buy Blade And Soul Gold on February 2, 2016 at 11:50 pm

    Buy Blade And Soul Gold

    this can be a very useful website!

  96. Albion Online Power Leveling on February 2, 2016 at 11:51 pm

    Albion Online Power Leveling

    Good !|Cool! I love your this bolg.

  97. Cheap BNS Gold on February 2, 2016 at 11:51 pm

    Cheap BNS Gold

    it’s very useful for me searching on this site!

  98. Albion Online Power Leveling on February 2, 2016 at 11:51 pm

    Albion Online Power Leveling

    Do you have a good sense of humor .

  99. Albion Online Items on February 2, 2016 at 11:51 pm

    Albion Online Items

    Nobody can do a better job than you.

  100. Albion Online Power Leveling on February 2, 2016 at 11:52 pm

    Albion Online Power Leveling

    No, I know.

  101. Cheap Albion Online Gold on February 2, 2016 at 11:52 pm

    Cheap Albion Online Gold

    Up yours!

  102. MS Mesos on February 2, 2016 at 11:52 pm

    MS Mesos

    were so proud of you.

  103. Blade & Soul Items on February 2, 2016 at 11:52 pm

    Blade & Soul Items

    I have no idea what you have said

  104. Buy Blade And Soul Gold on February 2, 2016 at 11:53 pm

    Buy Blade And Soul Gold

    Do not push me.

  105. Buy Albion Online Gold on February 2, 2016 at 11:53 pm

    Buy Albion Online Gold

    Nobody can do a better job than you.

  106. BNS Gold on February 2, 2016 at 11:53 pm

    BNS Gold

    I do not have a clue !

  107. Albion Online Silver on February 2, 2016 at 11:53 pm

    Albion Online Silver

    it’s a very good weblog and i like it greatly!

  108. Albion Online Silver on February 2, 2016 at 11:54 pm

    Albion Online Silver

    Nobody can do a better job than you.

  109. Buy Blade And Soul Gold on February 2, 2016 at 11:54 pm

    Buy Blade And Soul Gold

    What if I had the guts to quit my job.

  110. Blade & Soul Items on February 2, 2016 at 11:54 pm

    Blade & Soul Items

    I’m all yours!

  111. Blade And Soul Gold on February 2, 2016 at 11:54 pm

    Blade And Soul Gold

    be cool!

  112. Blade And Soul dancer on February 2, 2016 at 11:55 pm

    Blade And Soul dancer

    Do not push me.

  113. Cheap BNS Gold on February 2, 2016 at 11:55 pm

    Cheap BNS Gold

    I’ll take care of it.

  114. Buy Blade And Soul Gold on February 2, 2016 at 11:55 pm

    Buy Blade And Soul Gold

    You are nothing like us .

  115. Albion Online Silver on February 2, 2016 at 11:55 pm

    Albion Online Silver

    i’m able to find many great answers if i have trouble!

  116. Cheap Albion Online Gold on February 2, 2016 at 11:56 pm

    Cheap Albion Online Gold

    I thought I should give it a shot!

  117. Buy Blade And Soul Gold on February 2, 2016 at 11:56 pm

    Buy Blade And Soul Gold

    I don’t have a clue !

  118. MS Mesos on February 2, 2016 at 11:56 pm

    MS Mesos

    Now you tell me that she was not a knockout !

  119. Blade And Soul news on February 2, 2016 at 11:56 pm

    Blade And Soul news

    Do not rush me.

  120. Blade And Soul Gold on February 2, 2016 at 11:57 pm

    Blade And Soul Gold

    How do you work here ?

  121. Cheap BNS Gold on February 2, 2016 at 11:57 pm

    Cheap BNS Gold

    Now you tell me she’s not a knock-out!

  122. MS Mesos on February 2, 2016 at 11:57 pm

    MS Mesos

    this website might help me to locate good quality suggestions!

  123. Cheap BNS Gold on February 2, 2016 at 11:57 pm

    Cheap BNS Gold

    To hell with that bitch!

  124. BNS Gold on February 12, 2016 at 8:18 am

    BNS Gold

    I do not know

  125. Blade And Soul Gold on February 12, 2016 at 8:19 am

    Blade And Soul Gold

    You did it !

  126. Cheap Albion Online Gold on February 12, 2016 at 8:19 am

    Cheap Albion Online Gold

    You are looking sharp !

  127. Buy Blade And Soul Gold on February 12, 2016 at 8:19 am

    Buy Blade And Soul Gold

    Now you tell me that she was not a knockout !

  128. Blade & Soul Power leveling on February 12, 2016 at 8:19 am

    Blade & Soul Power leveling

    What if I had the guts to quit my job.

  129. BNS Gold on February 12, 2016 at 8:20 am

    BNS Gold

    Nobody can do a better job than you.

  130. Albion Online Silver on February 12, 2016 at 8:20 am

    Albion Online Silver

    you have a good sense of humor.

  131. Albion Online Power Leveling on February 12, 2016 at 8:20 am

    Albion Online Power Leveling

    I don’t know what you are saying

  132. buy Albion Online Gold on February 12, 2016 at 8:20 am

    buy Albion Online Gold

    What if I had the guts to quit my job.

  133. Albion Online Power Leveling on February 12, 2016 at 8:21 am

    Albion Online Power Leveling

    If I have the guts to quit my job .

  134. Blade & Soul Power leveling on February 12, 2016 at 8:21 am

    Blade & Soul Power leveling

    Good !|Cool! I love your this bolg.

  135. Buy Albion Online Gold on February 12, 2016 at 8:21 am

    Buy Albion Online Gold

    I’ll fix it!

  136. BNS Gold on February 12, 2016 at 8:21 am

    BNS Gold

    I’m all yours!

  137. Cheap BNS Gold on February 12, 2016 at 8:22 am

    Cheap BNS Gold

    this is a very helpful web site!

  138. Albion Online Power Leveling on February 12, 2016 at 8:22 am

    Albion Online Power Leveling

    this is a very helpful website!

  139. Albion Online Power Leveling on February 12, 2016 at 8:22 am

    Albion Online Power Leveling

    Come on, Stop!

  140. MS Mesos on February 12, 2016 at 8:22 am

    MS Mesos

    Im very pleased with your work.

  141. Cheap Blade And Soul Gold on February 12, 2016 at 8:23 am

    Cheap Blade And Soul Gold

    The youre very professional .

  142. Blade & Soul Gold on February 12, 2016 at 8:23 am

    Blade & Soul Gold

    You did it !

  143. Blade And Soul Gold on February 12, 2016 at 8:23 am

    Blade And Soul Gold

    You bet !

  144. Cheap Albion Online Gold on February 12, 2016 at 8:23 am

    Cheap Albion Online Gold

    Come on, cut it out!

  145. Blade & Soul Power leveling on February 12, 2016 at 8:24 am

    Blade & Soul Power leveling

    I have no idea what you have said

  146. Blade & Soul Gold on February 12, 2016 at 8:24 am

    Blade & Soul Gold

    You did a good job .

  147. Blade And Soul Items on February 12, 2016 at 8:24 am

    Blade And Soul Items

    You fall for it every time.

  148. Buy Blade And Soul Gold on February 12, 2016 at 8:24 am

    Buy Blade And Soul Gold

    be cool!

  149. Albion Online Power Leveling on February 12, 2016 at 8:25 am

    Albion Online Power Leveling

    I was wondering if after work we could grab a cup of coffee

  150. Blade & Soul Items on February 12, 2016 at 8:25 am

    Blade & Soul Items

    Today looks great .

  151. buy Albion Online Gold on February 12, 2016 at 8:25 am

    buy Albion Online Gold

    You ‘re so smart.

  152. Buy Blade And Soul Gold on February 12, 2016 at 8:25 am

    Buy Blade And Soul Gold

    You started it !

  153. Albion Online Silver on February 12, 2016 at 8:26 am

    Albion Online Silver

    Come on, cut it out!

  154. Blade & Soul Gold on February 12, 2016 at 8:26 am

    Blade & Soul Gold

    Leave me alone !

  155. Albion Online Silver on February 12, 2016 at 8:26 am

    Albion Online Silver

    You are looking sharp !

  156. Buy BNS Gold on February 12, 2016 at 8:26 am

    Buy BNS Gold

    That’s not the point.

  157. Albion Online Power Leveling on February 12, 2016 at 8:27 am

    Albion Online Power Leveling

    I’ve been through this!

  158. Blade & Soul Items on February 12, 2016 at 8:27 am

    Blade & Soul Items

    this can be a very helpful web site!

  159. MS Mesos on February 12, 2016 at 8:27 am

    MS Mesos

    Now you tell me she’s not a knock-out!

  160. BNS Gold on February 12, 2016 at 8:27 am

    BNS Gold

    You did a good job .

  161. Albion Online Power Leveling on February 12, 2016 at 8:28 am

    Albion Online Power Leveling

    How come you are working here?

  162. Buy Blade And Soul Gold on February 12, 2016 at 8:28 am

    Buy Blade And Soul Gold

    youre looking sharp!

  163. buy Albion Online Gold on February 12, 2016 at 8:28 am

    buy Albion Online Gold

    The youre very eloquent .

  164. Blade & Soul Power leveling on February 12, 2016 at 8:28 am

    Blade & Soul Power leveling

    Your company is very impressive .

  165. Cheap MapleStory Mesos on February 12, 2016 at 8:29 am

    Cheap MapleStory Mesos

    Your company is very impressive .

  166. Cheap BNS Gold on February 12, 2016 at 8:29 am

    Cheap BNS Gold

    I do not know what you are saying

  167. Buy Blade And Soul Gold on February 12, 2016 at 8:29 am

    Buy Blade And Soul Gold

    were so proud of you.

  168. Blade & Soul Power leveling on February 12, 2016 at 8:29 am

    Blade & Soul Power leveling

    You are nothing like us .

  169. Blade-Soul on February 12, 2016 at 8:30 am

    Blade-Soul

    You are nothing like us .

  170. Albion Online Silver on February 12, 2016 at 8:30 am

    Albion Online Silver

    You did it !

  171. Blade And Soul Items on February 12, 2016 at 8:30 am

    Blade And Soul Items

    The youre very eloquent .

  172. BNS Gold on February 12, 2016 at 8:30 am

    BNS Gold

    Hold it!

  173. Buy Blade And Soul Gold on February 12, 2016 at 8:31 am

    Buy Blade And Soul Gold

    I have no idea what you have said

  174. buy Albion Online Gold on February 12, 2016 at 8:31 am

    buy Albion Online Gold

    be cool!

  175. Buy Albion Online Gold on February 12, 2016 at 8:31 am

    Buy Albion Online Gold

    Come on, Stop!

  176. buy Albion Online Gold on February 12, 2016 at 8:31 am

    buy Albion Online Gold

    I don’t have the slightest idea

  177. Albion Online Power Leveling on February 12, 2016 at 8:32 am

    Albion Online Power Leveling

    hello!this is extremely nice website!

  178. Albion Online Power Leveling on February 12, 2016 at 8:32 am

    Albion Online Power Leveling

    Take my word for it.

  179. Blade And Soul Gold on February 12, 2016 at 8:32 am

    Blade And Soul Gold

    Call it even.

  180. Buy BNS Gold on February 12, 2016 at 8:32 am

    Buy BNS Gold

    Your company is very impressive .

  181. Albion Online Silver on February 12, 2016 at 8:33 am

    Albion Online Silver

    look great today.

  182. Albion Online Silver on February 12, 2016 at 8:33 am

    Albion Online Silver

    I have no idea what you have said

  183. Buy Blade And Soul Gold on February 12, 2016 at 8:33 am

    Buy Blade And Soul Gold

    I do not have the slightest idea

  184. Blade & Soul Gold on February 12, 2016 at 8:33 am

    Blade & Soul Gold

    Thank you for your helping hand.

  185. Albion Online Silver on February 12, 2016 at 8:34 am

    Albion Online Silver

    I do not have the slightest idea

  186. Cheap Albion Online Gold on February 12, 2016 at 8:34 am

    Cheap Albion Online Gold

    I will be there for you.

  187. Albion Online Power Leveling on February 14, 2016 at 4:28 am

    Albion Online Power Leveling

    What is with that guy?

  188. Blade And Soul Gold on February 14, 2016 at 4:28 am

    Blade And Soul Gold

    Proud of you .

  189. Blade-Soul.com on February 14, 2016 at 4:28 am

    Blade-Soul.com

    I let myself become a fool .

  190. Blade And Soul Items on February 14, 2016 at 4:29 am

    Blade And Soul Items

    To hell with that bitch!

  191. Cheap MapleStory Mesos on February 14, 2016 at 4:29 am

    Cheap MapleStory Mesos

    I do not know what you are saying

  192. Buy Blade And Soul Gold on February 14, 2016 at 4:29 am

    Buy Blade And Soul Gold

    Even call it.

  193. Buy Blade And Soul Gold on February 14, 2016 at 4:29 am

    Buy Blade And Soul Gold

    I thought I should give it a shot!

  194. Blade And Soul Gold on February 14, 2016 at 4:30 am

    Blade And Soul Gold

    How come you are working here?

  195. Buy Blade And Soul Gold on February 14, 2016 at 4:30 am

    Buy Blade And Soul Gold

    I’ll take care of it.

  196. Albion Online Silver on February 14, 2016 at 4:30 am

    Albion Online Silver

    No one can do it better than you.

  197. Cheap Albion Online Gold on February 14, 2016 at 4:30 am

    Cheap Albion Online Gold

    I was be there for you.

  198. Buy Blade And Soul Gold on February 14, 2016 at 4:31 am

    Buy Blade And Soul Gold

    Why don’t we give this a try?

  199. MS Mesos on February 14, 2016 at 4:31 am

    MS Mesos

    youre really talented.

  200. Albion Online Power Leveling on February 14, 2016 at 4:31 am

    Albion Online Power Leveling

    i can discover numerous great answers basically have any difficulty!

  201. Albion Online Power Leveling on February 14, 2016 at 4:31 am

    Albion Online Power Leveling

    The youre very professional .

  202. Buy Blade And Soul Gold on February 14, 2016 at 4:32 am

    Buy Blade And Soul Gold

    You did a good job .

  203. Cheap Albion Online Gold on February 14, 2016 at 4:32 am

    Cheap Albion Online Gold

    That’s not the point.

  204. Blade And Soul Gold on February 14, 2016 at 4:32 am

    Blade And Soul Gold

    I respect your work.

  205. Cheap Albion Online Gold on February 14, 2016 at 4:32 am

    Cheap Albion Online Gold

    You always love it.

  206. Cheap BNS Gold on February 14, 2016 at 4:33 am

    Cheap BNS Gold

    You always love it.

  207. Cheap Albion Online Gold on February 14, 2016 at 4:33 am

    Cheap Albion Online Gold

    You always know the right thing to say.

  208. Blade & Soul Gold on February 14, 2016 at 4:33 am

    Blade & Soul Gold

    Now you tell me that she was not a knockout !

  209. Albion Online Power Leveling on February 14, 2016 at 4:33 am

    Albion Online Power Leveling

    You always know the right thing to say.

  210. Buy Albion Online Gold on February 14, 2016 at 4:34 am

    Buy Albion Online Gold

    nice going!

  211. Blade & Soul Power leveling on February 14, 2016 at 4:34 am

    Blade & Soul Power leveling

    You have a good taste.

  212. Cheap Blade And Soul Gold on February 14, 2016 at 4:34 am

    Cheap Blade And Soul Gold

    That makes two of us.

  213. Blade & Soul Gold on February 14, 2016 at 4:34 am

    Blade & Soul Gold

    this site can help me to locate good quality suggestions!

  214. Cheap Albion Online Gold on February 14, 2016 at 4:35 am

    Cheap Albion Online Gold

    How do you work here ?

  215. MapleStory Mesos on February 14, 2016 at 4:35 am

    MapleStory Mesos

    I don’t know

  216. Blade & Soul Power leveling on February 14, 2016 at 4:35 am

    Blade & Soul Power leveling

    this website can help me to locate good quality suggestions!

  217. Buy Blade And Soul Gold on February 14, 2016 at 4:35 am

    Buy Blade And Soul Gold

    What is with that guy?

  218. Cheap BNS Gold on February 14, 2016 at 4:36 am

    Cheap BNS Gold

    Call it even.

  219. Albion Online Silver on February 14, 2016 at 4:36 am

    Albion Online Silver

    You’re very eloquent.

  220. Blade & Soul Items on February 14, 2016 at 4:36 am

    Blade & Soul Items

    You did it !

  221. cheapest and fastest nba mt xbox one store on June 5, 2016 at 11:19 am

    cheapest and fastest nba mt xbox one store

    If I have the guts to quit my job .

  222. u4fifa on June 8, 2016 at 1:11 am

    u4fifa

    Now you tell me she’s not a knock-out!

  223. UPAlbion.com on June 30, 2016 at 10:18 pm

    UPAlbion.com

    You always love it.

  224. fifa 17 coins on July 3, 2016 at 11:31 am

    fifa 17 coins

    I let myself become a fool .

  225. Cheap Albion Gold on July 14, 2016 at 12:04 am

    Cheap Albion Gold

    How come you are working here?

  226. albion online gold on July 16, 2016 at 8:30 pm

    albion online gold

    I was be there for you.

  227. fifa 17 ps4 coins on July 19, 2016 at 2:14 am

    fifa 17 ps4 coins

    What is that guy?

  228. FIFA17 XBOX ONE 1800k coins on August 24, 2016 at 2:49 am

    FIFA17 XBOX ONE 1800k coins

    I mean it!

  229. buy fifa 17 coins on September 9, 2016 at 5:52 pm

    buy fifa 17 coins

    I’ll take care of it.

  230. buy fifa coins on September 12, 2016 at 4:24 pm

    buy fifa coins

    I do not have a clue !

  231. nba mt xbox one sale on October 7, 2016 at 1:13 am

    nba mt xbox one sale

    Too bad we have to return them .

  232. nba 2k17 mt on November 14, 2016 at 3:39 am

    nba 2k17 mt

    i can find many great solutions basically have difficulty!

  233. buy Final Fantasy XIV Gil on June 3, 2017 at 2:15 am

    buy Final Fantasy XIV Gil

    I was be there for you.

The comments are closed.