Notebook AuthorDetector

Ce notebook vous permettra de charger, d'utiliser et de manipuler l'application AuthorDetector.

Les codes de chargement et d'initialisation ci-dessous sont à exécuter avant toute manipulation.

Note: En cas de bug ou problème étrange (comme Memory Buffer Overflow ou si vous voyez les mêmes anciennes erreurs apparaitre alors que vous avez modifié le code), vous pouvez redémarrer le kernel iPython Notebook en allant dans le menu Kernel > Restart.

INITIALISATION

Vous devez exécuter les codes ci-dessous une fois et dans l'ordre, à chaque fois que vous ouvrez le notebook ou que vous redémarrez le kernel iPython.

1- Changement de dossier de travail

Il est nécessaire de changer le dossier de travail afin de s'assurer que l'application AuthorDetector sera trouvée dans le chemin et bien importée, et aussi pour que les chemins relatifs (ex: fichiers de config) fonctionnent. Exécutez le code suivant une fois par session IPython:


In [ ]:
# Change current working directory to the application root folder, if necessary

import inspect, os

# Get current working directory
filename = inspect.getframeinfo(inspect.currentframe()).filename # get the current file path
basepath = os.path.dirname(os.path.abspath(filename)) # get the parent directory containing this file

# Check that we aren't already at the application root folder
while not os.path.isfile(os.path.join(basepath, 'authordetector.py')):
    basepath = os.path.dirname(basepath) # set new basepath
    os.chdir(basepath) # set the directory to the parent of this directory

print('Current working directory: %s' % os.getcwd())

2- Importation des librairies de calcul scientifique

Rajoutez ici les librairies que vous voulez charger et utiliser pour vos calculs. Vous pouvez aussi changer les options d'affichage iPython.


In [ ]:
# Load necessary libraries for your computations
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import math

# Setting a few printing options
pd.set_option('display.max_colwidth', 200)
pd.set_option('display.max_columns', 200)
pd.set_option('display.max_rows',200)
pd.set_option('display.precision',10)
pd.set_option('expand_frame_repr', True)
pd.set_option('line_width', 150)
pd.set_option('display.notebook_repr_html', True)

3- Chargement de la structure principale AuthorDetector Runner

Première étape nécessaire au chargement du programme. Cela va charger le "runner", module principal qui charge et gère tous les autres modules.

Note: il est nécessaire d'exécuter ce code chaque fois que vous modifiez le code source de run.py ou le fichier de configuration (surtout si vous chargez des modules différents).


In [ ]:
# Forcefully reload all the AuthorDetector modules
%load_ext autoreload
%autoreload 2
import authordetector.main
reload(authordetector.main)

# Clean up a few stuff
try:
    del runner.vars
    del runner
except Exception, e:
    pass

# Load the base software
runner = authordetector.main.main(['--script']) # Note that here you can pass any commandline argument you want, or you can just set them in the configuration file since the application considers commandline arguments and config options exactly the same.

In [ ]:
# Reload _only_ the config
# (useful if you change the config and don't want to reload all the modules)
# Note: does NOT work if you change the workflow, you need to reload the whole authordetector application (snippet of code above)
runner.config.reload()

Fin de l'initialisation. Vous pouvez utiliser l'application AuthorDetector.

PHASE 1 - APPRENTISSAGE

Exécutez le code ci-dessous pour apprendre les paramètres à partir des textes et selon votre configuration.

Note: utilisez le fichier de configuration pour spécifier les modules d'apprentissage que vous voulez.

Note2: si vous avez déjà appris des paramètres précédemment, vous pouvez directement lancer la phase de détection sans repasser par l'apprentissage.


In [ ]:
# Clean the previously learned parameters if any, else they will be reused and the result will be different
del runner.vars
runner.vars = dict()

# Reload the configuration in case it was changed
runner.config.reload()

# Load the datafile and learn the parameters
#%timeit runner.learn()
runner.learn()
# This will return "True" at the end if everything went alright.

Affichage des paramètres

Après l'apprentissage, utilisez runner.vars pour afficher tous les paramètres appris:


In [ ]:
# A quick test: show the first 100 features from the first text and the first 5 patterns
print(runner.vars['X'][0][0:100])
print
print(runner.vars['Patterns'].itervalues().next().head()) # print the first values from the first patterns table: dict.itervalues().next() get the first value from the dict

In [ ]:
# Print all the variables and learned parameters (warning: can take a long time)
print("List of variables: %s" % runner.vars.keys())
runner.vars

Note: les paramètres appris sont également enregistré dans un fichier (par défaut parameters.txt).

Note2: si les paramètres ont trop de données, il se peut que simplement un résumé du contenu d'une variable soit affiché ici (surtout si vous utilisez Numpy ou Pandas).

PHASE 2 - DETECTION

Détecte l'auteur d'un texte selon les paramètres appris précédemment et affiche le résultat.


In [ ]:
# Reload the runner
reload(authordetector.run)

# Clean the previously learned parameters if any, else they will be reused and the result will be different
del runner.vars
runner.vars = dict()

# Reload the configuration in case it was changed
runner.config.reload()

# Load the previously learnt parameters
#Runner.load_vars(runner.config.config['parametersfile'], 'L_')

# Launch the detection!
runner.run()

In [ ]:
# Afficher les résultats
print(runner.vars['Result'])
print
print(runner.vars['Result_details'])

In [ ]:
Result_details.keys()

In [ ]:
Result_details = runner.vars['Result_details']
a = pd.DataFrame(Result_details)
a

In [ ]:
b = a.ix[:, 0].max()
b

In [ ]:
import numpy as np
np.min([0.2, 0.5])

In [ ]:
prevmod = dict()
for key, runner.__dict__

In [ ]:
runner.config.get('workflow')

Benchmark

Utilisez ce code pour benchmarker les performances (temps CPU) d'apprentissage (pour par exemple comparer plusieurs algorithmes):


In [ ]:
from authordetector.lib.debug.debug import *

@showprofile
@profileit
def test():
    runner.learn()
test()

Note: d'autres benchmarker (mémoire, line-by-line profiler, etc.) sont disponibles dans authordetector.lib.debug.debug.

EXPERIMENTATIONS / MANIPULATIONS

Exécutez ci-dessous vos propres codes pour manipuler et expérimenter sur les données.

(En général, vous allez travailler sur les données d'apprentissage, donc n'éxecutez pas Détection mais seulement la phase Apprentissage puis exécutez les codes ci-dessous)


In [ ]:
runner.reader.reloadconfig()
runner.reader.textconfig.config

In [ ]:
runner.reader.textconfig.get(4)

In [ ]:
runner.reader.count()

In [ ]:
runner.reader.get_raw_text(4)[0:300]

In [ ]:
dictofvars = runner.featuresextractor.extract()
X = dictofvars['X']
del dictofvars

In [ ]:
print(X[0]['lemmas'][0:100])
print
print(X[0]['gramcat'][0:100])

In [ ]:
dictofvars = runner.patternsextractor.extract(X)
X2 = dictofvars['Patterns']
del dictofvars

In [ ]:
# Print one ngram (the 4th one in the 3rd text)
print(X2[2].iloc[4])
#X2[2].iloc[4] # avoid this, generall prefer print() because Pandas still has some issue with printing unicode strings

In [ ]:
# Print 10 ngrams from the 1st text
print(X2[0].head(20))

In [ ]:
# Preprocessing test
runner.config.reload()
print(runner.reader.get_preprocessed_text(0))

In [ ]:
B = runner.vars['L_Patterns'].itervalues().next()
B

In [ ]:
A = runner.vars['Patterns'].itervalues().next()
A

In [ ]:
import itertools
n = 5
holes = 2
l = [1] * holes + [0] * (n-holes)
wmasks = set(itertools.permutations(l))
wmasks

In [ ]:
ngrams = []
ngram = ['a', 'b', 'c']
wildcard_placeholder = '*'
for w in wmasks:
    g = []
    i = 0
    for wi in w:
        if wi:
            g.append(wildcard_placeholder)
        else:
            g.append(ngram[i])
            i += 1
    #g = [item if not w[i] else '*' for i,item in enumerate(ngram)]
    ngrams.append(g)
ngrams

In [ ]:
import itertools
n = 3
holes = 2
l = [1] * holes + [0] * (n-holes)
wmasks = set(itertools.permutations(l))
wmasks

In [ ]:
ngrams = []
ngram = ['a', 'b', 'c']
wildcard_placeholder = '*'
for w in wmasks:
    g = [item if not w[i] else wildcard_placeholder for i,item in enumerate(ngram)]
    ngrams.append(g)
ngrams

In [ ]:
runner.vars['L_Patterns']['Henri Bergson'].head()

In [ ]:
runner.vars['L_Patterns']['Rene Crevel'].head()

In [ ]: