30
Outils pour le traitement des textes Commandes Unix pour traiter les ressources linguistiques Éric Laporte Université Paris-Est Marne-la-Vallée

Outils pour le traitement des textes Commandes Unix pour traiter les ressources linguistiques

Embed Size (px)

DESCRIPTION

Outils pour le traitement des textes Commandes Unix pour traiter les ressources linguistiques. É ric Laporte Université Paris-Est Marne-la-Vallée. Sommaire. Objectifs Visualiser un échantillon head, tail, less, iconv, sed Extraire des entrées grep Changer de format sed. - PowerPoint PPT Presentation

Citation preview

Outils pour le traitement des textes

Commandes Unix pour traiter les ressources linguistiques

Éric Laporte

Université Paris-Est Marne-la-Vallée

Sommaire

Objectifs

Visualiser un échantillon

head, tail, less, iconv, sed

Extraire des entrées

grep

Changer de format

sed

Commandes Unix pour traiter les ressources linguistiques

Avantages

Disponibles sur tout environnement Unix

Simples : scripts sans déclaration de structures de données, sinon mieux vaut utiliser perl, python, java...

Inconvénients

Toutes les versions ne font pas la même chose, donc faire des tests...

Parfois incompatibles avec UTF-16 (Unitex)

Seule structure de données : la ligne ; donc incompatible avec XML

Objectifs

Visualiser un échantillon

Extraire des entrées d'un lexique

Traitement de certaines entrées

Changer de format

Corpus étiqueté par TreeTagger --> Unitex

Construire l'index d'un ensemble de tables

Index pour les linguistes

Construire une table de classes

Visualiser un échantillon

head -30 lexique.lstextraire les 30 premières lignes

tail -30 lexique.lstextraire les 30 dernières lignes

less -20 lexique.lstvisualiser 20 lignes par 20

Vérifier le codage des caractères, le format des entrées... sur quelques exemples

Transcoder

La plupart des commandes Unix fonctionnent bien en UTF-8

iconv -f UTF-16LE -t UTF-8 lex16.lst > lex8.lst

Dans quel codage sont les caractères d'un fichier texte ?- Ouvrir le fichier avec Notepad++ et observer dans le menu Encodage quelle ligne est cochée : elle indique le codage utilisé.- Ou bien ouvrir le fichier avec MSWord ou Open Office, cliquer sur des lignes de la liste de codages, et vérifier à chaque fois dans l'aperçu si la visualisation correspondante est correcte.

Transcoder

iconv -f UTF-16LE -t UTF-8 lex16.lst > lex8.lst

Liste des codages disponibles :iconv -l

Codage utilisé par Unitex :UTF16-LE

Codages particuliers : script sedsed -f accents.sed corpus8.txt > corpus-latex.txt

Commande de substitution sed : s///g

sed

s+''\([^']\)+{''}\1+g s+à+\\`{a}+g s+à+\\`{a}+g s+â+\\^{a}+g s+é+\\'{e}+g s+è+\\`{e}+g s+ê+\\^{e}+g s+ë+\\"{e}+g s+î+\\^{\\i}+g s+ï+\\"{\\i}+g s+ô+\\^{o}+g s+ù+\\`{u}+g s+û+\\^{u}+g s+ü+\\"{u}+g s+ç+\\c{c}+g s+oe+{\\oe}+g

sed

Séparateur de champs : n'importe quel caractère qui n'apparaît pas dans les champs s+é+\\'{e}+g s/é/\\'{e}/g s:é:\\'{e}:g s!é!\\'{e}!g

Si on omet le g à la fin, la substitution est faite au plus une fois par ligne, à la première occurrence

Extraire des entrées

Extraire des entrées d'un lexique

egrep "+hum" lexique.lst > hum.lst

extraire les entrées de noms marqués comme désignant des personnes

egrep -c "+hum" lexique.lst

compter ces entrées

egrep -v "+hum" lexique.lst > non-hum.lst

extraire les entrées non marquées comme désignant des personnes

grep, egrep

Vérifier le format des entréesegrep -v "^[^,.]*,[^,.]*\.[^,.]*$" lexique.lst

Syntaxe interne aux lignes

Rechercher des contre-exemples

Entrées qui n'ont pas exactement les deux délimiteurs attendus dans l'ordre attendu

Expressions rationnelles possibles

fgrep

Extraire les entrées de certains motsfgrep voici lex.lst

fgrep -f liste-nue.lst lex.lst > sous-lex.lst

Aucune expression rationnelle possible

Extraire une intersection

Extraire les participes passés pour lesquels il existe aussi une entrée comme adjectif (poli)fgrep :Kms delaf.lst > Kms-0.lst

abaissé,abaisser.V+z1:Kms

abalourdi,abalourdir.V+z3:Kms

abandonné,abandonner.V+z1:Kms

abasourdi,abasourdir.V+z2:Kms

cut -d , -f 1 Kms-0.lst > Kms.lstabaissé

abalourdi

abandonné

abasourdi

egrep "\.A.*:ms" delaf.lst > A.lst

fgrep -f Kms.lst A.lst > Kms-inter-A.lst

cut

Extraire de chaque ligne un ou plusieurs champsabaissé,abaisser.V+z1:Kms

abalourdi,abalourdir.V+z3:Kms

abandonné,abandonner.V+z1:Kms

abasourdi,abasourdir.V+z2:Kms

cut -d , -f 1 Kms-0.lst > Kms.lstabaissé

abalourdi

abandonné

abasourdi

Les champs sont numérotés à partir de 1

fgrep :Kms delaf.lst | cut -d , -f 1 > Kms.lst

fgrep

Extraire les participes passés pour lesquels il existe aussi une entrée comme adjectif (poli)fgrep :Kms delaf.lst | cut -d , -f 1 > Kms.lst

abaissé

abalourdi

abandonné

abasourdi

egrep "\.A.*:ms" delaf.lst > A.lst

fgrep -f Kms.lst A.lst > Kms-inter-A.lst

Ce script extrait abolitionniste car aboli est un participe passé

fgrep

fgrep -f Kms.lst A.lst > Kms-inter-A.lst

Le script extrait abolitionniste car aboli est un participe passé

Kms.lstablutionné

aboli

abominé

abondé

A.lstablatif,.A+z2:ms

aboli,.A+z3:ms

abolitionniste,.A+z1:ms:fs

abominable,.A+z1:ms:fs

Kms-inter-A.lstabîmé,.A+z1:ms

aboli,.A+z3:ms

abolitionniste,.A+z1:ms:fs

abonné,.A+z1:ms

fgrep

fgrep -f Kms-1.lst A-0.lst > Kms-inter-A-1.lst

Le script n'extrait pas abolitionniste

Kms-1.lst{ablutionné,

{aboli,

{abominé,

{abondé,

A-0.lst{ablatif,.A+z2:ms}

{aboli,.A+z3:ms}

{abolitionniste,.A+z1:ms:fs}

{abominable,.A+z1:ms:fs}

Kms-inter-A-1.lst{abîmé,.A+z1:ms}

{aboli,.A+z3:ms}

{abonné,.A+z1:ms}

{abordé,.A+z3:ms}

sed

Extraire les participes passés pour lesquels il existe aussi une entrée comme adjectif (poli)

Délimiter les champssed -e "s/.*/{&}/" A.lst > A-0.lst

{aalénien,.A+z3:ms}

{abactérien,.A+z3:ms}

{abaissable,.A+z2:ms:fs}

{abaissant,.A+z2:ms}

sed -e "s/.*/{&,/" Kms.lst > Kms-1.lst{abaissé,

{abalourdi,

{abandonné,

{abasourdi,

fgrep -f Kms-1.lst A-0.lst > Kms-inter-A-1.lst

Ce script n'extrait pas abolitionniste

sed

sed -e "s/.*/{&}/" A.lst > A-0.lst{aalénien,.A+z3:ms}

{abactérien,.A+z3:ms}

{abaissable,.A+z2:ms:fs}

{abaissant,.A+z2:ms}

Expressions rationnelles dans le premier champ de s///

& dans le deuxième champ : la séquence reconnue par le premier champ

s/// si on veut reconnaître un seul motif par ligne

Extraire une différence

Extraire les participes passés pour lesquels il n'existe pas d'entrée comme adjectif (fallu)egrep "\.A.*:ms" delaf.lst | cut -d, -f1 |

sed -e "s/.*/{&,/" > A.lst

fgrep :Kms delaf.lst | sed -e "s/.*/{&}/" > Kms.lst{abaissé,abaisser.V+z1:Kms}

{abalourdi,abalourdir.V+z3:Kms}

{abandonné,abandonner.V+z1:Kms}

{abasourdi,abasourdir.V+z2:Kms}

fgrep -v -f A.lst Kms.lst > K-sauf-A.lst{abalourdi,abalourdir.V+z3:Kms}

{abcédé,abcéder.V+z3:Kms}

{abdiqué,abdiquer.V+z1:Kms}

{abeausi,abeausir.V+z3:Kms}

Changer de format

Changer de format par des substitutionssed -f treetagger2unitex.sed treetagger.txt > unitex.txt

Passer du format de sortie de TreeTagger au format d'entrée d'Unitex (tagged text)

France NAM France

: PUN :

la DET:ART le

nouvelle ADJ nouveau

génération NOM génération

{France,France.N+PR} : {la,le.DET} {nouvelle,nouveau.A}

{génération,génération.N}

sed

treetagger.txt : la DET:ART le

unitex.txt : {la,le.DET}

Scripts sedsed -f treetagger2unitex.sed treetagger.txt > unitex.txt

# treetagger2unitex.sed

s/DET:ART/.DET/

# remplacer DET:ART par .DET

avant : la DET:ART le

après : la .DET le

sed

Reconnaître des séquences ambiguëstreetagger.txt : ? SENT ?unitex.txt : ?{S}

SENT : code (sentence) ou mot (sentir) ?

Utiliser les délimiteurs de champss/\tSENT\t/{S}\t/

avant : ? SENT ?

après : ?{S} ?

Le délimiteur peut être différent pour chaque champS'il le faut, introduire des délimiteurs de champs

sed

Séquences ambiguëstreetagger.txt : ? SENT ?

unitex.txt : ?{S}

SENT : code (sentence) ou mot (sentir) ?

Rechercher des exemples de la séquence pour voir si le problème se pose réellementegrep "SENT" treetagger.txt > auxiliaire.lst

sed

Changer de délimiteurstreetagger.txt : génération NOM génération

unitex.txt : {génération,génération.N}

s/\t/,/avant : génération.N génération

après : génération.N,génération

Dans les substitutions qui viennent ensuite, les tabulations ont déjà été remplacées par des virgulesLe fait d'avoir des substitutions successives introduit une confusion entre niveaux :- virgule du texte ?- virgule-délimiteur ?

sed

Substitutions successivestreetagger.txt : génération NOM génération

unitex.txt : {génération,génération.N}

Utiliser des délimiteurs de champs non ambiguss/\t/\t,/

avant : génération.N génération

après : génération.N ,génération

Le délimiteur "\t," est moins ambigu que ","

sed

Déplacer, intervertir des champstreetagger.txt : la DET:ART le

unitex.txt : {la,le.DET}

Utiliser les délimiteurs de champss/\.\([^.,\t]\+\)\t,\([^.,\t]\+\)$/,\2.\1/

avant : la.DET ,le

après : la,le.DET

Reconnaître les fins de lignes$ fin de ligne

sed

Reconnaître les débuts et fins de lignes

.* toute la ligne^ début de ligne$ fin de ligne

sed

Copier un champtreetagger.txt : la DET:ART le

unitex.txt : {la,le.DET}

Utiliser les délimiteurs de champs

s/.*/{&}/

avant : la,le.DET

après : {la,le.DET}

Copier& (dans la zone sortie, copie de la zone reconnue)

sed

Caractères spéciaux dans le premier champ mais pas dans le deuxième

* ^ $ [ .

s/\.\([^.,\t]\+\)\t,\([^.,\t]\+\)$/,\2.\1/

Séquences spéciales dans le premier champ\+ \? \{ \} \( \)