IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> "Parsage" un peu délicat en C (ou C++), le dico français d'OpenOffice
Options
schlum
posté 5 Aug 2004, 13:47
Message #1


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Voilà, j'aimerais "parser" le dictionnaire français d'OpenOffice, mais les mots sont stoqués de manière très maline pour tenir le moins de place possible et je ne vois pas trop comment m'y prendre sad.gif

En gros, il y a un fichier ".aff" avec des règles dans ce genre là :
QUOTE
PFX A Y 10
PFX A   0          ad         [^bcdfglmnpqrst]
PFX A   0          a          [bdgm]
PFX A   0          ac         [cq]
PFX A   0          af         [f]
PFX A   0          al         [l]
PFX A   0          an         [n]
PFX A   0          ap         [p]
PFX A   0          ar         [r]
PFX A   0          as         [s]
PFX A   0          at         [t]


PFX : préfixe ; 10 pour 10 règles, A pour le flag, Y je sais pas, et une règle par ligne : on remplace l'expression régulière de droite par celle de gauche (sur le préfix ici)

Ensuite, le dico contient des mots du genre :
QUOTE
92482
a/nmtlS
à/MQ
abaca/LMS
abacule/LMS
abaissable/LMS
abaissai/jnmtlw
abaissais/jnmtlv
abaissante/LMF
abaisse/jnmtlu
abaissée/F
abaisse-langue/LM

le mot, puis un /, puis les flags à appliquer ...

J'aimerais avoir un programme qui parte de ces deux fichiers et me sorte toutes les combinaisons de mots possibles à partir des flags ... Pour faire ça, il me faudrait au moins un "sed" et un "awk" en C, mais j'en ai pas trouvé tongue.gif

Une idée ?


PS : Les fichiers se trouvent ici


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
deselegies
posté 5 Aug 2004, 14:21
Message #2


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 313
Inscrit : 22 Jul 2003
Membre no 8 713



Salut,
Est ce que ceciceci pourrais t'aider ?

JC




--------------------
Switcher since 11/2002
Papa since 09/2004 upgraded 01/2008
Go to the top of the page
 
+Quote Post
schlum
posté 5 Aug 2004, 14:27
Message #3


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



QUOTE(deselegies @ 5 Aug 2004, 15:21)
Salut,
Est ce que ceciceci pourrais t'aider  ?

JC
[right][snapback]800434[/snapback][/right]

Merci de ta réponse smile.gif

S'il y a les sources (pour Unix), oui ça m'intéresse wink.gif (et si c'est le même système pour OpenOffice et StarOffice bien sûr) ; car je ne veux pas me contenter du fichier tout fait, je veux pouvoir sélectionner les flags que je veux (pour éviter les pluriels par exemple ...)
Je vois qu'il est en GPL, mais je ne vois pas de lien sur les sources sad.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
SuperCed
posté 5 Aug 2004, 14:48
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 832
Inscrit : 19 Jul 2001
Lieu : Живим у Греноблу
Membre no 519



Peut-être que si tu avais tout dans une BDD, tu pourrais mieux les traiter? Un coup de division sql te donnerait certainement ce que tu souhaites, non?

Pour parser tes fichiers, s'ils sont compliqués, essaye FLEX ou LEX.

N'oublie pas non plus le très bon fscanf.


--------------------
Хајде Јано коло да играмо
iMac 27 mi 2010
Macbook air mi 2011
Mac Mini M1
Go to the top of the page
 
+Quote Post
schlum
posté 5 Aug 2004, 15:04
Message #5


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



QUOTE(SuperCed @ 5 Aug 2004, 15:48)
Peut-être que si tu avais tout dans une BDD, tu pourrais mieux les traiter? Un coup de division sql te donnerait certainement ce que tu souhaites, non?

Pour parser tes fichiers, s'ils sont compliqués, essaye FLEX ou LEX.

N'oublie pas non plus le très bon fscanf.
[right][snapback]800469[/snapback][/right]

mhhh, merci pour l'idée mais utiliser une base de donnée pour ça ne me plaît guère... Je préfère stoquer dans des tableaux de structures lors d'un parcours du fichier '.aff' (ça ça ne devrait pas me poser de problèmes), puis parcourir le '.dic' avec une fonction du type sed (c'est ça qui me coince ...)


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
schlum
posté 7 Aug 2004, 21:46
Message #6


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Up !
Pas d'autres idées ? sad.gif
Pas de développeurs d'OpenOffice dans la salle ? (je précise, c'est pour faire des trucs sous licence libre tongue.gif )


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
chombier
posté 7 Aug 2004, 22:01
Message #7


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 580
Inscrit : 20 Mar 2003
Membre no 6 765



QUOTE(schlum @ 7 Aug 2004, 21:46)
Up !
Pas d'autres idées ?  sad.gif
Pas de développeurs d'OpenOffice dans la salle ? (je précise, c'est pour faire des trucs sous licence libre  tongue.gif )
[right][snapback]802669[/snapback][/right]

Je ne suis pas développeur d'OpenOffice, mais après lecture et relecture de ce fil de discussion, pas d'idée. blink.gif
Mais à tout hasard, si tu veux continuer à manger à ta faim, et si jamais y'avait un BREVET derrière tout ça ? ph34r.gif


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
f_cam
posté 7 Aug 2004, 22:06
Message #8


Moderating Daemon
*****

Groupe : Modérateurs
Messages : 6 345
Inscrit : 22 Feb 2004
Lieu : Yvelines/Cambridge (GB), dans mon pantalon
Membre no 15 207



Et les sources d'open office n'ont pas de quoi t'éclairer?


Moi ce que j'ai pas saisi, c'est comment savoir à quoi correspondent les flags, par exemple qu'est que ça veut dire "LMS"?

Ce message a été modifié par f_cam - 7 Aug 2004, 22:07.


--------------------
G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A
MacBook core duo 1.83 GHz
Go to the top of the page
 
+Quote Post
schlum
posté 7 Aug 2004, 22:16
Message #9


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



QUOTE(chombier @ 7 Aug 2004, 23:01)
QUOTE(schlum @ 7 Aug 2004, 21:46)
Up !
Pas d'autres idées ?  sad.gif
Pas de développeurs d'OpenOffice dans la salle ? (je précise, c'est pour faire des trucs sous licence libre  tongue.gif )
[right][snapback]802669[/snapback][/right]

Je ne suis pas développeur d'OpenOffice, mais après lecture et relecture de ce fil de discussion, pas d'idée. blink.gif
Mais à tout hasard, si tu veux continuer à manger à ta faim, et si jamais y'avait un BREVET derrière tout ça ? ph34r.gif
[right][snapback]802689[/snapback][/right]

Tout OpenOffice et ses sous-projets est libre I think wink.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
schlum
posté 7 Aug 2004, 22:29
Message #10


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



QUOTE(f_cam @ 7 Aug 2004, 23:06)
Et les sources d'open office n'ont pas de quoi t'éclairer?


Moi ce que j'ai pas saisi, c'est comment savoir à quoi correspondent les flags, par exemple qu'est que ça veut dire "LMS"?
[right][snapback]802693[/snapback][/right]

abaca/LMS

--> On a les flages L, M et S

QUOTE(le .aff)
PFX L N 1
PFX L   0          l'         [aàâeèéêiîoôuh]

Le flag L correspond au préfixe l' ... :
CODE
sed "s/^\([aàâeèéêiîoôuh]\)/l'\1/"


QUOTE(le .aff)
PFX M Y 1
PFX M   0          d'         [aàâeèéêiîoôuh]

Le flag M correspond au préfixe d' ... :
CODE
sed "s/^\([aàâeèéêiîoôuh]\)/d'\1/"


QUOTE(le .aff)
SFX S Y 1
SFX S   0          s          [^sxz]

Le flag S correspond à un suffixe pluriel classique :
CODE
sed "s/\([^sxz]\)/\1s/"


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
chombier
posté 7 Aug 2004, 22:37
Message #11


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 580
Inscrit : 20 Mar 2003
Membre no 6 765



QUOTE(schlum @ 7 Aug 2004, 22:16)
Tout OpenOffice et ses sous-projets est libre I think  wink.gif
[right][snapback]802698[/snapback][/right]

Ce qui n'est absolument pas en contradiction avec un brevet, I'm sure tongue.gif
RSA a été breveté aux U.S.A. Moi, pauvre (ou plutôt chanceux) Frenchie ignorant, j'ai "importé" (en fait exporté, quelques boites m'ayant demandé un intermédiaire là bas, ne pouvant acheter à l'étranger) un soft qui utilisait RSA. C'est assurément un viol de brevet, et déjà à l'époque on trouvait du code open source RSA partout, vraiment partout. Tout RSA tient en 4 lignes sur un T-Shirt.
Aucun procès en vue... Mais si les brevets arrivent chez nous, je peux t'assurer que jamais je n'aurais fait un tel soft, et tant pis pour les dizaines de milliers d'utilisateurs qui en avaient besoin. et tant pis pour moi, petit codeur à la maison, en l'occurence...


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
f_cam
posté 7 Aug 2004, 22:46
Message #12


Moderating Daemon
*****

Groupe : Modérateurs
Messages : 6 345
Inscrit : 22 Feb 2004
Lieu : Yvelines/Cambridge (GB), dans mon pantalon
Membre no 15 207



Ah d'accord je comprends mieux, ton extrait de .aff donne juste la règle A.

Est-ce que man regex éclaire ta lanterne ?


--------------------
G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A
MacBook core duo 1.83 GHz
Go to the top of the page
 
+Quote Post
schlum
posté 7 Aug 2004, 22:56
Message #13


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



QUOTE(chombier @ 7 Aug 2004, 23:37)
QUOTE(schlum @ 7 Aug 2004, 22:16)
Tout OpenOffice et ses sous-projets est libre I think  wink.gif
[right][snapback]802698[/snapback][/right]

Ce qui n'est absolument pas en contradiction avec un brevet, I'm sure tongue.gif
RSA a été breveté aux U.S.A. Moi, pauvre (ou plutôt chanceux) Frenchie ignorant, j'ai "importé" (en fait exporté, quelques boites m'ayant demandé un intermédiaire là bas, ne pouvant acheter à l'étranger) un soft qui utilisait RSA. C'est assurément un viol de brevet, et déjà à l'époque on trouvait du code open source RSA partout, vraiment partout. Tout RSA tient en 4 lignes sur un T-Shirt.
Aucun procès en vue... Mais si les brevets arrivent chez nous, je peux t'assurer que jamais je n'aurais fait un tel soft, et tant pis pour les dizaines de milliers d'utilisateurs qui en avaient besoin. et tant pis pour moi, petit codeur à la maison, en l'occurence...
[right][snapback]802713[/snapback][/right]

Ca fait froid dans le dos toutes ces histoires de brevets ... mais je ne pense pas être dans l'illégalité en utilisant un dico libre de droits pour faire une appli libre, si ?


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
schlum
posté 7 Aug 2004, 22:59
Message #14


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



QUOTE(f_cam @ 7 Aug 2004, 23:46)
Ah d'accord je comprends mieux, ton extrait de .aff donne juste la règle A.

Est-ce que man regex éclaire ta lanterne ?
[right][snapback]802717[/snapback][/right]

Oui, bien sûr, le .aff est plus gros que ça et contient les règles pour tous les flags wink.gif

pour "regex.h" et "regexp.h", j'ai déjà fouillé ... Malheureusement, aucune fonction qui permet de faire un sed-like simplement ... En plus, il est compliqué d'utilisation pour des résultats pas folichons sad.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
f_cam
posté 7 Aug 2004, 23:52
Message #15


Moderating Daemon
*****

Groupe : Modérateurs
Messages : 6 345
Inscrit : 22 Feb 2004
Lieu : Yvelines/Cambridge (GB), dans mon pantalon
Membre no 15 207



Je prends l'exemple de ton flag S, moi j'ai ceci qui marche:
CODE

#include <stdlib.h>
#include <stdio.h>
#include <regex.h>


int main (void)
{

       char *text ="maison";
       regex_t pluriel;
       regmatch_t *matches;

       if(0!=regcomp(&pluriel,"([^sxz])$",REG_EXTENDED)){
               printf("bad expression");
       }
       matches=malloc(sizeof(regmatch_t)*(1+pluriel.re_nsub));

       if(0==regexec(&pluriel,text,pluriel.re_nsub+1,matches,0)){

         
               printf("%.*s%.*ss\n",(int)matches[1].rm_so,text,(int)(matches[1].rm_eo-matches[1].rm_so),text+(int)matches[1].rm_so);
       }
       regfree(&pluriel);
       free(matches);
       return 0;
}

Si tu as plus de paires de parentheses, tu dois pouvoir itérer sur l'array matches.

La j'ai fait un peu le barbare, mais sinon c'a n'a pas l'air bien compliqué:
matches[0] donne l'emplacement de toute la chaine matché par l'expression
matches[1] correspond à \1 et ainsi de suite


Ce message a été modifié par f_cam - 7 Aug 2004, 23:54.


--------------------
G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A
MacBook core duo 1.83 GHz
Go to the top of the page
 
+Quote Post
schlum
posté 8 Aug 2004, 11:30
Message #16


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Ah vi, de la bonne bidouille smile.gif

Et pour les règles plus compliquées comme celle-là par exemple ?

[QUERY]SFX F se s [^eo]use[/QUERY]
suffixe, ce qui se termine par "[^eo]use", on enlève se et on rajoute s ->
CODE
sed "s/\([^eo]u\)se$/\1s/"


[Edit] Hum, en fait, vu la complexité des règles, vaut mieux traiter ça avec un grep pour tester l'éligibilité de la règle, puis avec un sed pour ce qu'il y a à enlever et ce qu'il y a à rajouter ...


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
f_cam
posté 8 Aug 2004, 12:13
Message #17


Moderating Daemon
*****

Groupe : Modérateurs
Messages : 6 345
Inscrit : 22 Feb 2004
Lieu : Yvelines/Cambridge (GB), dans mon pantalon
Membre no 15 207



Bon c'est vrai que mon code n'est pas tres generalisable. Ceci, en revanche l'est. Il ne tiens pas compte des trucs comme \t dans la chaine de remplacement doit sortir un tab mais bon à mon avis ça doit pas être fréquent dans ton cas, et puis je vais pas tout faire quand même.

CODE

#include <stdlib.h>
#include <stdio.h>
#include <regex.h>
#include <string.h>

int main (void)
{

       char *text ="abuse";
       char *subs="\\1s";
       int offset;
       char *p,*lp;
       regex_t pluriel;
       regmatch_t *matches;

       if(0!=regcomp(&pluriel,"([^eo]u)se$",REG_EXTENDED)){
               printf("bad expression");
               exit(1);
       }
       matches=malloc(sizeof(regmatch_t)*(1+pluriel.re_nsub));

       if(0==regexec(&pluriel,text,pluriel.re_nsub+1,matches,0)){

               if(matches[0].rm_so>0)printf("%.*s",(int)matches[0].rm_so,text);
        /*sort la partie de la chaine initiale qui est avant le match*/
               lp=p=subs;
               while((p=strchr(p,'\\'))){/*on part à la recherche des \1, \2*/

                       if(p!=lp)printf("%.*s",(unsigned int)p-(unsigned int)lp,lp);/*sort le texte de subsitution etre les trucs du style \1, \2*/
                       offset=atoi(p+1);/*on a trouvé un truc comme \\4 donc on sort une des chaines*/
                       if(offset<=pluriel.re_nsub)printf("%.*s",(int)(matches[offset].rm_eo-matches[offset].rm_so),text+(int)matches[offset].rm_so);
                       p+=2;
                       lp=p;
               }
               printf("%s",lp);/*sort le fin de la subsitution*/
               printf("%s\n",text+matches[0].rm_eo);/*sort la partie de la chaine initiale qui est après le match*/
       }
       regfree(&pluriel);
       free(matches);
       return 0;
}

C'est pas encore parfait, mais là en général il va suffire de mettre la bonne chaine de subsitution et expression regulière et ça va rouler je pense

Ce message a été modifié par f_cam - 8 Aug 2004, 13:08.


--------------------
G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A
MacBook core duo 1.83 GHz
Go to the top of the page
 
+Quote Post
schlum
posté 8 Aug 2004, 12:42
Message #18


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Finalement il est pas si mal ce header alors tongue.gif
Merci, j'essaierai ce soir en rentrant chez moi wink.gif


--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
schlum
posté 10 Aug 2004, 14:17
Message #19


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 452
Inscrit : 25 Oct 2002
Lieu : Jeumont (59)
Membre no 4 319



Changement de stratégie ... Ce dico est dérivé du dico GUTemberg d'ispell, donc retour à la source ...
http://www2.unil.ch/ling/cp/frgut.html

Sinon, j'ai trouvé à quoi correspondait le Y/N ... Un suffixe avec le flag Y peut se compiner avec un préfixe ayant aussi le flag Y smile.gif (remplacé par une * dans les .aff d'ispell)

Bon, ça a l'air encore plus difficile à analyser comme fichier .aff tongue.gif Mais je vais me débrouiller ... Merci f_cam pour les exemples d'utilisation de regex wink.gif



--------------------
          I think therefore I Mac          
Go to the top of the page
 
+Quote Post
f_cam
posté 10 Aug 2004, 14:24
Message #20


Moderating Daemon
*****

Groupe : Modérateurs
Messages : 6 345
Inscrit : 22 Feb 2004
Lieu : Yvelines/Cambridge (GB), dans mon pantalon
Membre no 15 207



Y'a pas de quoi, j'avais jamais entendu parler de ces fonctions avant donc ça m'a permis d'apprendre des trucs.


--------------------
G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A
MacBook core duo 1.83 GHz
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 8th June 2024 - 08:22