sdx-developers
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]