Machine Learning on Text/Language


In [1]:
import os 
import nltk
import math
import time 
import gensim 
import pickle 
import random 
import unicodedata
import numpy as np

from itertools import groupby
from operator import itemgetter

from nltk.corpus import wordnet as wn
from nltk.corpus.reader.api import CorpusReader
from nltk.corpus.reader.api import CategorizedCorpusReader
from nltk.cluster import KMeansClusterer, euclidean_distance

In [2]:
# Module Variables
ROOT   = os.getcwd() 
CORPUS = os.path.join(ROOT, "fixtures", "tagged")

Simple Corpus Reader


In [3]:
PKL_PATTERN = r'(?!\.)[a-z_\s]+/[a-f0-9]+\.pickle'
CAT_PATTERN = r'([a-z_\s]+)/.*'

class BaleenCorpusReader(CategorizedCorpusReader, CorpusReader):
    """
    Quick reader for the preprocessed tokenized and tagged version of the corpus. 
    """

    def __init__(self, root, fileids=PKL_PATTERN, categoryids=CAT_PATTERN):
        """
        Initialize the corpus reader.  Categorization arguments
        (``cat_pattern``, ``cat_map``, and ``cat_file``) are passed to
        the ``CategorizedCorpusReader`` constructor.  The remaining arguments
        are passed to the ``CorpusReader`` constructor.
        """
        CategorizedCorpusReader.__init__(self, {"cat_pattern": categoryids})
        CorpusReader.__init__(self, root, fileids)
    
    def _resolve(self, fileids, categories):
        """
        Returns a list of fileids or categories depending on what is passed
        to each internal corpus reader function. This primarily bubbles up to
        the high level ``docs`` method, but is implemented here similar to
        the nltk ``CategorizedPlaintextCorpusReader``.
        """
        if fileids is not None and categories is not None:
            raise ValueError("Specify fileids or categories, not both")

        if categories is not None:
            return self.fileids(categories)
        return fileids

    def docs(self, fileids=None, categories=None):
        """
        Returns the document loaded from a pickled object for every file in
        the corpus. Similar to the BaleenCorpusReader, this uses a generator
        to acheive memory safe iteration.
        """
        # Resolve the fileids and the categories
        fileids = self._resolve(fileids, categories)

        # Create a generator, loading one document into memory at a time.
        for path, enc, fileid in self.abspaths(fileids, True, True):
            with open(path, 'rb') as f:
                yield pickle.load(f)

    def paras(self, fileids=None, categories=None):
        """
        Returns a generator of paragraphs where each paragraph is a list of
        sentences, which is in turn a list of (token, tag) tuples.
        """
        for doc in self.docs(fileids, categories):
            for paragraph in doc:
                yield paragraph

    def sents(self, fileids=None, categories=None):
        """
        Returns a generator of sentences where each sentence is a list of
        (token, tag) tuples.
        """
        for paragraph in self.paras(fileids, categories):
            for sentence in paragraph:
                yield sentence

    def words(self, fileids=None, categories=None):
        """
        Returns a generator of (token, tag) tuples.
        """
        for sentence in self.sents(fileids, categories):
            for token in sentence:
                yield token

In [4]:
corpus = BaleenCorpusReader(CORPUS)

In [5]:
# Optional to run
# Print statistics about each category. 
words = nltk.ConditionalFreqDist([
        (category, word) 
        for category in corpus.categories()
        for word in corpus.words(categories=category)
    ])

for category, dist in words.items():
    wc = sum(dist.values())
    vb = len(dist) 
    print("{} has {:>,} vocab and {:>,} words".format(category, vb, wc))


data_science has 23,614 vocab and 261,494 words
cooking has 22,787 vocab and 258,994 words
gaming has 37,759 vocab and 579,124 words
books has 44,302 vocab and 517,482 words
news has 162,010 vocab and 8,441,547 words
cinema has 45,956 vocab and 688,302 words
tech has 52,305 vocab and 870,464 words
design has 21,972 vocab and 178,851 words
do_it_yourself has 29,077 vocab and 322,049 words
politics has 44,782 vocab and 1,031,593 words
business has 84,434 vocab and 2,258,435 words
sports has 32,468 vocab and 579,188 words

Classifiers

Build Datasets


In [6]:
def labeled_documents(corpus, categories=None):
    """
    Returns a list of (document, label) tuples where a document is a 
    list of (token, tag) pairs and label is the supervised classes.  
    """
    # Get the total list of categories
    categories = categories or corpus.categories() 
        
    # Build a list of the documents with their associated words
    # Note this loads the entire corpus into memory!
    return [
        (
            list(corpus.words(fileids=fileid)), 
            corpus.categories(fileids=fileid)[0]   
        )
        for fileid in corpus.fileids(categories=categories)
    ]
    

def train_test_split(docs, categories=None, test=0.2):
    """
    Build a training and testing set of documents with their associated 
    labels by shuffling the documents, then returning test% and 1-test%
    of the data set (e.g. the test and train sets). 
    """
    
    # Shuffle the document in place 
    random.shuffle(docs) 
    
    # Find the split index 
    split = math.floor(len(docs)*test)
    
    # Return the train/test based on the split 
    return docs[split:], docs[:split]

In [6]:
# train, test = train_test_split(labeled_documents(corpus))

Feature Extraction


In [7]:
STOPWORDS   = set(nltk.corpus.stopwords.words('english'))
lemmatizer  = nltk.WordNetLemmatizer() 

def is_punct(token):
    # Is every character punctuation? 
    return all(unicodedata.category(char).startswith('P') for char in token)


def wnpos(tag):
    # Return the WordNet POS tag from the Penn Treebank tag 
    return {
        'N': wn.NOUN,
        'V': wn.VERB,
        'R': wn.ADV,
        'J': wn.ADJ
    }.get(tag[0], wn.NOUN)


def normalize(document, stopwords=STOPWORDS):
    """
    Removes stopwords and punctuation, lowercases, lemmatizes 
    """
    
    for token, tag in document:
        token = token.lower().strip() 
        
        if is_punct(token) or (token in stopwords):
            continue 
        
        yield lemmatizer.lemmatize(token, wnpos(tag))
       
    
def extract_bow_features(documents):
    """
    Perform bag of words feature extraction 
    """
    for doc, label in documents:
        yield {
            "contains(\"{}\")".format(token): True 
            for token in normalize(doc)
        }, label
    
        
        
def extract_tfidf_features(documents):
    """
    Perform TF-IDF feature extraction for a list of (document, label) pairs. 
    """
    # Separate the labels from the documents 
    labels    = [label for _, label in documents]
    documents = [list(normalize(document)) for document, _ in documents]
    
    # Create the word index mapping 
    lexicon   = gensim.corpora.Dictionary(documents)

    # Vectorize each document and create the TF-IDF model 
    documents = [lexicon.doc2bow(doc) for doc in documents]
    tfidf     = gensim.models.TfidfModel(documents, normalize=True)
    
    # Note that you can save both the tfidf model and the lexicon to disk
    # in order to load them later to featurize new documents. E.g. 
    # lexicon.save_as_text(os.path.join(ROOT, "fixtures", "baleen.lexicon")
    # tfidf.save(os.path.join(ROOT, "fixtures", "baleen.tfidf_model")

    for idx, vector in enumerate(documents):
        # Compute the TF-IDF scores for the document as a map 
        dvec = dict(tfidf[vector])
        
        # Create the feature dictionary to use in an NLTK classifier
        yield ({
            "tfidf(\"{}\")".format(token):  dvec.get(tid, 0.0)
            for tid, token in lexicon.items()
        }, labels[idx])

In [8]:
# Featurize the corpus and create train test sets. 
start = time.time()
documents = extract_bow_features(labeled_documents(corpus, categories=['design', 'books']))
train, test = train_test_split(list(documents))
 
print("Feature extraction took {:0.3f} seconds".format(time.time() - start))


Feature extraction took 8.471 seconds

Naive Bayes


In [9]:
# Train the Naive Bayes Classifier 
# The classifier expects a list of (feature, label) pairs 
# where the features are a dictionary of text features. 
start = time.time()
classifier  = nltk.NaiveBayesClassifier.train(train)

print("Training Naive Bayes took {:0.3f} seconds".format(time.time()-start))

# Write the Naive Bayes Classifier to disk to use later 
with open(os.path.join(ROOT, 'fixtures', 'nbayes-{}.pickle'.format(start)), 'wb') as f:
    pickle.dump(classifier, f)

# Show the accuracy of the classifier on the test set 
accuracy = nltk.classify.accuracy(classifier, test)
print("Naive Bayes accuracy: {}".format(accuracy))

# Show the 30 most informative features 
classifier.show_most_informative_features(30)


Training Naive Bayes took 1.106 seconds
Naive Bayes accuracy: 0.8326359832635983
Most Informative Features
         contains("diy") = True           design : books  =     41.9 : 1.0
    contains("literary") = True            books : design =     34.8 : 1.0
      contains("review") = True            books : design =     31.7 : 1.0
       contains("novel") = True            books : design =     29.9 : 1.0
    contains("struggle") = True            books : design =     26.0 : 1.0
        contains("ikea") = True           design : books  =     24.6 : 1.0
      contains("author") = True            books : design =     21.9 : 1.0
  contains("accumulate") = True           design : books  =     21.7 : 1.0
 contains("residential") = True           design : books  =     21.7 : 1.0
        contains("fail") = True            books : design =     19.6 : 1.0
      contains("poetry") = True            books : design =     19.6 : 1.0
        contains("plot") = True            books : design =     19.6 : 1.0
       contains("essay") = True            books : design =     19.6 : 1.0
      contains("writer") = True            books : design =     18.8 : 1.0
   contains("political") = True            books : design =     18.7 : 1.0
         contains("sex") = True            books : design =     18.7 : 1.0
       contains("comic") = True            books : design =     18.2 : 1.0
   contains("publisher") = True            books : design =     17.8 : 1.0
     contains("fantasy") = True            books : design =     16.8 : 1.0
     contains("reading") = True            books : design =     16.7 : 1.0
    contains("eclectic") = True           design : books  =     15.9 : 1.0
    contains("colossal") = True           design : books  =     15.9 : 1.0
           contains("|") = True            books : design =     15.6 : 1.0
        contains("hero") = True            books : design =     15.0 : 1.0
     contains("teacher") = True            books : design =     15.0 : 1.0
        contains("dead") = True            books : design =     14.8 : 1.0
     contains("context") = True            books : design =     14.5 : 1.0
        contains("loss") = True            books : design =     14.5 : 1.0
  contains("literature") = True            books : design =     14.2 : 1.0
  contains("furnishing") = True           design : books  =     14.0 : 1.0

Maximum Entropy


In [10]:
# Train the Maximum Entropy Classifier 
start = time.time()
classifier = nltk.MaxentClassifier.train(train,
    algorithm='megam', trace=2, gaussian_prior_sigma=1)

print("Training Maximum Entropy took {:0.3f} seconds".format(time.time()-start))

# Write the Naive Bayes Classifier to disk to use later 
with open(os.path.join(ROOT, 'fixtures', 'maxent-{}.pickle'.format(start)), 'wb') as f:
    pickle.dump(classifier, f)

# Show the accuracy of the classifier on the test set 
accuracy = nltk.classify.accuracy(classifier, test)
print("Maximum Entropy accuracy: {}".format(accuracy))

# Show the 30 most informative features 
classifier.show_most_informative_features(30)


[Found megam: /Users/benjamin/bin/megam]
[Found megam: /Users/benjamin/bin/megam]
Exception ignored in: <generator object find_file_iter at 0x10c4c3518>
RuntimeError: generator ignored GeneratorExit
Training Maximum Entropy took 11.800 seconds
Maximum Entropy accuracy: 0.9456066945606695
  -1.311 contains("book")==True and label is 'design'
   1.311 contains("book")==True and label is 'books'
   1.028 contains("design")==True and label is 'design'
  -1.028 contains("design")==True and label is 'books'
  -1.014 contains("designer")==True and label is 'books'
   1.014 contains("designer")==True and label is 'design'
  -0.934 label is 'design'
   0.934 label is 'books'
  -0.739 contains("like")==True and label is 'books'
   0.739 contains("like")==True and label is 'design'
   0.712 contains("home")==True and label is 'design'
  -0.712 contains("home")==True and label is 'books'
   0.652 contains("series")==True and label is 'design'
  -0.652 contains("series")==True and label is 'books'
   0.648 contains("favorite")==True and label is 'design'
  -0.648 contains("favorite")==True and label is 'books'
   0.647 contains("related")==True and label is 'books'
  -0.647 contains("related")==True and label is 'design'
   0.637 contains("entry")==True and label is 'design'
  -0.637 contains("entry")==True and label is 'books'
   0.633 contains("author")==True and label is 'books'
  -0.633 contains("author")==True and label is 'design'
   0.611 contains("last")==True and label is 'design'
  -0.611 contains("last")==True and label is 'books'
   0.521 contains("colossal")==True and label is 'design'
  -0.521 contains("colossal")==True and label is 'books'
   0.514 contains("read")==True and label is 'books'
  -0.514 contains("read")==True and label is 'design'
   0.470 contains("list")==True and label is 'books'
  -0.470 contains("list")==True and label is 'design'

Clustering

KMeans Clustering


In [11]:
class KMeansTopics(object):
    
    def __init__(self, corpus, k=10):
        """
        Expects a corpus object, no need to use labeled_documents
        """
        self.k = k 
        self.vocab = list(set(normalize(corpus.words(categories=['design', 'books']))))
        self.model = None  

    def vectorize(self, document):
        """
        Vectorizes a document consisting of a list of part of speech
        tagged tokens using the segmentation and tokenization methods.
        
        One hot encode the set of documents for K-Means clustering 
        """
        features = set(normalize(document))
        return np.array([token in features for token in self.vocab], np.short)

    def cluster(self, corpus):
        """
        Fits the K-Means model to the given data. 
        """
        start = time.time()
        self.model = KMeansClusterer(self.k, euclidean_distance, avoid_empty_clusters=True)
        self.model.cluster([
            self.vectorize(corpus.words(fileid)) for fileid in corpus.fileids(categories=['design', 'books'])
        ])
    
    def classify(self, document):
        """
        Pass through to the internal model classify 
        """
        return self.model.classify(self.vectorize(document))

In [12]:
start = time.time()
clusterer = KMeansTopics(corpus)
clusterer.cluster(corpus)

print("Took {:0.3f} seconds to construct clusters".format(time.time() - start))


Took 37.341 seconds to construct clusters

In [13]:
# Classify documents in corpus by cluster affinity 
groups  = [
    (clusterer.classify(corpus.words(fileid)), fileid)
    for fileid in corpus.fileids(categories=['design', 'books'])
]

# Group documents in corpus by cluster and display them
groups.sort(key=itemgetter(0)) 
for group, items in groupby(groups, key=itemgetter(0)):
    for item in items:
        print("{}: {}".format(*item))


0: books/56d629e7c1808113ffb87eaf.pickle
0: books/56d629e7c1808113ffb87eb3.pickle
0: books/56d629ebc1808113ffb87ed0.pickle
0: books/56d629f0c1808113ffb87ef0.pickle
0: books/56d62a0bc1808113ffb87ef6.pickle
0: books/56d62a50c1808113ffb87f19.pickle
0: books/56d62a51c1808113ffb87f1c.pickle
0: books/56d62a53c1808113ffb87f1f.pickle
0: books/56d62a55c1808113ffb87f24.pickle
0: books/56d62a56c1808113ffb87f28.pickle
0: books/56d62a59c1808113ffb87f32.pickle
0: books/56d62a5ac1808113ffb87f3a.pickle
0: books/56d62a5bc1808113ffb87f4a.pickle
0: books/56d62a5dc1808113ffb87f52.pickle
0: books/56d62a60c1808113ffb87f59.pickle
0: books/56d62a67c1808113ffb87f6a.pickle
0: books/56d62a70c1808113ffb87f8a.pickle
0: books/56d62a73c1808113ffb87f9a.pickle
0: books/56d62a73c1808113ffb87f9e.pickle
0: books/56d70ef3c180810560aec2b5.pickle
0: books/56d70ef6c180810560aec2d1.pickle
0: books/56d86f51c18081104b39ada6.pickle
0: books/56d86f51c18081104b39adaa.pickle
0: books/56d86f52c18081104b39adb2.pickle
0: books/56d86fcec18081104b39aeb2.pickle
0: books/56d8835cc18081104b39c53e.pickle
0: books/56d8835dc18081104b39c55a.pickle
0: books/56d8835dc18081104b39c55b.pickle
0: books/56d883ecc18081104b39c6b0.pickle
0: books/56d8962bc18081120d8227ed.pickle
0: books/56d8b3ccc1808111c9847981.pickle
0: books/56d939bbc1808111c985105f.pickle
0: books/56d97be6c1808111c98555f2.pickle
0: books/56d98c71c1808111c985691e.pickle
0: books/56d9ada8c1808111c9859520.pickle
0: books/56d9effdc1808111c985ee34.pickle
0: books/56da008bc1808111c986049a.pickle
0: books/56da21e3c1808111c9862f05.pickle
0: books/56da742ec1808111c9868c19.pickle
0: books/56db1890c1808111c987367a.pickle
0: books/56db398bc1808111c9875ad4.pickle
0: books/56db4a07c1808111c9876cd8.pickle
0: books/56db8bdbc1808111c987b4d9.pickle
0: books/56dc201ac1808111c9884667.pickle
0: books/56dd9b8ac1808111c989e124.pickle
0: books/56dd9b8fc1808111c989e137.pickle
0: books/56dd9b90c1808111c989e171.pickle
0: books/56ddbcf6c1808111c98a0f81.pickle
0: books/56ddce05c1808111c98a2799.pickle
0: books/56dddebbc1808111c98a3d85.pickle
0: books/56ddef51c1808111c98a5413.pickle
0: books/56deb51dc1808111c98b2eb5.pickle
0: books/56dec58ac1808111c98b4126.pickle
0: books/56ded5f3c1808111c98b541b.pickle
0: books/56df07c6c1808111c98b9232.pickle
0: books/56df07c8c1808111c98b9246.pickle
0: books/56df186ec1808111c98ba895.pickle
0: books/56df1873c1808111c98ba90a.pickle
0: books/56df39b6c1808111c98bd550.pickle
0: books/56df39b8c1808111c98bd5e8.pickle
0: books/56df5ab4c1808111c98bffc2.pickle
0: books/56df6b42c1808111c98c153e.pickle
0: books/56e00ef5c1808111c98cc6a0.pickle
0: books/56e00ef6c1808111c98cc6e7.pickle
0: books/56e050f2c1808111c98d1888.pickle
0: books/56e061b8c1808111c98d2d1b.pickle
0: books/56e082d3c1808111c98d581c.pickle
0: books/56e0b484c1808111c98d9a9b.pickle
0: books/56e15891c1808111c98e49bd.pickle
0: books/56e16902c1808111c98e5ca2.pickle
0: books/56e1fe20c1808111c98f1dc9.pickle
0: books/56e2f4dbc1808111c9903c3e.pickle
0: books/56e3057bc1808111c99053d5.pickle
0: books/56e31638c1808111c9906979.pickle
0: books/56e326c4c1808111c990801b.pickle
0: books/56e3481ac1808111c990ab50.pickle
0: books/56e461b8c1808111c991d1a4.pickle
0: books/56e54807c1808111c992bd14.pickle
0: books/56e58a02c1808111c992ffd7.pickle
0: books/56e5cbf0c1808111c9934566.pickle
0: books/56e5ecdac1808111c993677a.pickle
0: books/56e6d2f5c1808111c9945fb5.pickle
0: books/56e6e39cc1808111c9947597.pickle
0: books/56e6f450c1808111c9948bde.pickle
0: books/56e704e7c1808111c994a284.pickle
0: books/56e7159fc1808111c994b860.pickle
0: books/56e715a7c1808111c994b89a.pickle
0: books/56e83770c18081055380ff52.pickle
0: books/56e83770c18081055380ff57.pickle
0: books/56e83771c18081055380ff8a.pickle
0: books/56e83777c18081055380fff3.pickle
0: books/56e8377ac1808105538100a0.pickle
0: books/56e8465bc1808103936f746c.pickle
0: books/56e84665c1808103936f747f.pickle
0: books/56e8466dc1808103936f748d.pickle
0: books/56e8467bc1808103936f7495.pickle
0: books/56e8467ec1808103936f7498.pickle
0: books/56e84688c1808103936f749f.pickle
0: books/56e84689c1808103936f74a0.pickle
0: books/56e84691c1808103936f74ab.pickle
0: books/56e846afc1808103936f74d2.pickle
0: books/56e846b3c1808103936f74dc.pickle
0: books/56e846b5c1808103936f74e4.pickle
0: books/56e846b8c1808103936f74ec.pickle
0: books/56e846c4c1808103936f7502.pickle
0: books/56e846c6c1808103936f7504.pickle
0: books/56e846dcc1808103936f7523.pickle
0: books/56e846dcc1808103936f7526.pickle
0: books/56e846e9c1808103936f7549.pickle
0: books/56e846ecc1808103936f754f.pickle
0: books/56e84718c1808103936f757e.pickle
0: books/56e8471fc1808103936f7585.pickle
0: books/56e8472dc1808103936f7594.pickle
0: books/56e84786c1808103936f75b6.pickle
0: books/56e8478cc1808103936f75bf.pickle
0: books/56e84796c1808103936f75d5.pickle
0: books/56e84799c1808103936f75e2.pickle
0: books/56e8479cc1808103936f75e6.pickle
0: books/56e847b6c1808103936f7613.pickle
0: books/56e847bec1808103936f761c.pickle
0: books/56e847d2c1808103936f762d.pickle
0: books/56e847d8c1808103936f7639.pickle
0: books/56e847e2c1808103936f7652.pickle
0: books/56e847e5c1808103936f765f.pickle
0: books/56e847e8c1808103936f7666.pickle
0: books/56e84813c1808103936f7686.pickle
0: books/56e8481ac1808103936f768b.pickle
0: books/56e84833c1808103936f769f.pickle
0: books/56e84834c1808103936f76a0.pickle
0: books/56e84894c1808103936f76c3.pickle
0: books/56e848b9c1808103936f7719.pickle
0: books/56e848bfc1808103936f7725.pickle
0: books/56e963e9c1808111e05f5b51.pickle
0: books/56e963e9c1808111e05f5b59.pickle
0: books/56e963f1c1808111e05f5c3d.pickle
0: books/56eaa8f1c1808111e05f6aa7.pickle
0: books/56eaa917c1808111e05f6baf.pickle
0: books/56eabafcc1808111e05f7c28.pickle
0: books/56eabafcc1808111e05f7c29.pickle
0: books/56eabafdc1808111e05f7c2d.pickle
0: books/56eabafec1808111e05f7c2e.pickle
0: books/56eabb04c1808111e05f7ca4.pickle
0: books/56eabb0bc1808111e05f7d3d.pickle
0: books/56eabb0bc1808111e05f7d3e.pickle
0: books/56eabb0fc1808111e05f7d5a.pickle
0: books/56eacd8bc180814572d27f6a.pickle
0: books/56eade69c180814572d29369.pickle
0: books/56eaf003c180814572d2afee.pickle
0: books/56eb012cc180814572d2ccd7.pickle
0: books/56eb1227c180814572d2e75e.pickle
0: books/56eb236ec180814572d30e0c.pickle
0: books/56eb236ec180814572d30e0d.pickle
0: books/56ec0042c180814c03c86302.pickle
0: books/56ec330fc180814c03c8afeb.pickle
0: books/56ec4421c180814c03c8cef9.pickle
0: books/56ec54e4c180814c03c8ebe9.pickle
0: books/56ec54e8c180814c03c8ecba.pickle
0: books/56ec65d7c180814c03c907dd.pickle
0: books/56ec65d7c180814c03c907fa.pickle
0: books/56ec76c3c180814c03c92269.pickle
0: books/56ecbc59c180814c03c9957a.pickle
0: books/56ed5378c180814c03ca5703.pickle
0: books/56ed648fc180814c03ca7961.pickle
0: books/56eda6ccc180814c03cad8cf.pickle
0: books/56ee2c46c180814c03cb8f2f.pickle
0: books/56ee4d88c180814c03cbb9e6.pickle
0: books/56eea128c180814c03cc2814.pickle
0: books/56eec268c180814c03cc4f0d.pickle
0: books/56ef056ec180814c03ccb19a.pickle
0: books/56ef1699c180814c03ccd4e5.pickle
0: books/56ef5a80c180814c03cd3500.pickle
0: books/56ef7bd4c180814c03cd646e.pickle
0: books/56f016f4c1808103e167a7ec.pickle
0: books/56f038f3c1808103e167e276.pickle
0: books/56f0397dc1808103e167ecb6.pickle
0: books/56f04a0ec1808103e167fd68.pickle
0: books/56f53885c18081352e65436f.pickle
0: books/56f53887c18081352e65437f.pickle
0: books/56f538a7c18081352e654404.pickle
0: books/56f538adc18081352e65448d.pickle
0: books/56f53ca1c18081352e655140.pickle
0: books/56f53cabc18081352e655157.pickle
0: books/56f53cbec18081352e655304.pickle
0: books/56f53cc5c18081352e655317.pickle
0: books/56f53cefc18081352e6553b6.pickle
0: books/56f53cf3c18081352e6553b8.pickle
0: books/56f53cffc18081352e655427.pickle
0: books/56f53d0dc18081352e65545f.pickle
0: books/56f53d16c18081352e65547b.pickle
0: books/56f53d1cc18081352e65547f.pickle
0: books/56f53d29c18081352e655499.pickle
0: books/56f53d2bc18081352e6554a6.pickle
0: books/56f53d2cc18081352e6554a9.pickle
0: books/56f53d3ac18081352e6554b5.pickle
0: books/56f53d3bc18081352e6554b6.pickle
0: books/56f53d56c18081352e65554f.pickle
0: books/56f57166c18081352e659ea0.pickle
0: books/56f57245c18081352e65aab5.pickle
0: books/56f59445c18081352e65d733.pickle
0: books/56f5a5bbc18081352e65f3f1.pickle
0: books/56f5b70cc18081352e660e59.pickle
0: books/56f5b712c18081352e660e6b.pickle
0: books/56f7d312c1808147f07fee2c.pickle
0: books/56f7d466c1808147f07ffb36.pickle
0: books/56f7f6d9c1808147f08038aa.pickle
0: books/56f8082cc1808147f0805857.pickle
0: books/56f8198ac1808147f0807742.pickle
0: books/56f85de6c1808147f080e9ed.pickle
0: books/56f92d78c1808147f0825ded.pickle
0: books/56f93e19c1808147f082754d.pickle
0: books/56f9500fc1808147f0829917.pickle
0: books/56f95017c1808147f08299ec.pickle
0: books/56f950edc1808147f082a49e.pickle
0: books/56f962c0c1808147f082c903.pickle
0: books/56f962c3c1808147f082c922.pickle
0: books/56f973c8c1808147f082e187.pickle
0: books/56f973cfc1808147f082e1c1.pickle
0: books/56f985a4c1808147f08305a2.pickle
0: books/56f9bdf1c1808147f0837143.pickle
0: books/56fc3a69c18081767c938aad.pickle
0: books/56fc3a69c18081767c938abd.pickle
0: books/56fc3a69c18081767c938ac0.pickle
0: books/56fc3a84c18081767c938b32.pickle
0: books/56fc3a84c18081767c938b33.pickle
0: books/56fc3a85c18081767c938b37.pickle
0: books/56fc3a89c18081767c938bc4.pickle
0: books/56fc3a89c18081767c938bc5.pickle
0: books/56fd9bdcc1808103d32d4e32.pickle
0: books/56fd9bddc1808103d32d4e69.pickle
0: books/56fd9be7c1808103d32d4ecf.pickle
0: books/56fd9be9c1808103d32d4f65.pickle
0: books/56fd9beac1808103d32d4f68.pickle
0: books/56fd9becc1808103d32d4f6c.pickle
0: books/56fd9d2ec1808103d32d5a1a.pickle
0: books/56fd9d2fc1808103d32d5a1c.pickle
0: books/56fd9d34c1808103d32d5a23.pickle
0: books/56fd9d3ac1808103d32d5a68.pickle
0: books/56fd9d42c1808103d32d5b25.pickle
0: books/56fd9d49c1808103d32d5b88.pickle
0: books/56fd9d4dc1808103d32d5bdd.pickle
0: books/56fd9d5ac1808103d32d5c4b.pickle
0: books/56fd9d77c1808103d32d5cff.pickle
0: books/56fd9d89c1808103d32d5d23.pickle
0: books/56fd9d9ec1808103d32d5d42.pickle
0: books/56fdaf4cc1808103d32d7fa0.pickle
0: books/56fe9260c1808103d32f19cc.pickle
0: books/56fea327c1808103d32f318c.pickle
0: books/56fea327c1808103d32f31bd.pickle
0: books/56fec7a5c1808103d32f8469.pickle
0: books/56fec7abc1808103d32f850a.pickle
0: books/56fefcf3c1808103d32febbc.pickle
0: books/56ff5367c1808103d3308491.pickle
0: books/5700475fc1808103d3322da9.pickle
0: books/57007c41c1808103d3328753.pickle
0: books/57012868c1808103d3339f06.pickle
0: books/57015d51c1808103d33407c5.pickle
0: books/57017f5cc1808103d334455f.pickle
0: books/57025f57c1808103d335c4f3.pickle
0: books/5702719cc1808103d335f273.pickle
0: books/570282bec1808103d336156f.pickle
0: books/5702a51bc1808103d3365364.pickle
0: books/5702a525c1808103d3365462.pickle
0: books/5702a5fac1808103d3365f4d.pickle
0: books/5702b6bcc1808103d3367890.pickle
0: books/5702b6bfc1808103d3367965.pickle
0: books/5702b78dc1808103d33682c6.pickle
0: books/5702b78fc1808103d33682f5.pickle
0: books/5702d9d5c1808103d336bd9c.pickle
0: books/5702d9e4c1808103d336be99.pickle
0: books/5702eb59c1808103d336e117.pickle
0: books/57041f48c18081204db7a958.pickle
0: books/57056ed6c180812e9407dfc0.pickle
0: books/57056ed8c180812e9407e009.pickle
0: books/57056ee9c180812e9407e069.pickle
0: books/57056eecc180812e9407e10f.pickle
0: books/57056eedc180812e9407e111.pickle
0: books/570577d3c180812e9407ed93.pickle
0: books/570577dbc180812e9407eda5.pickle
0: books/570577e5c180812e9407eeab.pickle
0: books/570577e7c180812e9407ef13.pickle
0: books/57057802c180812e9407f01c.pickle
0: books/57057806c180812e9407f02b.pickle
0: books/5705783ac180812e9407f08f.pickle
0: books/5705785ac180812e9407f0db.pickle
0: books/57058951c180812e940808fa.pickle
0: books/5705895ec180812e94080a24.pickle
0: books/5705e1b9c180812e9408b015.pickle
0: books/570637f8c180812e940936db.pickle
0: books/57064951c180812e940957bb.pickle
0: books/57064a12c180812e94096104.pickle
0: books/57065ab1c180812e9409782d.pickle
0: books/57065ab2c180812e940978c6.pickle
0: books/57066cb8c180812e9409a8db.pickle
0: books/5706a209c180810ca39481d8.pickle
0: books/5706a26ec180810ca3948d89.pickle
0: books/5706a274c180810ca3948e9d.pickle
0: books/5706a274c180810ca3948e9e.pickle
0: books/5706d68dc180810ca394ee4c.pickle
0: books/5706d752c180810ca394f830.pickle
0: books/57076252c180810ca395ebb0.pickle
0: books/570783a5c180810ca3961e00.pickle
0: books/57078492c180810ca3962763.pickle
0: books/5707b7dbc180810ca3967fbe.pickle
0: books/5707db17c180810ca396c61b.pickle
0: books/57080f00c180810ca3973234.pickle
0: books/57080f00c180810ca3973248.pickle
0: books/57082071c180810ca3975643.pickle
0: books/570831e2c180810ca3977973.pickle
0: books/57085653c180810ca397c759.pickle
0: books/57088d9bc180810ca3981838.pickle
0: books/5708af2fc180810ca39850b2.pickle
0: books/5708af37c180810ca398512a.pickle
0: books/5708bfa3c180810ca39864b2.pickle
0: books/5708d1b0c180810ca3988a71.pickle
0: books/5708e2cac180810ca398a708.pickle
0: books/57090554c180810ca398e504.pickle
0: books/57090557c180810ca398e509.pickle
0: books/570927fcc180810ca39923ec.pickle
0: books/57093885c180810ca39939da.pickle
0: books/57095c38c180810ca3998366.pickle
0: books/570a2a11c180810ca39adcfa.pickle
0: books/570a2a15c180810ca39add00.pickle
0: books/570a3b4cc180810ca39af83c.pickle
0: books/570a3b6ec180810ca39af91a.pickle
0: books/570a5cfec180810ca39b2730.pickle
0: books/570a910ec180810ca39b8364.pickle
0: books/570ab3acc180810ca39bc23f.pickle
0: books/570b8491c180810ca39d2e2e.pickle
0: books/570bb7bbc180810ca39d89cb.pickle
0: books/570bca3ec180810ca39db921.pickle
0: books/570c4499c180810ca39ea77e.pickle
0: books/570c78dac180810ca39f14d9.pickle
0: books/570cf0cac180810ca39fe92c.pickle
0: books/570d0259c180810ca3a00d6f.pickle
0: books/570d25f0c180810ca3a05812.pickle
0: books/570d25f3c180810ca3a058e8.pickle
0: books/570d3857c180810ca3a089bc.pickle
0: books/570d3857c180810ca3a089bd.pickle
0: books/570d3857c180810ca3a089bf.pickle
0: books/570d3857c180810ca3a089c1.pickle
0: books/570d5a62c180810ca3a0c789.pickle
0: books/570d5a62c180810ca3a0c78b.pickle
0: books/570df80cc180810ca3a1ffc6.pickle
0: books/570e3b18c1808103a2789d27.pickle
0: books/570e3c1dc1808103a278a7dd.pickle
0: books/570e672ac1808109b8319bda.pickle
0: books/570e672ac1808109b8319bdc.pickle
0: books/570e6810c1808109b831a744.pickle
0: books/570e78c3c1808109b831c19d.pickle
0: books/570eadabc1808109b83230d4.pickle
0: books/57100636c1808128a22d8e18.pickle
0: books/57100636c1808128a22d8e19.pickle
0: books/57100638c1808128a22d8e53.pickle
0: books/57100646c1808128a22d8f63.pickle
0: books/57100798c1808128a22d9a9f.pickle
0: books/57100799c1808128a22d9aa0.pickle
0: books/571007a2c1808128a22d9c4e.pickle
0: books/571007a5c1808128a22d9c5a.pickle
0: books/571007abc1808128a22d9ce4.pickle
0: books/57101854c1808128a22db596.pickle
0: books/57101854c1808128a22db5cb.pickle
0: books/57103bcec1808128a22dfe13.pickle
0: books/57105e28c1808128a22e3edb.pickle
0: books/571091fdc1808128a22e9d5f.pickle
0: books/571092c7c1808128a22ea771.pickle
0: books/5710c59fc1808128a22efd6c.pickle
0: books/5710c669c1808128a22f07c0.pickle
0: books/57110b17c1808128a22f8c65.pickle
0: books/57111cc1c1808128a22fb0f9.pickle
0: books/57111cc2c1808128a22fb0fc.pickle
0: books/57113732c1808128a22fd553.pickle
0: books/571154b1c1808128a22ff9c1.pickle
0: books/571154b3c1808128a22ff9ca.pickle
0: books/571154bbc1808128a22ffa2e.pickle
0: books/571154bdc1808128a22ffb04.pickle
0: books/571154bdc1808128a22ffb05.pickle
0: books/57116f22c1808128a2301e92.pickle
0: books/57118a4cc1808128a2304570.pickle
0: books/5711a765c1808128a230737e.pickle
0: books/57126841c1808128a231759b.pickle
0: books/57127cbcc1808128a2318c64.pickle
0: books/5712b0b5c1808128a231d7c6.pickle
0: books/5713594ac1808128a232b60d.pickle
0: books/5713b665c1808128a233289f.pickle
0: books/5713ce9bc1808128a233488b.pickle
0: books/5713ff03c1808128a23388c4.pickle
0: books/571493b3c1808128a23453bc.pickle
0: books/571493c2c1808128a2345407.pickle
0: books/5714abe5c1808128a23472cc.pickle
0: books/5714abf6c1808128a23473b1.pickle
0: books/5714c056c1808128a23489f7.pickle
0: books/5714f51ec1808128a234ddbf.pickle
0: books/5714f525c1808128a234dde8.pickle
0: books/57150dcec1808128a23502f9.pickle
0: books/571548eac1808103a0ce89f1.pickle
0: books/57154cb8c1808103a0ce9555.pickle
0: books/57154cbec1808103a0ce95d4.pickle
0: books/57154cbec1808103a0ce95d5.pickle
0: books/57154cbec1808103a0ce95d7.pickle
0: books/571578b2c1808103a0ced441.pickle
0: books/5715d5adc1808103a0cf58ae.pickle
0: books/571606e2c1808103a0cfa441.pickle
0: books/57164a42c1808103a0d005a4.pickle
0: books/57167941c1808103a0d05128.pickle
0: books/571736ccc1808103a0d175e4.pickle
0: books/57176578c1808103a0d1ba3c.pickle
0: books/57177a15c1808103a0d1d333.pickle
0: books/57177a18c1808103a0d1d335.pickle
0: books/57177ce4c1808103a0d1df3a.pickle
0: books/5717a8aac1808103a0d21e92.pickle
0: books/5717d7e5c1808103a0d26acc.pickle
0: books/5717d7e8c1808103a0d26ba0.pickle
0: books/5717d7e8c1808103a0d26ba2.pickle
0: books/5717dad2c1808103a0d276fb.pickle
0: books/57187ad6c1808103a0d364d3.pickle
0: books/5718a952c1808103a0d3ab36.pickle
0: books/5718ac2ac1808103a0d3b55b.pickle
0: books/5718ac31c1808103a0d3b56a.pickle
0: books/5718c0c2c1808103a0d3cc4e.pickle
0: books/5718c0c5c1808103a0d3ccb2.pickle
0: books/5718c382c1808103a0d3da5c.pickle
0: books/5718c393c1808103a0d3dac1.pickle
0: books/57193676c1808103a0d491f5.pickle
0: books/57195064c1808103a0d4c281.pickle
0: books/57197bc0c1808103a0d50144.pickle
0: books/5719f27cc1808103a0d5b5a0.pickle
0: books/571a1e5ac1808103a0d5ef3a.pickle
0: books/571a35ddc1808103a0d614ea.pickle
0: books/571a4d97c1808103a0d639a0.pickle
0: books/571a6555c1808103a0d65f94.pickle
0: books/571a655ac1808103a0d660c1.pickle
0: books/571a6819c1808103a0d66bb3.pickle
0: books/571a9419c1808103a0d6ad9f.pickle
0: books/571aae3dc1808103a0d6df30.pickle
0: books/571ac2bec1808103a0d6f7b4.pickle
0: books/571b64fec1808103a0d7df11.pickle
0: books/571baa8cc1808103a0d845fd.pickle
0: books/571bd905c1808103a0d88aeb.pickle
0: books/571bdbc7c1808103a0d895bb.pickle
0: books/571c6703c1808103a0d95728.pickle
0: books/571c7e23c1808103a0d97673.pickle
0: books/571c951fc1808103a0d993aa.pickle
0: books/571cf191c1808103a0da1498.pickle
0: books/571d1feac1808103a0da556d.pickle
0: books/571d6594c1808103a0dab843.pickle
0: books/571dd98cc1808103a0db627c.pickle
0: books/571ded88c1808103a0db7736.pickle
0: books/571e337dc1808103a0dbe51c.pickle
0: books/571e337ec1808103a0dbe51e.pickle
0: books/571e365cc1808103a0dbf0e3.pickle
0: books/571e4d4fc1808103a0dc1757.pickle
0: books/571e797ec1808103a0dc5766.pickle
0: books/571e7980c1808103a0dc5829.pickle
0: books/571e90dfc1808103a0dc7ce6.pickle
0: books/571eac4ac1808103a0dcafe8.pickle
0: books/571ef21cc1808103a0dd1486.pickle
0: books/571f3521c1808103a0dd6b45.pickle
0: books/571f4c64c1808103a0dd8d85.pickle
0: books/571f4c65c1808103a0dd8d9d.pickle
0: books/571f4f2ec1808103a0dd9a96.pickle
0: books/571f7b37c1808103a0ddd91c.pickle
0: books/571fc1d9c1808103a0de4b8c.pickle
0: books/571fc1dcc1808103a0de4c4d.pickle
0: books/571fd945c1808103a0de70e8.pickle
0: books/571fdc05c1808103a0de7b27.pickle
0: books/572068bec1808103a0df51e3.pickle
0: books/5720abb6c1808103a0dfb23f.pickle
0: books/5720ae7ec1808103a0dfbd67.pickle
0: books/5720ae82c1808103a0dfbdbe.pickle
0: books/5720c631c1808103a0dfe541.pickle
0: books/5720daaac1808103a0dffebd.pickle
0: books/5720f527c1808103a0e02dea.pickle
0: books/57210ccbc1808103a0e05732.pickle
0: books/5721215ac1808103a0e0712b.pickle
0: books/57219adac1808103a0e1322d.pickle
0: books/5721f53ac1808103a0e1b147.pickle
0: books/5722240cc1808103a0e1fbdd.pickle
0: books/57223c77c1808103a0e22511.pickle
0: books/57223c78c1808103a0e22536.pickle
0: books/57223f9ec1808103a0e2343a.pickle
0: books/57225475c1808103a0e24db3.pickle
0: books/57225476c1808103a0e24e14.pickle
0: books/57226bfec1808103a0e27316.pickle
0: books/57226c01c1808103a0e273c2.pickle
0: books/5722866fc1808103a0e2a63f.pickle
0: books/57231259c1808103a0e3725e.pickle
0: books/5723125ec1808103a0e37287.pickle
0: books/572329abc1808103a0e39453.pickle
0: books/57233e2cc1808103a0e3aa87.pickle
0: books/57235855c1808103a0e3dd48.pickle
0: books/57236ccdc1808103a0e3f62e.pickle
0: books/57236f9dc1808103a0e404a3.pickle
0: books/57236f9ec1808103a0e404a5.pickle
0: books/57236fc5c1808103a0e4058a.pickle
0: books/5723845ac1808103a0e41e4a.pickle
0: books/5723845ac1808103a0e41e4c.pickle
0: books/57239b5ac1808103a0e446e2.pickle
0: books/57239b5ac1808103a0e44725.pickle
0: books/57239b60c1808103a0e447db.pickle
0: books/5723ca6ac1808103a0e4925f.pickle
0: books/5723cdb0c1808103a0e4a05c.pickle
0: books/5723faecc1808103a0e4e06c.pickle
0: books/57241511c1808103a0e50c17.pickle
0: books/57249d2fc1808103a0e5c108.pickle
0: books/5724f9e6c1808103a0e6532a.pickle
0: books/5725111cc1808103a0e67824.pickle
0: books/57260ec3c1808103a0e7e513.pickle
0: books/5727400fc1808103a0e9ae74.pickle
0: books/57278313c1808103a0ea1303.pickle
0: books/57278314c1808103a0ea1315.pickle
0: books/57279aafc1808103a0ea3a3f.pickle
0: books/5727c953c1808103a0ea85bd.pickle
0: books/5728f2c6c180817cd22b801b.pickle
0: books/5728f2c6c180817cd22b805b.pickle
0: books/5728f2e6c180817cd22b80ab.pickle
0: books/5728f2ebc180817cd22b813a.pickle
0: books/5728f603c180817cd22b8cc9.pickle
0: books/5728f612c180817cd22b8e1d.pickle
0: books/57290b0fc180817cd22ba9a6.pickle
0: books/57296b3fc180817cd22c481d.pickle
0: books/5729dce8c180817cd22ce59b.pickle
0: books/5729dfbdc180817cd22cf10c.pickle
0: books/5729f472c180817cd22d0978.pickle
0: books/572a0c1fc180817cd22d323b.pickle
0: books/572a52e4c180817cd22da69a.pickle
0: books/572a6d60c180817cd22dd484.pickle
0: books/572af612c180817cd22e9e81.pickle
0: books/572b104bc180817cd22ec945.pickle
0: books/572b56a2c180817cd22f3bc7.pickle
0: books/572b6b58c180817cd22f5689.pickle
0: books/572b9ae7c180817cd22fa5d2.pickle
0: books/572b9aeac180817cd22fa630.pickle
0: books/572b9aeac180817cd22fa633.pickle
0: books/572b9dbdc180817cd22fb388.pickle
0: books/572bb281c180817cd22fce5b.pickle
0: books/572bb283c180817cd22fce95.pickle
0: books/572bb283c180817cd22fcef5.pickle
0: books/572bfb3ac180817cd2304b12.pickle
0: books/572c4103c180817cd230b434.pickle
0: books/572c58cec180817cd230d599.pickle
0: books/572c58cfc180817cd230d59a.pickle
0: books/572c85afc180817cd2310e95.pickle
0: books/572c88bec180817cd231190d.pickle
0: books/572c9dbfc180817cd23132aa.pickle
0: books/572ca146c180817cd2313e5a.pickle
0: books/572cd113c180817cd2318ee2.pickle
0: books/572ce5fbc180817cd231a902.pickle
0: books/572cfd51c180817cd231cf14.pickle
0: books/572d0034c180817cd231dc58.pickle
0: books/572d153dc180817cd231f6d0.pickle
0: books/572d2d2ac180817cd2321af4.pickle
0: books/572d606dc180817cd2326ba2.pickle
0: books/572dd394c180817cd2330550.pickle
0: books/572dd395c180817cd233056e.pickle
0: books/572deab0c180817cd23328dd.pickle
0: books/572e1c5fc180817cd2337e74.pickle
0: books/572e30d9c180817cd233964f.pickle
0: books/572e30dac180817cd2339677.pickle
0: books/572f1e38c180817cd234f83f.pickle
0: books/572f49cec180817cd2352fa9.pickle
0: books/572f4c8cc180817cd2353a08.pickle
0: books/572fbf1fc180817cd235da9c.pickle
0: books/57306120c180817cd236c443.pickle
0: books/57307866c180817cd236e7ae.pickle
0: books/5730a72cc180817cd2373040.pickle
0: books/5730bec5c180817cd237580e.pickle
0: books/5730c191c180817cd2376391.pickle
0: books/5730c19cc180817cd237646b.pickle
0: books/5730c1a5c180817cd2376482.pickle
0: books/57319476c180817cd238b301.pickle
0: books/5731c030c180817cd238ea61.pickle
0: books/5731f230c180817cd2393fbd.pickle
0: books/573209e1c180817cd23969a8.pickle
0: books/57321e7ac180817cd23982c5.pickle
0: books/573225c0c180817cd2399022.pickle
0: books/57323cd5c180817cd239b54d.pickle
0: books/573250f2c180817cd239cfa0.pickle
0: books/5732f388c180817cd23ac411.pickle
0: books/57330b18c180817cd23ae6de.pickle
0: books/57331f2bc180817cd23aff4a.pickle
0: books/57331f2cc180817cd23aff69.pickle
0: books/57331f2cc180817cd23aff6d.pickle
0: books/57332202c180817cd23b0a3a.pickle
0: books/57333615c180817cd23b226c.pickle
0: books/57333616c180817cd23b22a1.pickle
0: books/5733361bc180817cd23b230b.pickle
0: books/57333906c180817cd23b30b9.pickle
0: books/5733a822c1808103a3eff5c5.pickle
0: books/5733a824c1808103a3eff64a.pickle
0: books/5733ab1dc1808103a3f0030c.pickle
0: books/57340656c1808103a3f08a1c.pickle
0: books/57341a3dc1808103a3f0a0ed.pickle
0: books/5734e6c8c180811f39159b47.pickle
0: books/5734e6c9c180811f39159b4b.pickle
0: books/5734e6c9c180811f39159b5f.pickle
0: books/5734e8fac180811f3915a7c2.pickle
0: books/5734e902c180811f3915a88f.pickle
0: books/57350a21c180811f3915e6c7.pickle
0: books/57352d59c180811f39163460.pickle
0: books/57353d57c180811f39164c59.pickle
0: books/57357056c180811f3916b60d.pickle
0: books/573795cfc1808103a1289693.pickle
0: books/573795ddc1808103a128971a.pickle
0: books/573795dec1808103a128971f.pickle
0: books/573795e0c1808103a1289729.pickle
0: books/57379723c1808103a128a418.pickle
0: books/57379727c1808103a128a4a6.pickle
0: books/5737973ac1808103a128a5fd.pickle
0: books/5737973cc1808103a128a60a.pickle
0: books/57385e78c1808103a12a187a.pickle
0: books/57385e7cc1808103a12a1916.pickle
0: books/57386f79c1808103a12a4260.pickle
0: books/5738b233c1808103a12ac5da.pickle
0: books/5738d39cc1808103a12b06dd.pickle
0: books/5738e457c1808103a12b28ba.pickle
0: books/5739479dc1808103a12bdebd.pickle
0: books/5739590ec1808103a12c082b.pickle
0: books/57397995c1808103a12c3da0.pickle
0: books/57399af5c1808103a12c7d73.pickle
0: books/5739abd9c1808103a12c9f6c.pickle
0: books/5739abd9c1808103a12c9f6d.pickle
0: books/5739bca4c1808103a12cc1c4.pickle
0: books/573a294bc18081690ac7d005.pickle
0: books/573a294cc18081690ac7d00d.pickle
0: books/573a294dc18081690ac7d03d.pickle
0: books/573a294ec18081690ac7d03e.pickle
0: books/573a2957c18081690ac7d0d2.pickle
0: books/573a2a75c18081690ac7ddbb.pickle
0: books/573a2a78c18081690ac7ddcf.pickle
0: books/573a4d16c18081690ac8269e.pickle
0: books/573af61ac18081690ac96822.pickle
0: books/573b073ec18081690ac98b0b.pickle
0: books/573b298ac18081690ac9d278.pickle
0: books/573b3ad8c18081690ac9f83d.pickle
0: books/573b3bcac18081690aca03ba.pickle
0: books/573b3bddc18081690aca0405.pickle
0: books/573b4c61c18081690aca1d79.pickle
0: books/573b6e26c18081690aca67b0.pickle
0: books/573ba3c1c18081690acae365.pickle
0: books/573bf8c4c18081690acb8b9e.pickle
0: books/573c4caac18081690acc2278.pickle
0: books/573c4cabc18081690acc227c.pickle
0: books/573c910ec18081690accb58c.pickle
0: books/573ca413c18081690accdbd0.pickle
0: books/573ca413c18081690accdbd2.pickle
0: books/573cb64fc18081690acd0c37.pickle
0: books/573cc672c18081690acd24cf.pickle
0: books/573e078ac180810be6e04d07.pickle
0: books/573e2902c180810be6e08ee7.pickle
0: books/573e9078c180810be6e164ef.pickle
0: books/573ef60ec180810be6e23093.pickle
0: books/573ef60ec180810be6e23095.pickle
0: books/573f2952c180810be6e2a1b9.pickle
0: books/573f2952c180810be6e2a1cc.pickle
0: books/573f2a55c180810be6e2ae10.pickle
0: books/573f3a90c180810be6e2c72a.pickle
0: books/573f3a92c180810be6e2c798.pickle
0: books/573f3a92c180810be6e2c799.pickle
0: books/573f4bacc180810be6e2ee44.pickle
0: books/573f4c8fc180810be6e2fb19.pickle
0: books/573f5cb6c180810be6e31493.pickle
0: books/573f6dcac180810be6e33a5e.pickle
0: books/573f6eb0c180810be6e34722.pickle
0: books/573f7fd3c180810be6e36c69.pickle
0: books/57406d09c180810be6e53b4c.pickle
0: books/57407e4bc180810be6e55e3b.pickle
0: books/5740b037c180810be6e5b9b4.pickle
0: books/5741bd83c180810be6e7bf6f.pickle
0: books/5741cf45c180810be6e7eccd.pickle
0: books/5741df6bc180810be6e804ae.pickle
0: books/5741e03cc180810be6e80f23.pickle
0: books/5742014cc180810be6e84762.pickle
0: books/5742124ac180810be6e86a52.pickle
0: books/57432215c180810be6ea8b62.pickle
0: books/5743341cc180810be6eabde4.pickle
0: books/57435578c180810be6eafed9.pickle
0: books/574366a0c180810be6eb2541.pickle
0: books/5743de7dc180810be6ec2486.pickle
0: books/5743de8ac180810be6ec2585.pickle
0: books/5744108ac180810be6ec8b10.pickle
0: books/57442166c180810be6eca99c.pickle
0: books/5744429ec180810be6ece685.pickle
0: books/5744429ec180810be6ece688.pickle
0: books/5744436bc180810be6ecf107.pickle
0: books/57445518c180810be6ed16e7.pickle
0: books/57446551c180810be6ed323a.pickle
0: books/57446552c180810be6ed32a2.pickle
0: books/5744663dc180810be6ed3e54.pickle
0: books/5744665dc180810be6ed3f5c.pickle
0: books/5744769dc180810be6ed58ea.pickle
0: books/574487d6c180810be6ed7f32.pickle
0: books/574499dac180810be6edaf0d.pickle
0: books/5744ab18c180810be6edd5b8.pickle
0: books/5744bb54c180810be6edf016.pickle
0: books/5744bb54c180810be6edf025.pickle
0: books/5744ddb0c180810be6ee3b22.pickle
0: books/5745228dc180810be6eecf17.pickle
0: books/5745337ec180810be6eef04f.pickle
0: books/57453389c180810be6eef0f4.pickle
0: books/57455558c180810be6ef3355.pickle
0: books/57456650c180810be6ef5321.pickle
0: books/57457747c180810be6ef74ef.pickle
0: books/5745877cc180810be6ef8d5b.pickle
0: books/5745988cc180810be6efb132.pickle
0: books/5745a9c7c180810be6efd70b.pickle
0: books/5745aaa1c180810be6efe13c.pickle
0: design/56d62ba0c1808113ffb8825e.pickle
0: design/56d62ba1c1808113ffb88262.pickle
0: design/56d62ba2c1808113ffb88264.pickle
0: design/56d62ba3c1808113ffb88266.pickle
0: design/56d62ba4c1808113ffb88269.pickle
0: design/56d62ba4c1808113ffb8827b.pickle
0: design/56d62ba8c1808113ffb8828e.pickle
0: design/56d62baac1808113ffb88298.pickle
0: design/56d62bb1c1808113ffb882ba.pickle
0: design/56d62bb3c1808113ffb882c1.pickle
0: design/56d62bb6c1808113ffb882ce.pickle
0: design/56d62bb8c1808113ffb882db.pickle
0: design/56d62bb9c1808113ffb882df.pickle
0: design/56d62bbac1808113ffb882e2.pickle
0: design/56d62bbac1808113ffb882f5.pickle
0: design/56d62bbcc1808113ffb882fb.pickle
0: design/56d62bbec1808113ffb882ff.pickle
0: design/56d62bc3c1808113ffb88312.pickle
0: design/56d62bc4c1808113ffb88317.pickle
0: design/56d62bd0c1808113ffb8834e.pickle
0: design/56d62bd1c1808113ffb88351.pickle
0: design/56d62bd1c1808113ffb88353.pickle
0: design/56d7101cc180810560aec7ba.pickle
0: design/56d7101ec180810560aec7d6.pickle
0: design/56d870d8c18081104b39b263.pickle
0: design/56d870e5c18081104b39b2ca.pickle
0: design/56d870f7c18081104b39b360.pickle
0: design/56d870f9c18081104b39b373.pickle
0: design/56d870f9c18081104b39b376.pickle
0: design/56d870fac18081104b39b378.pickle
0: design/56d87105c18081104b39b3af.pickle
0: design/56d87106c18081104b39b3ba.pickle
0: design/56d87107c18081104b39b3bb.pickle
0: design/56d884b9c18081104b39ca89.pickle
0: design/56d8965bc18081120d822bf4.pickle
0: design/56d8a361c1808111c9846675.pickle
0: design/56d8d57dc1808111c984a608.pickle
0: design/56d8d580c1808111c984a687.pickle
0: design/56d9beb4c1808111c985af34.pickle
0: design/56d9cef1c1808111c985c4ec.pickle
0: design/56d9cef7c1808111c985c584.pickle
0: design/56d9cef7c1808111c985c585.pickle
0: design/56d9cef8c1808111c985c5bc.pickle
0: design/56d9f034c1808111c985f2c4.pickle
0: design/56db18b4c1808111c9873896.pickle
0: design/56dbde93c1808111c98808c0.pickle
0: design/56dbff6fc1808111c988284f.pickle
0: design/56dd3892c1808111c9897239.pickle
0: design/56dd596ec1808111c98992e2.pickle
0: design/56dd8b15c1808111c989ceb7.pickle
0: design/56ddac72c1808111c989fbfd.pickle
0: design/56ddce2cc1808111c98a2b0e.pickle
0: design/56de7390c1808111c98aee9b.pickle
0: design/56deb52cc1808111c98b3103.pickle
0: design/56ded605c1808111c98b568a.pickle
0: design/56ded605c1808111c98b56ed.pickle
0: design/56def75fc1808111c98b801d.pickle
0: design/56def761c1808111c98b808f.pickle
0: design/56df07e8c1808111c98b96ac.pickle
0: design/56df1889c1808111c98bace6.pickle
0: design/56df39d1c1808111c98bd908.pickle
0: design/56e04076c1808111c98d0671.pickle
0: design/56e05113c1808111c98d1c46.pickle
0: design/56e07279c1808111c98d4773.pickle
0: design/56e0b49cc1808111c98d9e62.pickle
0: design/56e18a30c1808111c98e87ba.pickle
0: design/56e18a32c1808111c98e8802.pickle
0: design/56e1ab8fc1808111c98eb489.pickle
0: design/56e1ab92c1808111c98eb4d9.pickle
0: design/56e1bc1cc1808111c98ecbbd.pickle
0: design/56e1ccb2c1808111c98ee093.pickle
0: design/56e1dd35c1808111c98ef6fe.pickle
0: design/56e1edb6c1808111c98f0ca6.pickle
0: design/56e2d38ac1808111c99013d3.pickle
0: design/56e2f4fdc1808111c9904063.pickle
0: design/56e43075c1808111c9919f93.pickle
0: design/56e5481dc1808111c992bf3a.pickle
0: design/56e579a2c1808111c992f146.pickle
0: design/56e5cc1ac1808111c9934889.pickle
0: design/56e5dc95c1808111c993594b.pickle
0: design/56e5ecfec1808111c9936aa3.pickle
0: design/56e690e4c1808111c99413a9.pickle
0: design/56e6c28ec1808111c9944eb3.pickle
0: design/56e6f472c1808111c994906e.pickle
0: design/56e70505c1808111c994a589.pickle
0: design/56e7050ac1808111c994a656.pickle
0: design/56e837c6c1808105538103b8.pickle
0: design/56e837c9c180810553810477.pickle
0: design/56e837d3c1808105538104fd.pickle
0: design/56e837d3c180810553810504.pickle
0: design/56e837d4c180810553810505.pickle
0: design/56e837d4c180810553810507.pickle
0: design/56e84424c1808103936f6fdf.pickle
0: design/56e859e6c1808103936f8dee.pickle
0: design/56e9643ec1808111e05f5fb5.pickle
0: design/56e9644ac1808111e05f6102.pickle
0: design/56e9644ac1808111e05f6108.pickle
0: design/56e9644bc1808111e05f6112.pickle
0: design/56eacc11c180814572d2761e.pickle
0: design/56eacc12c180814572d27630.pickle
0: design/56eacc13c180814572d27637.pickle
0: design/56eacc1dc180814572d2767b.pickle
0: design/56eadeccc180814572d296f6.pickle
0: design/56eb0163c180814572d2d001.pickle
0: design/56eb125cc180814572d2eb60.pickle
0: design/56ec000fc180814c03c85c03.pickle
0: design/56ec0017c180814c03c85d2f.pickle
0: design/56ec2228c180814c03c897ad.pickle
0: design/56ec2229c180814c03c897e1.pickle
0: design/56ed42e2c180814c03ca40df.pickle
0: design/56ed8547c180814c03caa29d.pickle
0: design/56eda6a5c180814c03cad2f0.pickle
0: design/56eed35dc180814c03cc6c18.pickle
0: design/56ef0591c180814c03ccb495.pickle
0: design/56ef8c5fc180814c03cd7562.pickle
0: design/56eff52fc1808103e16770ad.pickle
0: design/56eff530c1808103e16770f4.pickle
0: design/56f0060ec1808103e1678ce2.pickle
0: design/56f00613c1808103e1678da4.pickle
0: design/56f00614c1808103e1678dc8.pickle
0: design/56f00614c1808103e1678dde.pickle
0: design/56f02821c1808103e167c898.pickle
0: design/56f02827c1808103e167c921.pickle
0: design/56f0391ec1808103e167e5d0.pickle
0: design/56f5396cc18081352e65481c.pickle
0: design/56f5396dc18081352e654820.pickle
0: design/56f53975c18081352e654892.pickle
0: design/56f53981c18081352e6548e5.pickle
0: design/56f560bec18081352e658df2.pickle
0: design/56f560bfc18081352e658df8.pickle
0: design/56f57183c18081352e65a2da.pickle
0: design/56f57187c18081352e65a345.pickle
0: design/56f582f9c18081352e65bffe.pickle
0: design/56f5946ac18081352e65daa9.pickle
0: design/56f5b730c18081352e661237.pickle
0: design/56f5b732c18081352e661267.pickle
0: design/56f7d36bc1808147f07ff28d.pickle
0: design/56f7e4e1c1808147f0801294.pickle
0: design/56f7e4e4c1808147f080131a.pickle
0: design/56f92cc1c1808147f08256eb.pickle
0: design/56f93e3ec1808147f082799b.pickle
0: design/56f95032c1808147f0829d72.pickle
0: design/56f96200c1808147f082c1d3.pickle
0: design/56f9ab20c1808147f0835155.pickle
0: design/56fc3b75c18081767c938f5b.pickle
0: design/56fc3b7dc18081767c93901a.pickle
0: design/56fc3b7dc18081767c93901b.pickle
0: design/56fc3b7fc18081767c939035.pickle
0: design/56fc3b7fc18081767c93903a.pickle
0: design/56fc3b80c18081767c939042.pickle
0: design/56fc3b82c18081767c93904b.pickle
0: design/56fc3b8cc18081767c939060.pickle
0: design/56fc3b8fc18081767c93907b.pickle
0: design/56fd9c4ec1808103d32d52b1.pickle
0: design/56fd9c4fc1808103d32d52bf.pickle
0: design/56fd9c50c1808103d32d52c2.pickle
0: design/56fd9c53c1808103d32d5362.pickle
0: design/56fd9c55c1808103d32d5388.pickle
0: design/56fd9c5bc1808103d32d53cc.pickle
0: design/56fd9c61c1808103d32d53f1.pickle
0: design/56fd9db3c1808103d32d5e21.pickle
0: design/56fd9db3c1808103d32d5e25.pickle
0: design/56fe5be8c1808103d32eaa36.pickle
0: design/56fe919cc1808103d32f12bf.pickle
0: design/56fea34fc1808103d32f36b5.pickle
0: design/56feeac6c1808103d32fc2fa.pickle
0: design/57003572c1808103d3320726.pickle
0: design/57012886c1808103d333a1d9.pickle
0: design/57018ff7c1808103d3345d72.pickle
0: design/57020894c1808103d3352ea9.pickle
0: design/570270d8c1808103d335eb4d.pickle
0: design/570270dbc1808103d335ebed.pickle
0: design/570270dbc1808103d335ebf1.pickle
0: design/570270dcc1808103d335ebfe.pickle
0: design/57028205c1808103d3360f4d.pickle
0: design/570293b4c1808103d3363375.pickle
0: design/5702a53ec1808103d33656f3.pickle
0: design/5702a540c1808103d336579b.pickle
0: design/5702a544c1808103d336580f.pickle
0: design/5702d9fcc1808103d336c139.pickle
0: design/57041fa4c18081204db7ade8.pickle
0: design/57041fa5c18081204db7ade9.pickle
0: design/57041fa5c18081204db7adeb.pickle
0: design/57041faac18081204db7aee4.pickle
0: design/57041facc18081204db7aeea.pickle
0: design/57041fb3c18081204db7af28.pickle
0: design/57041fb4c18081204db7af31.pickle
0: design/57041fb5c18081204db7af34.pickle
0: design/57056f62c180812e9407e48f.pickle
0: design/57056f63c180812e9407e494.pickle
0: design/57056f73c180812e9407e584.pickle
0: design/57057886c180812e9407f1ce.pickle
0: design/57057886c180812e9407f1cf.pickle
0: design/57057886c180812e9407f1d2.pickle
0: design/5706153bc180812e9408ff50.pickle
0: design/57066bf3c180812e94099fad.pickle
0: design/57067e04c180812e9409c5dc.pickle
0: design/5706a236c180810ca39486cf.pickle
0: design/5706a2a2c180810ca3948ee3.pickle
0: design/5707b827c180810ca3968353.pickle
0: design/5707c99dc180810ca396a704.pickle
0: design/5707c9a2c180810ca396a77a.pickle
0: design/5707c9a2c180810ca396a77f.pickle
0: design/5707db3fc180810ca396cb1f.pickle
0: design/5707fe2bc180810ca39713e6.pickle
0: design/57080f26c180810ca3973661.pickle
0: design/570855a1c180810ca397c0bb.pickle
0: design/57091608c180810ca398fd97.pickle
0: design/57095b51c180810ca3997ced.pickle
0: design/570a6e96c180810ca39b48ed.pickle
0: design/570b2cd6c180810ca39c95d8.pickle
0: design/570b951dc180810ca39d4759.pickle
0: design/570ba677c180810ca39d6b94.pickle
0: design/570ba67bc180810ca39d6c27.pickle
0: design/570bb7e2c180810ca39d8ede.pickle
0: design/570bca73c180810ca39db9d6.pickle
0: design/570becccc180810ca39df856.pickle
0: design/570beccec180810ca39df8a8.pickle
0: design/570c20fec180810ca39e62a5.pickle
0: design/570c22dec180810ca39e6cbe.pickle
0: design/570c9a8ec180810ca39f4ab1.pickle
0: design/570cf0e5c180810ca39fed57.pickle
0: design/570d1423c180810ca3a03661.pickle
0: design/570d1426c180810ca3a036b3.pickle
0: design/570d260ec180810ca3a05c4d.pickle
0: design/570d379ec180810ca3a0823d.pickle
0: design/570d4925c180810ca3a0a73d.pickle
0: design/570d5a76c180810ca3a0cb35.pickle
0: design/570d6cecc180810ca3a0f6fd.pickle
0: design/570df814c180810ca3a2000d.pickle
0: design/570e6748c1808109b8319f7c.pickle
0: design/570e674bc1808109b8319fcc.pickle
0: design/570e78e6c1808109b831c608.pickle
0: design/570e8ae9c1808109b831eaf6.pickle
0: design/570ebec6c1808109b832585f.pickle
0: design/571006a1c1808128a22d92a1.pickle
0: design/571006b0c1808128a22d93cd.pickle
0: design/571006b0c1808128a22d93db.pickle
0: design/571007d1c1808128a22d9e03.pickle
0: design/5710c5b0c1808128a22f0045.pickle
0: design/5710c5b0c1808128a22f0046.pickle
0: design/5710e85ec1808128a22f4612.pickle
0: design/57110b36c1808128a22f8fd1.pickle
0: design/57110b39c1808128a22f9045.pickle
0: design/57110b3ac1808128a22f9052.pickle
0: design/57113751c1808128a22fd97a.pickle
0: design/57116f38c1808128a23021f4.pickle
0: design/57126493c1808128a2316df9.pickle
0: design/5714f149c1808128a234d44c.pickle
0: design/5714f14ec1808128a234d521.pickle
0: design/571509efc1808128a234fb76.pickle
0: design/5715228ec1808128a2351ff9.pickle
0: design/57152290c1808128a235205e.pickle
0: design/57154907c1808103a0ce8eb3.pickle
0: design/57154cdfc1808103a0ce96ff.pickle
0: design/57156178c1808103a0ceb37d.pickle
0: design/57160431c1808103a0cf9c51.pickle
0: design/571632cbc1808103a0cfe46c.pickle
0: design/57164a63c1808103a0d009f3.pickle
0: design/57164a63c1808103a0d00a09.pickle
0: design/57164a64c1808103a0d00a1a.pickle
0: design/571661dbc1808103a0d02ecf.pickle
0: design/571690d5c1808103a0d07b38.pickle
0: design/571690d5c1808103a0d07b53.pickle
0: design/571690d5c1808103a0d07b54.pickle
0: design/57177a34c1808103a0d1d732.pickle
0: design/5717a8c8c1808103a0d22236.pickle
0: design/5717a8cac1808103a0d222ac.pickle
0: design/5717d805c1808103a0d26f4a.pickle
0: design/5717f285c1808103a0d29c59.pickle
0: design/57180718c1808103a0d2b9a7.pickle
0: design/5718d81ec1808103a0d3f700.pickle
0: design/5718efa7c1808103a0d41e3c.pickle
0: design/5718efa8c1808103a0d41e4f.pickle
0: design/5718efabc1808103a0d41ec5.pickle
0: design/5718efadc1808103a0d41f15.pickle
0: design/57190749c1808103a0d4444c.pickle
0: design/5719074dc1808103a0d44514.pickle
0: design/57191f0cc1808103a0d46d4f.pickle
0: design/57194df1c1808103a0d4b902.pickle
0: design/571a0733c1808103a0d5cfa8.pickle
0: design/571a1e77c1808103a0d5f2fe.pickle
0: design/571a1e77c1808103a0d5f301.pickle
0: design/571a35fbc1808103a0d618d7.pickle
0: design/571a4db7c1808103a0d63e1e.pickle
0: design/571a4db8c1808103a0d63e3a.pickle
0: design/571a4db8c1808103a0d63e3b.pickle
0: design/571a7cccc1808103a0d689ed.pickle
0: design/571a7ccdc1808103a0d689ee.pickle
0: design/571a7ccec1808103a0d68a41.pickle
0: design/571a7ccfc1808103a0d68a4f.pickle
0: design/571a9436c1808103a0d6b1ad.pickle
0: design/571b088dc1808103a0d76283.pickle
0: design/571b7c38c1808103a0d803c3.pickle
0: design/571cd804c1808103a0d9ec82.pickle
0: design/571d1d3fc1808103a0da4e1c.pickle
0: design/571e4b08c1808103a0dc1086.pickle
0: design/571e6222c1808103a0dc356b.pickle
0: design/571e6224c1808103a0dc35a5.pickle
0: design/571e64f6c1808103a0dc3e89.pickle
0: design/571ea894c1808103a0dca574.pickle
0: design/571f63e3c1808103a0ddb652.pickle
0: design/571f63e6c1808103a0ddb6ac.pickle
0: design/571f932bc1808103a0de0552.pickle
0: design/571faa79c1808103a0de2a7c.pickle
0: design/571faa7bc1808103a0de2aad.pickle
0: design/571fd962c1808103a0de74a0.pickle
0: design/57206616c1808103a0df48fa.pickle
0: design/5720dac5c1808103a0e0024d.pickle
0: design/5720dac6c1808103a0e0026b.pickle
0: design/5720f27fc1808103a0e02720.pickle
0: design/5720f281c1808103a0e02750.pickle
0: design/57210a0fc1808103a0e04cfb.pickle
0: design/57210a0fc1808103a0e04cfc.pickle
0: design/57210a11c1808103a0e04d70.pickle
0: design/57210a13c1808103a0e04da2.pickle
0: design/57212177c1808103a0e07522.pickle
0: design/572138c5c1808103a0e09ae2.pickle
0: design/572138c5c1808103a0e09ae6.pickle
0: design/57222466c1808103a0e1ff8a.pickle
0: design/57222470c1808103a0e2007b.pickle
0: design/57225491c1808103a0e25138.pickle
0: design/57226c1ac1808103a0e27711.pickle
0: design/572283bbc1808103a0e29ed5.pickle
0: design/5722e164c1808103a0e32a22.pickle
0: design/57233e3ec1808103a0e3acf4.pickle
0: design/57236ce9c1808103a0e3faee.pickle
0: design/57236ce9c1808103a0e3faf1.pickle
0: design/57238479c1808103a0e42288.pickle
0: design/5723847dc1808103a0e4235b.pickle
0: design/5723ca86c1808103a0e495f9.pickle
0: design/5723cdc6c1808103a0e4a0bb.pickle
0: design/5724cb6bc1808103a0e60cdd.pickle
0: design/5724e2c3c1808103a0e631d4.pickle
0: design/57253f0fc1808103a0e6bfb8.pickle
0: design/5726c8ebc1808103a0e8fe6f.pickle
0: design/572754a0c1808103a0e9cad1.pickle
0: design/5727832dc1808103a0ea15c7.pickle
0: design/57279dbcc1808103a0ea49d0.pickle
0: design/5727b26cc1808103a0ea6535.pickle
0: design/5727c96fc1808103a0ea8940.pickle
0: design/5727c973c1808103a0ea89e6.pickle
0: design/5727c973c1808103a0ea89e8.pickle
0: design/5728f335c180817cd22b84e7.pickle
0: design/5728f344c180817cd22b861c.pickle
0: design/5728f344c180817cd22b861e.pickle
0: design/5728f345c180817cd22b8625.pickle
0: design/5728f345c180817cd22b8629.pickle
0: design/57292295c180817cd22bd12f.pickle
0: design/57292297c180817cd22bd1d7.pickle
0: design/5729ae82c180817cd22ca50f.pickle
0: design/5729b14fc180817cd22cad8f.pickle
0: design/5729c87fc180817cd22ccdb3.pickle
0: design/5729f499c180817cd22d0e1b.pickle
0: design/572a0c3ac180817cd22d362a.pickle
0: design/572a0c3fc180817cd22d36a4.pickle
0: design/572a3b70c180817cd22d84bb.pickle
0: design/572a3b73c180817cd22d84fe.pickle
0: design/572a3b73c180817cd22d8513.pickle
0: design/572a6aabc180817cd22dcd58.pickle
0: design/572a6aadc180817cd22dcd89.pickle
0: design/572a8228c180817cd22df1be.pickle
0: design/572a8229c180817cd22df1dd.pickle
0: design/572a992bc180817cd22e17ee.pickle
0: design/572b24d0c180817cd22ee34e.pickle
0: design/572b53cfc180817cd22f3200.pickle
0: design/572b6b83c180817cd22f5a91.pickle
0: design/572b8386c180817cd22f8155.pickle
0: design/572b8389c180817cd22f8242.pickle
0: design/572bb2a0c180817cd22fd263.pickle
0: design/572bf878c180817cd23042c1.pickle
0: design/572c3e17c180817cd230aa99.pickle
0: design/572c9ddbc180817cd2313576.pickle
0: design/572c9ddcc180817cd231359d.pickle
0: design/572cb5f7c180817cd2315c69.pickle
0: design/572ccdf8c180817cd23184b5.pickle
0: design/572ccdfac180817cd231852a.pickle
0: design/572ccdfec180817cd23185cd.pickle
0: design/572ce616c180817cd231ac9b.pickle
0: design/572d1558c180817cd231fa82.pickle
0: design/572d155bc180817cd231fa9e.pickle
0: design/572e0276c180817cd2335244.pickle
0: design/572f49e5c180817cd23532fc.pickle
0: design/57308fc4c180817cd2370e97.pickle
0: design/57308fcac180817cd2370f82.pickle
0: design/5730929bc180817cd2371785.pickle
0: design/5730a74cc180817cd237338f.pickle
0: design/5730a74ec180817cd23733d2.pickle
0: design/5730a74fc180817cd23733f5.pickle
0: design/5730bee0c180817cd2375c3a.pickle
0: design/5730ee09c180817cd237aa88.pickle
0: design/573105f7c180817cd237d14a.pickle
0: design/573108ccc180817cd237dc58.pickle
0: design/57314be9c180817cd23841b3.pickle
0: design/57317a74c180817cd2388632.pickle
0: design/5731a8f5c180817cd238cb3c.pickle
0: design/5731d7e5c180817cd2391149.pickle
0: design/5731ef75c180817cd239380b.pickle
0: design/57321e94c180817cd23985ab.pickle
0: design/573267fec180817cd239f654.pickle
0: design/5732da1cc180817cd23a9af2.pickle
0: design/57334d63c180817cd23b4dc4.pickle
0: design/57334d66c180817cd23b4e12.pickle
0: design/573364bcc180817cd23b754a.pickle
0: design/573364c0c180817cd23b75e1.pickle
0: design/5733a851c1808103a3eff971.pickle
0: design/5733a854c1808103a3effa03.pickle
0: design/5733a857c1808103a3effa4f.pickle
0: design/5734e71cc180811f39159f1d.pickle
0: design/5734e71dc180811f39159f20.pickle
0: design/5734e721c180811f3915a019.pickle
0: design/5734e72ec180811f3915a063.pickle
0: design/5734e72ec180811f3915a064.pickle
0: design/57356fa3c180811f3916af46.pickle
0: design/57379649c1808103a1289a91.pickle
0: design/57379649c1808103a1289a92.pickle
0: design/5737964ac1808103a1289a97.pickle
0: design/5737964ec1808103a1289b4c.pickle
0: design/57379650c1808103a1289b73.pickle
0: design/57379651c1808103a1289b78.pickle
0: design/57379651c1808103a1289b79.pickle
0: design/5737965ec1808103a1289bb2.pickle
0: design/57379779c1808103a128a733.pickle
0: design/5738b183c1808103a12abec6.pickle
0: design/5738c23fc1808103a12adf97.pickle
0: design/5739bcb7c1808103a12cc4aa.pickle
0: design/573a2992c18081690ac7d3d0.pickle
0: design/573a299cc18081690ac7d50d.pickle
0: design/573a2a8fc18081690ac7de4e.pickle
0: design/573a3a9cc18081690ac7f947.pickle
0: design/573af62ac18081690ac96b09.pickle
0: design/573b29a6c18081690ac9d66d.pickle
0: design/573b3aefc18081690ac9fbca.pickle
0: design/573b3af2c18081690ac9fc47.pickle
0: design/573b4c78c18081690aca2082.pickle
0: design/573b5d26c18081690aca461e.pickle
0: design/573b5d26c18081690aca4633.pickle
0: design/573b5d26c18081690aca463f.pickle
0: design/573b90fdc18081690acab69f.pickle
0: design/573c19fbc18081690acbc3dd.pickle
0: design/573c8015c18081690acc9445.pickle
0: design/573ca436c18081690acce081.pickle
0: design/573ca520c18081690acce914.pickle
0: design/573cd7bec18081690acd4c87.pickle
0: design/573e0660c180810be6e04287.pickle
0: design/573e0661c180810be6e042e4.pickle
0: design/573e066dc180810be6e043ae.pickle
0: design/573e066ec180810be6e043be.pickle
0: design/573e066fc180810be6e043cf.pickle
0: design/573e0670c180810be6e043d4.pickle
0: design/573e079ac180810be6e04ddc.pickle
0: design/573e291fc180810be6e09275.pickle
0: design/573e3a32c180810be6e0b6dd.pickle
0: design/573e3c23c180810be6e0c18e.pickle
0: design/573f072fc180810be6e2588b.pickle
0: design/573f2962c180810be6e2a470.pickle
0: design/573f2966c180810be6e2a523.pickle
0: design/573f2968c180810be6e2a544.pickle
0: design/573f3aadc180810be6e2cb88.pickle
0: design/573f5cd6c180810be6e3194b.pickle
0: design/573f6de8c180810be6e33eca.pickle
0: design/573f9010c180810be6e38966.pickle
0: design/57406c52c180810be6e5349d.pickle
0: design/5741ce87c180810be6e7e53e.pickle
0: design/5741f071c180810be6e8294e.pickle
0: design/5742bc96c180810be6e9bc80.pickle
0: design/5742eeb7c180810be6ea1d0b.pickle
0: design/5742ffcbc180810be6ea401b.pickle
0: design/574310f4c180810be6ea68b2.pickle
0: design/5743222cc180810be6ea8f07.pickle
0: design/5743446ec180810be6eadb3e.pickle
0: design/574377e6c180810be6eb4d06.pickle
0: design/574377e7c180810be6eb4d25.pickle
0: design/574431abc180810be6ecc4d2.pickle
0: design/574442aec180810be6ece938.pickle
0: design/574487f3c180810be6ed832c.pickle
0: design/5744aa47c180810be6edce90.pickle
0: design/5744bb76c180810be6edf468.pickle
0: design/5745878ec180810be6ef90a7.pickle
0: design/574598a1c180810be6efb4af.pickle
1: books/57226c01c1808103a0e27364.pickle
2: books/56e963ecc1808111e05f5b75.pickle
3: books/56e84797c1808103936f75df.pickle
4: design/56edc801c180814c03cb02b1.pickle
5: books/5722839fc1808103a0e29b0b.pickle
6: design/573e065fc180810be6e04279.pickle
6: design/573e079ac180810be6e04dde.pickle
7: design/56eadecdc180814572d2971d.pickle
8: books/5702b6bfc1808103d3367966.pickle
9: books/573e074cc180810be6e04bb7.pickle

LDA


In [47]:
# This is what Gensim was made for - short, sweet, simple: 
start = time.time() 
documents = [
    list(normalize(corpus.words(fileids=fileid)))
    for fileid in corpus.fileids()
]

# Create dictionary with tid to token mappings (or alternatively load one) 
id2word = gensim.corpora.Dictionary(documents)
# id2word = gensim.corpora.Dictionary.load('corpus.txt')

# Vectorize each document to create a corpus and write to disk. 
path    = os.path.join(ROOT, 'fixtures', 'corpus.mm')
corpus  = [id2word.doc2bow(doc) for doc in documents]
gensim.corpora.MmCorpus.serialize(path, corpus)

# Force the automatic call to matrix market fitting 
mm = gensim.corpora.MmCorpus(path)

# Run the LDA model 
lda = gensim.models.ldamodel.LdaModel(corpus=mm, id2word=id2word, num_topics=10, update_every=1, passes=20)
print("Took {:0.3f} seconds to fit LDA model.".format(time.time()-start))

# Print the topics by most informative words. 
for topic in lda.print_topics(10):
    print(topic)
    print("")


Took 2004.417 seconds to fit LDA model.
(0, '0.009*season + 0.009*say + 0.009*year + 0.007*team + 0.006*first + 0.005*play + 0.005*last + 0.005*two + 0.005*new + 0.005*show')

(1, '0.010*food + 0.008*water + 0.008*space + 0.007*make + 0.007*use + 0.005*nasa + 0.004*de + 0.004*1 + 0.004*eat + 0.004*add')

(2, '0.024*say + 0.009*u + 0.006*state + 0.005*attack + 0.005*people + 0.005*official + 0.005*country + 0.005*police + 0.005*report + 0.004*government')

(3, '0.010*use + 0.009*company + 0.007*data + 0.007*new + 0.006*user + 0.006*google + 0.005*facebook + 0.005*also + 0.005*technology + 0.005*service')

(4, '0.012*$ + 0.011*year + 0.011*company + 0.010*say + 0.007*million + 0.006*business + 0.006*market + 0.006*new + 0.006*u + 0.005*would')

(5, '0.013*get + 0.012*game + 0.010*make + 0.010*go + 0.010*one + 0.009*like + 0.007*time + 0.006*good + 0.005*look + 0.005*take')

(6, '0.026*trump + 0.017*say + 0.011*clinton + 0.011*republican + 0.010*campaign + 0.010*state + 0.008*party + 0.008*sander + 0.007*mr + 0.007*vote')

(7, '0.024*say + 0.008*state + 0.007*law + 0.007*court + 0.006*year + 0.006*case + 0.005*would + 0.004*report + 0.004*government + 0.004*use')

(8, '0.028*1 + 0.021*2 + 0.019*3 + 0.018*$ + 0.015*5 + 0.014*4 + 0.013*6 + 0.013*percent + 0.012*10 + 0.011*7')

(9, '0.008*one + 0.008*say + 0.008*people + 0.007*like + 0.006*know + 0.006*time + 0.006*woman + 0.005*get + 0.005*go + 0.005*make')


In [48]:
lda.save(os.path.join(ROOT, 'fixtures', 'baleen.lda'))