next up previous
suivant: Exemple avec une chaîne monter: Extraction d'information avec des précédent: Le script de pré-traitement

Exemple d'extraction d'informations avec un transducteur

Les transducteurs permettent d'extraire facilement de l'information d'une chaîne de caractères ou d'un langage régulier (ensemble de chaînes).

Par exemple, si l'on souhaite extraire tous les nombres d'une chaîne ou d'un texte, il suffit de faire un automate qui traduit un nombre quelconque en lui-même et traduit toute autre chose en la chaîne vide epsilon. Comme le transducteur ne spécifie pas lequel des nombres doit être conservé s'il y en a plusieurs dans la chaîne, il permettra d'extraire tous les nombres.

Voyons la machine qu'il faut écrire. Le fichier s'appelle extractnb.grm.

export alphabet = Optimize["0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"|
       "a"|"b"|"c"|"d"
       	 | "e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"
	 |"v"|"w"|"x"|"y"|"z" | " "];

export chiffre = Optimize["0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"];

export chiffre_id = Optimize[("0":"0")|("1":"1")|("2":"2")|("3":"3")|("4":"4")|("5":"5")|("6":"6")|("7":"7")|("8":"8")|("9":"9")];

export pas_chiffre = alphabet - chiffre;

pre_extract_chiffre = (alphabet : "")* (pas_chiffre:"") (chiffre_id+)
		(pas_chiffre:"")(alphabet : "")*;

export extract_chiffre = Optimize[pre_extract_chiffre];

export chaine_test_1 = " ab t 123 zaetrt 58 dsfghhj 589 dsqd";

export result = Optimize[Project[Compose[chaine_test_1,extract_chiffre,'right'],
	'output']];

Et voici les commandes pour compiler et afficher le résultat.

open@6ed7fd996340:~> thraxmakedep extractnb.grm 
open@6ed7fd996340:~> make
thraxcompiler --input_grammar=extractnb.grm --output_far=extractnb.far
Evaluating rule: alphabet
Evaluating rule: chiffre
Evaluating rule: chiffre_id
Evaluating rule: pas_chiffre
Evaluating rule: pre_extract_chiffre
Evaluating rule: extract_chiffre
Evaluating rule: chaine_test_1
Evaluating rule: result
open@6ed7fd996340:~> farextract extractnb.far
open@6ed7fd996340:~> fst_printstrings --byte --acceptor result
123
58
589
open@6ed7fd996340:~>

Notez que l'expression régulière (alphabet : "")* utilisée en début et en fin du transducteur extract_chiffre permet d'effacer aussi bien des nombres que ce qui n'est pas des nombres.



barthe 2018-01-30