AraMorph

the AraMorph site
 
   

Utilisation dans Lucene

L'analyseur arabe pour Lucene

Exécutons le code suivant :

java -cp build/ArabicAnalyzer.jar;lib/commons-collections.jar;lib/lucene-1.4.3.jar ¶
gpl.pierrick.brihaye.aramorph.test.TestArabicAnalyzer ¶
src/java/gpl/pierrick/brihaye/aramorph/test/testdocs/ktAb.txt CP1256 results.txt UTF-8
		
Warning
Naturellement, l'encodage du fichier d'entrée doit être paramétré convenablement.

Examinons le fichier de sortie results.txt :

كِتاب	NOUN	[0-4]	1
كُتّاب	NOUN	[0-4]	0	
		

Le principe est donc le suivant : chaque radical pertinent retourne un token au sens où l'entend Lucene. Ici apparaissent le texte du token (termText), sa catégorie grammaticale, sa position dans le flux d'entrée (startOffset et endOffset) et sa position relative par rapport au token précédent (positionIncrement).

Il faut en effet attirer l'attention sur le fait qu'un même mot arabe, parce qu'il est généralement réduit à son squelette consonnantique, donne souvent lieu à plusieurs solutions.

Fixme (PB)
Quand bien même le texte serait vocalisé, les voyelles ne sont malheureusement pas prises en compte pour lever les ambiguités d'analyse. La résolution de ce problème est à l'étude.
Note
Dans cet exemple, le texte des tokens est en arabe, mais pour des raisons de performance, il vaut sans doute mieux retourner des tokens translitérés selon le système de Buckwalter en ne spécifiant pas d'encodage de sortie pour le fichier de résultats.
Warning
Dans cet exemple, et bien que كتاب ait 3 solutions, on ne retourne que 2 tokens. En effet, كُتّاب est présent par 2 fois, la première en tant que pluriel de كاتب, la seconde en tant que nom singulier valant pour école coranique.
Fixme (PB)
Que faire si un même texte de token renvoie des catégories grammaticales différentes ? Etant donné que les index Lucene perdent l'information de type, ce problème n'en est peut-être pas un.

Essayons un autre exemple avec un fichier tktbn.txt contenant le mot تكتبن :

java -cp build/ArabicAnalyzer.jar;lib/commons-collections.jar;lib/lucene-1.4.3.jar ¶
gpl.pierrick.brihaye.aramorph.AraMorph ¶
src/java/gpl/pierrick/brihaye/aramorph/test/testdocs/tktbn.txt CP1256 results.txt UTF-8

Examinons le fichier de sortie results.txt :

Processing token : 	?????

SOLUTION #3
Lemma  : 	>akotab
Vocalized as : 	tukotibna
Morphology : 
	prefix : IVPref-Antn-tu
	stem : IV_yu
	suffix : IVSuff-n
Grammatical category : 
	prefix : tu	IV2FP
	stem : kotib	VERB_IMPERFECT
	suffix : na	IVSUFF_SUBJ:FP
Glossed as : 
	prefix : you [fem.pl.]
	stem : dictate/make write
	suffix : [fem.pl.]


SOLUTION #4
Lemma  : 	>akotab
Vocalized as : 	tukotabna
Morphology : 
	prefix : IVPref-Antn-tu
	stem : IV_Pass_yu
	suffix : IVSuff-n
Grammatical category : 
	prefix : tu	IV2FP
	stem : kotab	VERB_IMPERFECT
	suffix : na	IVSUFF_SUBJ:FP
Glossed as : 
	prefix : you [fem.pl.]
	stem : be dictated
	suffix : [fem.pl.]


SOLUTION #2
Lemma  : 	katab
Vocalized as : 	tukotabna
Morphology : 
	prefix : IVPref-Antn-tu
	stem : IV_Pass_yu
	suffix : IVSuff-n
Grammatical category : 
	prefix : tu	IV2FP
	stem : kotab	VERB_IMPERFECT
	suffix : na	IVSUFF_SUBJ:FP
Glossed as : 
	prefix : you [fem.pl.]
	stem : be written/be fated/be destined
	suffix : [fem.pl.]


SOLUTION #1
Lemma  : 	katab
Vocalized as : 	takotubna
Morphology : 
	prefix : IVPref-Antn-ta
	stem : IV
	suffix : IVSuff-n
Grammatical category : 
	prefix : ta	IV2FP
	stem : kotub	VERB_IMPERFECT
	suffix : na	IVSUFF_SUBJ:FP
Glossed as : 
	prefix : you [fem.pl.]
	stem : write
	suffix : [fem.pl.]	
		

Ici, le découpage en préfixe(s), radical et suffixe(s) devient très apparent.

Rappel
En fonction de ses catégories grammaticales, AraMorph peut avoir ventilé plusieurs préfixes (vers la gauche) et/ou suffixes (vers la droite) depuis le radical. En d'autres termes, le découpage grammatical est peut être différent du découpage morphologique déduit des dictionnaires.

Pour bien comprendre que l'analyse ne retourne que le radical :

java -cp build/ArabicAnalyzer.jar;lib/commons-collections.jar;lib/lucene-1.4.3.jar ¶
gpl.pierrick.brihaye.aramorph.test.TestArabicAnalyzer ¶
src/java/gpl/pierrick/brihaye/aramorph/test/testdocs/tktbn.txt results.txt
		

Examinons le fichier de sortie results.txt :

kotub	VERB_IMPERFECT	[0-5]	1
kotab	VERB_IMPERFECT	[0-5]	0
kotib	VERB_IMPERFECT	[0-5]	0
		

On constate que l'on obtient bien les radicaux des différentes formes que peut recouvrir la racine كتب pour un verbe à l'inaccompli. Ainsi, selon ce système, l'analyse d'un verbe à la deuxième personne du féminin pluriel de l'inaccompli est la même que celle de toute autre personne au même temps.

Note
Cette implémentation peut tout à fait être rediscutée !

Le glosseur anglais pour Lucene

Exécutons le code suivant :

java -cp build/ArabicAnalyzer.jar;lib/commons-collections.jar;lib/lucene-1.4.3.jar ¶
gpl.pierrick.brihaye.aramorph.test.TestArabicGlosser ¶
src/java/gpl/pierrick/brihaye/aramorph/test/testdocs/ktAb.txt CP1256 results.txt UTF-8
		
Warning
Naturellement, l'encodage du fichier d'entrée doit être adapté à votre plate-forme.

Examinons le fichier de sortie results.txt :

kuttab	NOUN	[0-4]	1
village	NOUN	[0-4]	0
school	NOUN	[0-4]	0
quran	NOUN	[0-4]	0
school	NOUN	[0-4]	0
authors	NOUN	[0-4]	0
writers	NOUN	[0-4]	0
book	NOUN	[0-4]	0
		

Ici, le principe est strictement le même si ce n'est que les glosses sont elles-mêmes tokenisées par le WhitespaceFilter avant d'intégrer la chaîne de traitement standard de Lucene (StandardFilter, LowerCaseFilter et StopFilter).

Note
Le type de token est le type du radical arabe analysé ; il va de soi que le type de mot anglais peut être différent.
Note
Cette implémentation peut tout à fait être rediscutée !

Quelles sont les solutions retenues par les analyseurs et les glosseurs ?

Comme on peut le voir, les analyseurs renvoient des tokens dont le type est la catégorie grammaticale du radical.
Cependant, un analyseur considèrera certains types comme attribuables à des mots vides et ne renverra aucun token lorsqu'il les rencontrera ; il les filtrera. La liste des catégories grammaticales considérées comme non signifiantes est décrite ci-après :

  • DEM_PRON_F
  • DEM_PRON_FS
  • DEM_PRON_FD
  • DEM_PRON_MD
  • DEM_PRON_MP
  • DEM_PRON_MS
  • DET
  • INTERROG
  • NO_STEM
  • NUMERIC_COMMA
  • PART
  • PRON_1P
  • PRON_1S
  • PRON_2D
  • PRON_2FP
  • PRON_2FS
  • PRON_2MP
  • PRON_2MS
  • PRON_3D
  • PRON_3FP
  • PRON_3FS
  • PRON_3MP
  • PRON_3MS
  • REL_PRON

A contrario, voici la liste des catégories grammaticales considérées comme signifiantes :

  • ABBREV
  • ADJ
  • ADV
  • NOUN
  • NOUN_PROP
  • VERB_IMPERATIVE
  • VERB_IMPERFECT
  • VERB_PERFECT
  • NO_RESULT
    Warning
    Résultat conservé dans la mesure où l'expérience semble montrer qu'il y a de fortes chances qu'il soit un mot étranger absent du dictionnaire. Il est naturellement tout à fait possible d'écrire un filtre Lucene spécifique pour affiner l'analyse de ce type de token.
Rappel
Les explications sur les catégories grammaticales sont disponibles dans cette rubrique.
Note
Cette implémentation peut tout à fait être rediscutée !