[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: RE : [sdx-developers] Re: RE : [sdx-users] Analyseur arabe
From: |
Pierrick Brihaye |
Subject: |
Re: RE : [sdx-developers] Re: RE : [sdx-users] Analyseur arabe |
Date: |
Tue, 18 Nov 2003 12:01:48 +0100 |
User-agent: |
Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.0.2) Gecko/20030208 Netscape/7.02 |
Re,
Rasik Pandey a écrit:
Ça marche déjà dans la manière que tu décris, non?
Mmmh... pas sûr :
Imaginons le texte :
"veryverylong"
1 10
Tokenisé en :
"short"
originalTextAtTokenPosition = text.substring(startOffset, endOffset);
Si l'analyseur renvoie :
startOffset = 1
et
endOffset = 12
originalTextAtTokenPosition = "veryverylong"
... ce sera OK. S'il renvoie autre chose... ça ne marchera plus.
Ignorons ce problème pour l'instant (mais il finira pas se poser) : je
vais m'assurer que les offsets sont renvoyés par mon analyseur sont bien
ceux du flux d'origine.
Par contre, on peut régler assez vite une bonne partie du problème avec
l'exemple suivant (en UTF-8, obtenu grâce à xsp2sdxX, car xsp2sdx a du
mal avec le bidi) :
<qurantext>
كَلَّا سَنَكْتُبُ
<sdx:hilite no="6" term="write">سَنَكْتُبُ</sdx:hilite>
مَا يَقُولُ وَنَمُدُّ لَهُ مِنَ الْعَذَابِ مَدًّا
</qurantext>
Si ça ne passe pas, tant pis : je vous donne une version "fictive" du
même exemple (rappelez-vous qu'on est en right-to-left) :
<qurantext>
word2 word1
<sdx:hilite no="6" term="write">word2</sdx:hilite>
word8 word7 word6 wxord5 word4 word3
</qurantext>
On voit qu'on a 2 fois word2.
Supposons que les offsets de "word1" soient égaux à 1/5
et que ceux de "word2" soient égaux à 7/11
while ((token = stream.next()) != null)
1ère itération :
startOffset = 1
endOffset = 5
originalTextAtTokenPosition = "word1"
if (startOffset > lastEndOffset) est satisfait (lastEndOffset = 0)
char[] chars = text.substring(0, 1).toCharArray() = ""
on n'envoie pas cette chaîne vide au consumer -> ""
String termText = "analysis_of_word1"
if (Utilities.checkString(termText) &&
!termText.equals(lastHilitedTermFromText) && this.terms != null &&
this.terms.contains(termText))
n'est pas satisfait car this.terms.contains("analysis_of_word1") est faux
else if (startOffset >= lastEndOffset) est satisfait
char[] chars2 = originalTextAtTokenPosition.toCharArray() = "word1"
on envoie "word1" au consumer -> "word1"
lastEndOffset = 5
2ème itération :
startOffset = 7
endOffset = 11
originalTextAtTokenPosition = "word2"
if (startOffset > lastEndOffset) est satisfait
char[] chars = text.substring(5, 7).toCharArray() = " "
on envoie " " au consumer -> "word1 "
String termText = "first_analysis_of_word2"
if (Utilities.checkString(termText) &&
!termText.equals(lastHilitedTermFromText) && this.terms != null &&
this.terms.contains(termText))
n'est pas satisfait car this.terms.contains("first_analysis_of_word2")
est faux
else if (startOffset >= lastEndOffset) est satisfait
char[] chars2 = originalTextAtTokenPosition.toCharArray() = "word2"
on envoie "word2" au consumer -> "word1 word2"
lastEndOffset = 11
3ème itération du while :
startOffset = 7 //on est toujours sur le même offset !
endOffset = 11 //on est toujours sur le même offset !
originalTextAtTokenPosition = "word2" //et sur le même texte original !
if (startOffset > lastEndOffset) n'est pas satisfait
on n'envoie rien au consumer (toujours "word1 word2")
String termText = "second_analysis_of_word2"
if (Utilities.checkString(termText) &&
!termText.equals(lastHilitedTermFromText) && this.terms != null &&
this.terms.contains(termText))
est satisfait car this.terms.contains("second_analysis_of_word2") est
satisfait
highlightTerm(originalTextAtTokenPosition, termText);
on envoie le highlite au consumer -> "word1 word2<sdx:hilite no="6"
term="second_analysis_of_word2">word2</sdx:hilite>"
lastHilitedTermFromText = "second_analysis_of_word2";
else if (startOffset >= lastEndOffset) n'est pas exécuté (car le if
précédent l'a été)
lastEndOffset = 11 //encore :-)
Je m'arrête là pour l'instant ; le consumer a reçu :
word1 word2<sdx:hilite no="6"
term="second_analysis_of_word2">word2</sdx:hilite>
Car c'est la deuxième anlyse qui matche la query. Si ça avait été la
première, on aurait eu :
word1 <sdx:hilite no="6"
term="second_analysis_of_word2">word2</sdx:hilite>word2
S'il n'y en avait eu qu'une, matchant la query, on aurait eu :
word1 <sdx:hilite no="6" term="second_analysis_of_word2">word2</sdx:hilite>
ce qui aurait été OK.
S'il n'y en avait eu qu'une ne matchant pas la query (comme ça a été le
cas pour "word1"), on aurait eu :
word1 word2
ce qui aurait été OK.
Il faudrait donc s'assurer que le token n'est émis qu'une seule fois.
Voilà. L'analyse est encore à pousser mais en gros, c'est là qu'est le
problème.
A+
--
Pierrick Brihaye, informaticien
Service régional de l'Inventaire
DRAC Bretagne
mailto:address@hidden