diff --git a/slides/tbp_implementation.tex b/slides/tbp_implementation.tex new file mode 100644 index 0000000000000000000000000000000000000000..6d7651455375fab69a7db184e72442e1d692e871 --- /dev/null +++ b/slides/tbp_implementation.tex @@ -0,0 +1,1004 @@ +\documentclass[serif, professionalfont, 10pt]{beamer} + +%% pour impression : +%\documentclass[serif, professionalfont, 10pt, handout]{beamer} +%\usepackage{pgfpages} +%\pgfpagesuselayout{4 on 1}[a4paper,border shrink=5mm, landscape] + +\setbeamertemplate{navigation symbols}{} + +\usepackage{tikz} +\usepackage[francais]{babel} +\usepackage[utf8]{inputenc} +\usepackage{mathpazo} +\usepackage{xspace} +\usepackage{graphicx} +\usepackage{textcomp} +\usepackage{tikz-dependency} +\usetikzlibrary{automata,positioning} + +%\usepackage[pdftex]{graphicx} +\usepackage{epsfig} +\usepackage{epstopdf} +%usepackage{minted} +\usepackage[cache=false]{minted} +\usepackage{comment} +%\usemintedstyle{manni} % mouais + +\usepackage{epic} +\usepackage{eepic} +\usepackage{ecltree} +\usepackage{latexsym} +\usepackage{tikz} +\usepackage{tikz-dependency} +\usepackage{algorithm, algorithmic} + +\usepackage{qtree} + +\setbeamertemplate{items}[square] +\setbeamertemplate{enumerate items}[nop] + +\def\red{\color{red}} +\def\blue{\color{blue}} +\newcommand\ra{\rightarrow} +\usepackage{amsmath} +\DeclareMathOperator*{\argmax}{argmax} % thin space, limits underneath in displays +\DeclareMathOperator*{\argmin}{argmin} % thin space, limits underneath in displays +%\DeclareMathOperator*{\argmax}{arg\,max} + +\newcommand{\eps}{\ensuremath{\varepsilon}} +\newcommand{\sig}{\ensuremath{\Sigma}} +\newcommand{\mono}{\ensuremath{\Sigma^\ast}} +\newcommand{\al}{\ensuremath{\alpha}} +\newcommand{\be}{\ensuremath{\beta}} +\newcommand{\ga}{\ensuremath{\gamma}} + +\newcommand{\re}[2]{\ensuremath{#1 \to #2}} + +\newcommand{\vect}[1]{\ensuremath{\overrightarrow{#1}}} + +\newcommand{\kleene}[1]{\ensuremath{#1^\ast}} + +\newcommand{\mt}[0]{\ensuremath{T}} +\newcommand{\me}[0]{\ensuremath{E}} +\newcommand{\for}[2]{\ensuremath{\alpha(#1, #2)}} %probabilite +\newcommand{\back}[2]{\ensuremath{\beta(#1, #2)}} +\newcommand{\best}[2]{\ensuremath{\delta(#1, #2)}} +\newcommand{\backp}[2]{\ensuremath{\psi(#1, #2)}} %pointeur arriere vers l'etat prec. sur le meilleur chemin +\newcommand{\pe}[2]{\ensuremath{E(#1, #2)}} %probabilites d'emission +\newcommand{\pt}[2]{\ensuremath{T(#1, #2)}} %probabilites de transition +\newcommand{\pet}[2]{\ensuremath{\gamma(#1, #2)}} %probabilite d'etre dans un etat e au temps t +\newcommand{\pini}[1]{\ensuremath{\pi(#1)}} %probabilites initiales + +\newcommand{\matrice}[1]{\ensuremath{\textbf{#1}}} + +\newcommand{\pile}[1]{\ensuremath{\mathcal{P}_{#1}}} +\newcommand{\face}[1]{\ensuremath{\mathcal{F}_{#1}}} +\newcommand{\derivp}[2]{\ensuremath{\frac{\partial #1}{\partial #2}}} + + +%\newcommand{\ldep}[1]{\ensuremath{\textsc{\sc left}_{\textsc{#1}}}} +\newcommand{\ldep}[1]{\ensuremath{\textsc{\sc left-}#1}} +%\newcommand{\rdep}[1]{\ensuremath{\textsc{right}_{\textsc{#1}}}} +\newcommand{\rdep}[1]{\ensuremath{\textsc{\sc right-}#1}} +%\newcommand{\reduce}[0]{\ensuremath{\textsc{\sc RED}}} +\newcommand{\reduce}[0]{\ensuremath{\textsc{reduce}}} +\newcommand{\shift}[0]{\ensuremath{\textsc{shift}}} +\newcommand{\racine}[0]{\ensuremath{\textsc{root}}} +\newcommand{\isracine}[1]{\ensuremath{\textsc{root}_{#1}}} +\newcommand{\eos}[0]{\ensuremath{\textsc{eos}}} +\newcommand{\iseos}[1]{\ensuremath{\textsc{eos}_{#1}}} +\newcommand{\emptyseq}[0]{\ensuremath{[]}} +\newcommand{\stack}[1]{\ensuremath{\sigma_{#1}}} +\newcommand{\buf}[1]{\ensuremath{\beta_{#1}}} +\newcommand{\depset}[0]{\ensuremath{\Delta}} + +\newcommand{\mdp}[0]{{\sc mdp}} +\usepackage{pgfplots} +\pgfplotsset{width=10cm,compat=1.9} + +\usetikzlibrary{arrows.meta, + calc, chains, + quotes, + positioning, + shapes.geometric} + + + + +%\input{QobiTree} + + +%\title[Syntaxe et Sémantique]{Syntaxe et Sémantique} +%\author{Alexis Nasr} +%\institute{} +%\date{} + + +%\input{LIFabreviations.tex} + + +\begin{document} + + %\newcommand{\stack}[1]{\ensuremath{\sigma_{#1}}} +%\newcommand{\buf}[1]{\ensuremath{\beta_{#1}}} +%\newcommand{\depset}[0]{\ensuremath{\Delta}} +%\newcommand{\blue}[1]{{\color{blue} #1}} +%\newcommand{\red}[1]{{\color{red} #1}} + + +\newcommand{\fm} [0] {{\color{blue}{\tt fm}}} +\newcommand{\mcf} [0]{{\color{blue}{\tt mcf}}} +\newcommand{\mcd} [0]{{\color{blue}{\tt mcd}}} +\newcommand{\cff} [0]{{\color{blue}{\tt cff}}} +\newcommand{\dico}[0]{{\color{blue}{\tt dico}}} +\newcommand{\cfw} [0]{{\color{blue}{\tt cfw}}} + + +\newcommand{\FORM} [0]{{\color{blue}{\tt FORM}}} +\newcommand{\CPOS} [0]{{\color{blue}{\tt CPOS}}} +\newcommand{\POS} [0]{{\color{blue}{\tt POS}}} +\newcommand{\LEMMA} [0]{{\color{blue}{\tt LEMMA}}} +\newcommand{\MORPHO} [0]{{\color{blue}{\tt MORPHO}}} +\newcommand{\GOV} [0]{{\color{blue}{\tt GOV}}} +\newcommand{\SLABEL} [0]{{\color{blue}{\tt LABEL}}} +\newcommand{\EOS} [0]{{\color{blue}{\tt EOS}}} +\newcommand{\AZ} [0]{{\color{blue}{\tt A \ldots Z}}} + + + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}{} + \begin{center} + {\Large Implémentation d'un analyseur en transitions} + \end{center} +\end{frame} + + + +\frame{\frametitle{Implémentation}\tableofcontents} + + + + +\section{Formats de fichiers} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}{Formats de fichiers} + \begin{itemize} + \item Multi Column File (\mcf{}) + \item Multi Column Description (\mcd{}) + \item Feature Model (\fm{}) + \item Vocabulaires (\dico{}) + \item Class Features File (\cff{}) + \end{itemize} +\end{frame} + + + +%\subsection{Multi Column File ({\tt mcf})} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Multi Column File (\mcf{})} + + Format de fichier qui permet de représenter les données textuelles et les annotations qui y sont attachées + + \begin{itemize} + + \item format ``en colonnes''~: + + \begin{itemize} + \item chaque ligne correspond à une unité textuelle minimale (token) + \item chaque colonne correspond à un attribut du token (par exemple son genre ou son nombre) + \end{itemize} + + \item les colonnes sont séparées les unes des autres par une tabulation + + \item le nombre de colonnes est illimité + + \item l'interprétation de chaque colonne est décrite dans un fichier \mcd{} (Multi Column Description) + + \item les lignes commençant par {\tt \#\#} sont ignorées + + \end{itemize} +\end{frame} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{\mcf{}~: exemple} +\footnotesize +\begin{verbatim} +La det le 1 det 0 +diane nc diane 1 suj 0 +chantait v chanter 0 root 0 +dans prep dans -1 mod 0 +la det le 1 det 0 +cour nc cour -2 obj 0 +des prep des -1 dep 0 +casernes nc caserne -1 obj 0 +. poncts . -6 eos 1 +Et coo et 0 root 0 +le det le 1 det 0 +vent nc vent 3 suj 0 +du prep du -1 dep 0 +matin nc matin -1 obj 0 +soufflait v souffler -5 dep_coord 0 +sur prep sur -1 mod 0 +les det le 1 det 0 +lanternes nc lanterne -2 obj 0 +. poncts . -9 eos 1 +\end{verbatim} +\normalsize +\end{frame} + +%\subsection{Multi Column Description ({\tt mcd})} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Multi Column Description (\mcd{})} + + Un fichier \mcd{} associe une {\bf étiquette} à chaque colonne d'un fichier \mcf{} + + \begin{itemize} + + \item Chaque ligne du fichier \mcd{} décrit une colonne du fichier \mcf{}. + \item Chaque ligne du fichier \mcd{} est formée de quatre colonnes~: + \begin{enumerate} + \item un entier indiquant la colonne décrite (à partir de {\tt 0}) + \item l'étiquette correspondant à la colonne (voir plus loin) + \item le type de la valeur s'y trouvant\\ +% \item Deux types sont définis~: + \begin{itemize} + \item {\tt SYM} indique que les valeurs sont des symboles + \item {\tt INT} indique que les valeurs sont des entiers +% \item {\tt EMB} indique que les valeurs sont des vecteurs de réels + \end{itemize} + \item le mot clef {\tt KEEP} ou {\tt IGNORE} +\begin{itemize} + \item {\tt KEEP} indique que la colonne est prise en compte + \item {\tt IGNORE} qu'elle ne l'est pas +\end{itemize} + + \end{enumerate} + \end{itemize} +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Etiquettes} + + \begin{itemize} + + \item Une étiquette permet de donner un nom explicite à une colonne + + \item Elles permettent d'accéder au contenu de la colonne à l'aide de {\it Word Features} + + \item On peut créer autant d'étiquettes que l'on veut + + \item Conventions + \begin{itemize} + \item {\tt \FORM{}} la forme du token + \item {\tt \POS{}} sa partie de discours + \item {\tt \LEMMA{}} son lemme + \item {\tt \MORPHO{}} traits morphologique (genre, nombre, temps, \ldots) + \item {\tt \GOV{}} la position relative de son gouverneur ($-n$ indique que le gouverneur se trouve n tokens à gauche, $n$ indique qu'il se trouve n tokens à droite) + \item {\tt \SLABEL{}} sa fonction syntaxique + \item {\tt \EOS{}} sa position dans la phrase (1 dernier mot de la phrase, 0 autre) + \end{itemize} + \end{itemize} +\end{frame} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{\mcd{} exemple} + + + \begin{itemize} + + \item un extrait du fichier \mcf{} + +\begin{verbatim} +La det le 1 det 0 +diane nc diane 1 suj 0 +chantait v chanter 0 root 0 +\end{verbatim} + + \item le fichier \mcd{} correspondant + +\begin{verbatim} +0 FORM SYM KEEP +1 POS SYM KEEP +2 LEMMA SYM IGNORE +3 GOV INT KEEP +4 LABEL SYM KEEP +5 EOS SYM KEEP +\end{verbatim} + +\item Convention, on nomme les fichiers \mcd{} selon les colonnes qu'ils définissent, par exemple {\tt FPLGSE.mcd} + + \end{itemize} +\end{frame} + + +%\subsection{Feature Model ({\tt fm})} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Features} + + \begin{itemize} + + \item Fonctions permettant d'accéder au contenu d'une configuration + + \item Deux types de Features~: + + \begin{enumerate} + + \item Word Features~: attributs des tokens, généralement présentes dans le fichier \mcd{} fourni en entrée à l'analyseur.\\ + Exemples~: + \begin{itemize} + \item les parties de discours (\POS{}) + \item la fin de phrase (\EOS{}) + \item \ldots + \end{itemize} + + \item Configuration Features~: features prédites pendant l'analyse ou pendant l'exécution de l'oracle.\\ + Exemples~: + \begin{itemize} + \item la distance entre le mot courant ({\tt B0}) et le mot en sommet de pile ({\tt S0}) + \item Le nombre d'éléments dans la pile + \item Le nombre de dépendants droits ou gauche du mot en sommet de pile + \item \ldots + \end{itemize} + + + +% \item Syntactic Features~: structure syntaxique déjà construite +% \item Distance Features~: distance entre certains mots +% \item Configurational Features~: autres informations (non linguistiques) sur la configuration + + \end{enumerate} + + + \end{itemize} +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Word features} + + Quadruplets (W, Conteneur, Position, Etiquette)~: + + \begin{enumerate} + \item Conteneur~: + \begin{itemize} + \item {\tt B} pour Buffer + \item {\tt S} pour Stack + \end{itemize} + \item Position + \begin{itemize} + \item pour {\tt B}~: + \begin{itemize} + \item {\tt 0} token courant + \item {\tt 1} token directement à droite de {\tt B 0} + \item {\tt 2} token directement à droite de {\tt B 1} + \item {\tt -1} token directement à gauche de {\tt B 0} + \item {\tt -2} token directement à gauche de {\tt B -1} + \item \ldots + \end{itemize} + \item pour {\tt S} + \begin{itemize} + \item {\tt 0} token au sommet de la pile + \item {\tt 1} token au dessous de {\tt S 0} dans la pile + \item \ldots + \end{itemize} + \end{itemize} + \item Etiquette, telle que définie dans un \mcd{} + \end{enumerate} +\end{frame} + + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{Configuration Feature} + \begin{itemize} + \item Quatre type de Configuration Feature + \begin{enumerate} + \item Distance entre un mot du buffer et un mot de la pile (en général mot courant dans le buffer et mot au sommet de pile) +\begin{verbatim} +C DIST B 0 S 0 +\end{verbatim} + \item Nombre de dépendants droits ou gauche d'un mot +\begin{verbatim} +C NLDEP S 0 +C NRDEP S 0 +\end{verbatim} +\item \label{} du dépendant le plus à gauche ou le plus à droite d'un mot +\begin{verbatim} +C LLDEP S 0 +C LRDEP S 0 +\end{verbatim} +\item taille de la pile +\begin{verbatim} +C SH +\end{verbatim} + + + \end{enumerate} + \end{itemize} +\end{frame} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Feature Model (\fm{})} + + \begin{itemize} + + \item Un fichier \fm{} définit un ensemble de Features qui vont permettre de décrire une configuration + \item Ces Features sont utilisées par le classifieur pour prédire le prochain mouvement + \item Chaque ligne d'un fichier \fm{} définit une Feature + \end{itemize} + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Exemple de fichier \fm{}} + +\begin{verbatim} +W B -2 POS +W B -1 POS +W B 0 POS +W B 1 POS +W B 2 POS +W S 0 POS +W S 1 POS +C DIST B 0 S 0 +C NLDEP S 0 +C NRDEP S 0 +C SH +C LLDEP S 0 +C LRDEP S 0 +\end{verbatim} +\end{frame} + + + +%%\subsection{Vocabulaires ({\tt dico})} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\begin{frame}[fragile]{Syntactic Features} +% \begin{tabular}{|l|l|}\hline +% \blue{\tt ldep\_s0r} & fonction du dépendant le plus à gauche de \blue{\tt s0}\\ \hline +% \blue{\tt rdep\_s0r} & fonction du dépendant le plus à droite de \blue{\tt s0}\\ \hline +% \blue{\tt ldep\_s1r} & fonction du dépendant le plus à gauche de \blue{\tt s1}\\ \hline +% \blue{\tt rdep\_s1r} & fonction du dépendant le plus à droite de \blue{\tt s1}\\ \hline +% \blue{\tt ndep\_s0} & nombre de dépendants de \blue{\tt s0}\\ \hline +% \end{tabular} +%\end{frame} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\begin{frame}[fragile]{Distance Features} +% +% \begin{itemize} +% \item \blue{\tt dist\_s0\_b0} linear distance between s0 and b0 +% \end{itemize} +%\end{frame} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%\begin{frame}[fragile]{Configurational Features} +% +% \begin{tabular}{|l|l|}\hline +%\blue{\tt sh} & number of elements in the stack\\ \hline \hline +%\blue{\tt t1} & code de la transition menant à la configuration courante\\ \hline +%\blue{\tt t2} & code de la transition précédant t1\\ \hline +%\blue{\tt t3} & code de la transition précédant t2\\ \hline +%\blue{\tt t4} & code de la transition précédant t3\\ \hline \hline +%\blue{\tt mvt0} & code de la première transition de meilleur poids\\ \hline +%\blue{\tt mvt1} & code de la deuxième transition de meilleur poids\\ \hline +%\blue{\tt mvt2} & code de la troisième transition de meilleur poids\\ \hline +%\blue{\tt mvt3} & code de la quatrième transition de meilleur poids\\ \hline \hline +%\blue{\tt delta1} & score(mvt0) - score(mvt1)\\ \hline +%\blue{\tt delta2} & score(mvt0) - score(mvt2)\\ \hline +%\blue{\tt delta3} & score(mvt0) - score(mvt3)\\ \hline +% \end{tabular} +%\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{\dico{}} + + \begin{itemize} + + \item Dictionnaire permettant de stocker les différentes valeurs possibles d'une Feature, sous la forme de couples (clé, valeur). + \item La clé correspond à une chaîne de caractère et la valeur à un entier (entiers successifs à partir de 0) + \item Un fichier \dico{} est composé~: + \begin{itemize} + \item d'une ligne de la forme {\tt \#\#FEAT} indiquant le début des valeurs possibles de {\tt FEAT} + \item de lignes comportant un symbole (les valeurs possible de {\tt FEAT}) + \end{itemize} + \item Un fichier \dico{} peut comporter plusieurs dictionnaires différents. + + +\end{itemize} +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Exemple de fichier \dico{}} + +\begin{verbatim} +##POS +NOUN +VERB +ADJ +##LABEL +nsubj +root +obj +##EOS +0 +1 +\end{verbatim} + +\end{frame} + +%\subsection{Class Features File ({\tt cff})} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Class Features File (\cff{})} + + \begin{itemize} + + \item Format utilisé pour entraîner les classifieurs de type réseaux de neurones + \item Première ligne : taille de la couche d'entrée + \item Deuxième ligne : taille de la couche de sortie + \item Puis alternance de~: + \begin{itemize} + \item valeur couche d'entrée + \item valeur couche de sortie + \end{itemize} + \item Représentation one-hot~: + \begin{itemize} + \item pour représenter la valeur 2 parmi 4 valeurs possible : {\tt 0 0 1 0} + \end{itemize} + \item Exemple +\begin{verbatim} +8 +2 +0 1 0 0 0 0 1 0 +1 0 +1 0 0 0 0 1 0 0 +0 1 +\end{verbatim} + \end{itemize} +\end{frame} + +\section{Les principaux outils} + + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}{Les principaux outils} + \begin{itemize} + \item {\tt mcf2cff} + \item {\tt tbp\_train} + \item {\tt tbp\_decode} + \item {\tt eval\_mcf} + \end{itemize} +\end{frame} + +%\subsection{\tt mcf2cff} + + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}{{\tt mcf2cff}} + + + {\bf description~:} + \begin{itemize} + \item Transforme des arbres syntaxiques en séquences de configurations et de mouvements à l'aide d'un oracle. + \end{itemize} + +{\bf entrées~:} + \begin{itemize} + \item un fichier \mcf{} annoté en syntaxe (colonnes \GOV{} et \SLABEL{}) + \item un fichier \fm{} décrivant les features utilisées pour la prédiction + \item un fichier \mcd{} décrivant la structure du fichier \mcf{} + \item un fichier \dico{} contenant les vocabulaires correspondant aux features utilisées et le vocabulaire des features du classifieur + \item le nombre minimal de mots à traiter + \end{itemize} + + {\bf sorties~:} + \begin{itemize} + \item un fichier \cff{} contenant les données pour l'apprentissage du classifieur + \end{itemize} + +\end{frame} + + +%\subsection{\tt tbp\_train} +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}{\tt tbp\_train} + + + {\bf description~:} + \begin{itemize} + \item Apprend un classifieur de type MLP au format keras à partir d'un fichier \cff{} + \item Les hyperparamètres du MLP sont représentés en dur dans le programme + \end{itemize} + + {\bf entrées~:} + \begin{itemize} + \item un fichier \cff{} + \end{itemize} + + {\bf sorties~:} + \begin{itemize} + \item un modèle au format keras/tensorFlow + \end{itemize} + +% {\bf description~:} +% \begin{itemize} +% \item Calcule un poids pour tout couple (couple, feature). +% \item Les poids sont stockés dans le fichier de sortie. +% \end{itemize} +\end{frame} + + +%\subsection{\tt tbp\_decode} +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}{{\tt tbp\_decode}} + + {\bf description~:} + \begin{itemize} + \item Réalise l'analyse syntaxique de phrases d'un fichier \mcf{} + \end{itemize} + + {\bf entrées~:} + \begin{itemize} + \item un fichier \mcf{} contenant le texte à analyser + \item un modèle keras + \item un fichier \dico{} contenant les vocabulaires correspondant aux features utilisées et le vocabulaire des features du classifieur + \item un fichier \fm{} contenant le modèle de features + \item un fichier \mcd{} décrivant la structure du fichier \mcf{} + \item le nombre minimal de mots à traiter + \end{itemize} + + {\bf sorties~:} + \begin{itemize} + \item un fichier \mcf{} avec deux colonnes supplémentaires pour \GOV{} et \SLABEL{} + \end{itemize} + +\end{frame} + +%\subsection{\tt eval\_mcf} +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}{\tt eval\_mcf} + + + {\bf description~:} + \begin{itemize} + \item Compare deux fichiers \mcf{} et calcule le Labeled Accuracy Score et le Unlabeled Accuracy Score + \end{itemize} + + {\bf entrées~:} + \begin{itemize} + \item un fichier \mcf{} de référence + \item un fichier \mcf{} hypothèse (dont les colonnes \GOV{} et \SLABEL{} ont été prédites) + \item un fichier \mcd{} pour la référence + \item un fichier \mcd{} pour l'hypothèse + \end{itemize} + + {\bf sorties~:} + \begin{itemize} + \item LAS et UAS du fichier hypothèse + \end{itemize} + +\end{frame} + + +\section{Les principales classes} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}{Les principales classes} + \begin{itemize} +\item {\tt Word.py} +\item {\tt WordBuffer.py} +\item {\tt Stack.py} +\item {\tt Config.py} +\item {\tt FeatModel.py} +\item {\tt Dico.py} +\item {\tt Dicos.py} +\item {\tt Mcd.py} +\item {\tt Moves.py} + \end{itemize} +\end{frame} + + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt Word} +\begin{minted}{python} +def __init__(self): + self.featDic = {} # dictionnaire dans lequel sont stockés les word features + self.leftDaughters = [] # liste des indices des dépendants gauches + self.rightDaughters = [] # liste des indices des dépendants droits + +def getFeat(self, featName) +def setFeat(self, featName, featValue) +def addLeftDaughter(self, index) +def addRightDaughter(self, index) +\end{minted} +\end{frame} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt WordBuffer} + +\begin{minted}{python} +def __init__(self, mcfFileName=None, mcd=None): + self.currentIndex = 0 + self.array = [] + self.mcd = mcd + self.mcfFile = None + +def empty(self) +def init(self, mcd) +def addWord(self, w) +def getLength(self) +def getCurrentIndex(self) +def getWord(self, index) +def getCurrentWord(self) +def readNextWord(self) +def readNextSentence(self) +def endReached(self) +\end{minted} + +\end{frame} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt Stack} + Les éléments de la pile sont des indices de mots et pas des références à des {\tt Word} +\begin{minted}{python} +def __init__(self): + self.array = [] + +def isEmpty(self) +def empty(self) +def push(self, elt) +def pop(self) +def top(self) +def getLength(self) +\end{minted} +\end{frame} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt Config} +\begin{minted}{python} +def __init__(self, filename, mcd, dicos): + self.wb = WordBuffer(filename, mcd) + self.st = Stack() + +def isFinal(self) +def getStack(self) +def getBuffer(self) +def fwd(self) +def shift(self) +def red(self) +def right(self, label) +def left(self, label) +def applyMvt(self, mvt) +def getWordFeat(self, featTuple) +def extractFeatVec(self, FeatModel) +\end{minted} +\end{frame} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt FeatModel} + En gros un tableau de features\\ + Permet aussi de calculer la taille du vecteur d'entrée du classifieur +\begin{minted}{python} +def __init__(self, featModFilename, dicos): + self.featArray = self.readFeatModelFile(featModFilename) + self.inputVectorSize = self.computeInputSize(dicos) + +def computeInputSize(self, dicos) +def getInputSize(self) +def getFeatArray(self) +def getNbFeat(self) +def getFeatContainer(self, featIndex) +def getFeatPosition(self, featIndex) +def getFeatLabel(self, featIndex) +def buildInputVector(self, featVec, dicos) +\end{minted} +\end{frame} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt Dico} + +Un {\tt Dico} permet d'associer des symboles et des entiers. + +\begin{minted}{python} +def __init__(self, name): + self.name = name + self.hash = {} + self.array = [] + +def add(self, symbol) +def getCode(self, symbol) +def getSymbol(self, code) +def getSize(self) +def printToFile(self, dicoFile) +\end{minted} +\end{frame} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt Dicos} + +Ensemble de \dico{}, chacun étant accessible à partir de son nom + +\begin{minted}{python} +def __init__(self, mcd=False, fileName=False): + self.content = {} + if mcd : + self.initializeWithMcd(mcd) + if fileName : + self.initializeWithDicoFile(fileName) + +def getDico(self, dicoName) +def addDico(self, dicoName) +def getCode(self, dicoName, symbol) +def getSymbol(self, dicoName, code) +def add(self, dicoName, symbol) +def populateFromMcfFile(self, mcfFilename, mcd) +def printToFile(self, filename) +\end{minted} +\end{frame} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt Mcd} + +Chaque colonne d'un {\tt Mcd} est un triplet {\tt (name, type, status)}. + +\begin{minted}{python} +def __init__(self, mcdFilename): + self.array = self.readMcdFile(mcdFilename) + +def readMcdFile(self, mcdFilename) +def getNbCol(self) +def getColName(self, colIndex) +def getColType(self, colIndex) +def getColStatus(self, colIndex) +def locateCol(self, name) +\end{minted} +\end{frame} + +%--------------------------DEBUT SLIDE-----------------------------% +\begin{frame}[fragile]{\tt Moves} + + Associe un code à une action\\ + Permet aussi de construire le vecteur de sortie pour le classifieur +\begin{minted}{python} +def __init__(self, dicos): + self.dicoLabels = dicos.getDico('LABEL') + if not self.dicoLabels : + print("cannot find LABEL in dicos") + exit(1) + self.nb = 2 * self.dicoLabels.getSize() + 3 + +def getNb(self) +def mvtCode(self, mvt) +def mvtDecode(self, mvt_Code) +def buildOutputVector(self, mvt) +\end{minted} +\end{frame} + + + + +\section{Installation et utilisation} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Dépot GIT} + +\begin{itemize} +\item Le code de l'analyseur, ainsi que les données et les scripts permettant de lancer des expériences se trouvent sur le dépôt GIT suivant~:\\ + \url{https://gitlab.lis-lab.fr/alexis.nasr/tbp.git} +\item Sa structure est la suivante~: + \begin{itemize} + \item {\tt src} contient tout le code + \item {\tt data} contient les données ( pas sur le git pour l'instant, mais sur la page du cours) + \item {\tt expe} + \begin{itemize} + \item un fichier \fm{} ({\tt basic.fm}) + \item un fichier {\tt Makefile} qui permet de lancer une expérience + \item un fichier \mcd{} ({\tt PGLE.mcd}) + \end{itemize} + +\end{itemize} + +\end{itemize} + + +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Le Makefile (de la mort)} + +\footnotesize +\begin{verbatim} +train_conll=../data/train_$(lang).conllu +train_proj_conll=./out/train_$(lang)_proj.conllu +train_mcf=./out/train_$(lang)_pgle.mcf +train_cff=./out/train_$(lang).cff +train_word_limit=40000 + +dev_conll=../data/dev_$(lang).conllu +dev_proj_conll=./out/dev_$(lang)_proj.conllu +dev_mcf=./out/dev_$(lang)_pgle.mcf +dev_cff=./out/dev_$(lang).cff +dev_word_limit=5000 + +test_conll=../data/test_$(lang).conllu +test_mcf=./out/test_$(lang)_pgle.mcf +test_mcf_hyp=./out/test_$(lang)_hyp.mcf +test_word_limit=700 + +feat_model=basic.fm + +dicos=./out/$(lang)_train.dic +model=./out/$(lang).keras +results = ./out/$(lang).res + +mcd_pgle=PGLE.mcd +\end{verbatim} +\normalsize +\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Le Makefile (de la mort)} + +\tiny +\begin{verbatim} +eval: $(test_mcf_hyp) + python3 ../src/eval_mcf.py $(test_mcf) $(test_mcf_hyp) $(mcd_pgle) $(mcd_pgle) $(lang) > $(results) + +$(test_mcf_hyp): $(test_mcf) $(model) + python3 ../src/tbp_decode.py $(test_mcf) $(model) $(dicos) $(feat_model) $(mcd_pgle) $(test_word_limit) > $(test_mcf_hyp) + +$(model): $(train_cff) $(dev_cff) + python3 ../src/tbp_train.py $(train_cff) $(dev_cff) $(model) + +$(train_cff): $(train_mcf) $(dicos) + python3 ../src/mcf2cff.py $(train_mcf) $(feat_model) $(mcd_pgle) $(dicos) $(train_cff) $(train_word_limit) + +$(dev_cff): $(dev_mcf) $(dicos) + python3 ../src/mcf2cff.py $(dev_mcf) $(feat_model) $(mcd_pgle) $(dicos) $(dev_cff) $(dev_word_limit) + +$(train_mcf): $(train_proj_conll) + python3 ../src/conll2mcf.py $(train_proj_conll) $(mcd_pgle) > $(train_mcf) + +$(dev_mcf): $(dev_proj_conll) + python3 ../src/conll2mcf.py $(dev_proj_conll) $(mcd_pgle) > $(dev_mcf) + +$(test_mcf): + python3 ../src/conll2mcf.py $(test_conll) $(mcd_pgle) > $(test_mcf) + +$(train_proj_conll): + python3 ../src/remove_non_projective_sentences_from_conll.py $(train_conll) > $(train_proj_conll) + +$(dev_proj_conll): + python3 ../src/remove_non_projective_sentences_from_conll.py $(dev_conll) > $(dev_proj_conll) + +$(dicos): $(train_mcf) + python3 ../src/create_dicos.py $(train_mcf) $(mcd_pgle) $(dicos) + +\end{verbatim} +\normalsize +\end{frame} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{frame}[fragile]{Utilisation} + + pré-requis~: + + \begin{itemize} + \item une machine avec python et keras + \item accès à collab + \end{itemize} + + +Installation et exécution~: +\footnotesize +\begin{verbatim} +git clone https://gitlab.lis-lab.fr/alexis.nasr/tbp.git +cd tbp +wget http://pageperso.lif.univ-mrs.fr/~alexis.nasr/Ens/TLNL/data.tgz +tar xvfz data.tgz +cd expe +make lang=fr +\end{verbatim} +\normalsize +\end{frame} + +\end{document} diff --git a/src/mcf2cff.py b/src/mcf2cff.py index a0cfd2881d9f900cbbdd4e26938acc2ad45332c9..3e34b47e79ef4dccfce1926bfb6f6bbdf73bb7a6 100644 --- a/src/mcf2cff.py +++ b/src/mcf2cff.py @@ -48,7 +48,7 @@ def prepareData(mcd, mcfFile, featModel, moves, filename, wordsLimit) : inputVector = featModel.buildInputVector(featVec, dicos) # np.savetxt(dataFile, inputVector, fmt="%s", delimiter=' ', newline=' ') # dataFile.write('\n') - np.savetxt(dataFile, [code], fmt="%s", delimiter=' ', newline=' ') + np.savetxt(dataFile, [code], fmt="%s", delimiter=' ', newline='\n') np.savetxt(dataFile, inputVector, fmt="%s", delimiter=' ', newline=' ') dataFile.write('\n') diff --git a/src/tbp_train_pytorch.py b/src/tbp_train_pytorch.py index 1bc52fef82309c714a446b6237cad79806913ef1..314948443c060006198f0fe6c1dbd9241aa46109 100644 --- a/src/tbp_train_pytorch.py +++ b/src/tbp_train_pytorch.py @@ -20,7 +20,7 @@ def readData(dataFilename) : outputSize = int(dataFile.readline()) print("output size = ", outputSize) - inputLine = True + inputLine = True # indicates whether the current line is an input line (configuration) or an output line (movement) for ligne in dataFile: # print(ligne) vector = ligne.split()