IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Prolog Discussion :

Verticaliser (segmenter) un texte en Prolog


Sujet :

Prolog

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Verticaliser (segmenter) un texte en Prolog
    Bonjour à tous,

    Je vous expose brievement mon problème : je cherche à verticaliser un texte en prolog. Donc en fait, si je prend un texte du genre :

    "J'ai besoin d'aide pour la réalisation d'un segmenteur en Prolog".

    Le résultat sera :
    J
    ai
    besoin
    d
    aide
    pour
    la
    réalisation
    d
    un
    segmenteur
    en
    Prolog
    La segmentation se fait en fonction de la position des séparateurs (définis au préalable dans une liste).

    J'ai déjà commencé à travailler dessus, mais je rencontre deux problèmes majeurs mais je ne vais vous en exposer qu'un seul :
    - lorsqu'il y a deux séparateurs, par exemple le '.' et l'espace dans "Prolog. C'est urgent!", j'obtiens :
    Prolog
    Prolog. C'est
    urgent

    J'ai conscience que ma question, sans le code source, doit vous paraître bizarre.

    Merci pour votre aide!

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Henny
    J'ai conscience que ma question, sans le code source, doit vous paraître bizarre.
    Oui, le code source nous aiderait beaucoup (en plus, ça nous permettrait de savoir de quelle implémentation Prolog il s'agit).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 38
    Points : 42
    Points
    42
    Par défaut
    Bonjour,
    a priori, le programme suivant devrait faire ce que tu cherches à faire (mais je n'ai pas pu le tester, je suis au boulot et je n'ai pas de compilateur Prolog) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    % Définition des séparateurs
    separateur(X):-
        atom_codes('(-),;:.!?', ListeSeparateurs),
        member(X, ListeSeparateurs).
    separateur(' '). % l'espace est un séparateur
     
    % Verticaliseur : interface
    verticaliser(Texte):- % on entre le texte sous forme d'un atome
        atom_codes(Texte, ListeTexte), % transformation sous forme de liste pour
                                                   % que le traitement soit possible
        verticaliser_liste(ListeTexte).
     
    % Verticaliseur : prédicat auxiliaire
    verticaliser_liste([]). % condition d'arrêt
     
        % cas où deux séparateurs se suivent : on en élimine un avant de
        % continuer le traitement
    verticaliser_liste([X,Y|Suite]):-
        separateur(X),
        separateur(Y),
        verticaliser_liste([Y|Suite]).
     
        % cas où le premier élément est un séparateur, mais où il est suivi par un
        % caractère alphanumérique (car le prédicat précédent a échoué)
    verticaliser_liste([X|Suite]):-
        separateur(X),
        nl, % on affiche un retour à la ligne avant d'imprimer le mot suivant
        verticaliser_liste(Suite).
     
       % cas par défaut : l'élément courant est un caractère : on l'imprime
    verticaliser_liste([X|Suite]):-
       write(X),
       verticaliser_liste(Suite).

  4. #4
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci Cecilka, je vais essayer ça tout de suite et je te tiens au courant.

    Mon code ne diffère pas beaucoup du tiens, hormis le coup des deux séparateurs à la suite. Je n'y ai même pas pensé, c'était pourtant évident (cela fait deux mois que je n'ai pas touché à Prolog pour me concentrer sur le C, donc on perd pas mal d'habitudes ).

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    J'ai corrigé le code de Cecika:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    % Définition des séparateurs
    separateur(X):-
      atom_chars('(-)'' ,;:.!?', ListeSeparateurs),
      member(X, ListeSeparateurs).
     
     
     
     
    % Verticaliseur : interface
     
    verticaliser(Texte) :- 
      % on entre le texte sous forme d'un atome
      % transformation sous forme de liste pour que le traitement soit possible
      atom_chars(Texte, ListeTexte),
     
      verticaliser_liste(ListeTexte).
     
     
     
    % Verticaliseur : prédicat auxiliaire
    verticaliser_liste([]) :- !. % condition d'arrêt
     
     
    % cas où deux séparateurs se suivent : on en élimine un avant de
    % continuer le traitement
     
    verticaliser_liste([X,Y|Suite]):-
      separateur(X),
      separateur(Y),
      !,
      verticaliser_liste([Y|Suite]).
     
     
     
    % cas où le premier élément est un séparateur, mais où il est suivi par un
    % caractère alphanumérique (car le prédicat précédent a échoué)
     
    verticaliser_liste([X|Suite]):-
      separateur(X),
      !,
      nl, % on affiche un retour à la ligne avant d'imprimer le mot suivant
      verticaliser_liste(Suite).
     
    % cas par défaut : l'élément courant est un caractère : on l'imprime
    verticaliser_liste([X|Suite]):-
      !,
      write(X), write(' '),
      verticaliser_liste(Suite).
    Exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ?- verticaliser('Prolog, c''est super!').
    P r o l o g 
    c 
    e s t 
    s u p e r 
     
    Yes
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  6. #6
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour votre aide.

    En fait, j'ai utilisé pour ma part le code suivant (sachant que les séparateurs sont les mêmes que pour l'autre code, et ouverture est l'équivalent simplifié de open) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    liremot(Mot):-                   
    	get_char(lecture,Char), 
    	\+ separateur(Char),
    	liremot(Char,Mot).       
    liremot([]).
     
    liremot(Char,[Char]):-
    	at_end_of_stream(lecture).
    liremot(Char,[]):-
    	separateur(Char).
     
    liremot(Char,[Char|SuiteMot]):-
    	get_char(lecture,Char2),
    	liremot(Char2,SuiteMot).
     
    segmenteur(Fichier_source,Fichier_cible):-
    	ouverture(Fichier_source,read,lecture),
    	ouverture(Fichier_cible,write,ecriture),
    	traitement_segmenteur,
    	close(lecture),
    	close(ecriture).
     
    traitement_segmenteur:-
    	at_end_of_stream(lecture).
    traitement_segmenteur:-
    	liremot(Mot),
    	atom_chars(Atome,Mot),
    	write(ecriture,Atome),nl(ecriture), 
    	traitement_segmenteur.
    Avec pour appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    segmenteur('fichier_source.txt','fichier_cible.txt').
    Et ça fonctionne. Si ça ne fonctionnait pas avant, c'est parce que j'avais oublié une condition d'arrêt

    Le code que vous m'avez transmis est très bien, mais elle ne permet pas d'avoir accès directement à chaque mot comme une entité à part entière sur laquelle on va faire des tests (suffixe etc...). Mais désolé, j'aurais dû le préciser plus tôt...

    Et de plus, j'aimerais bien ne pas mettre à la poubelle la mienne.

    A part ça, la seule différence notable dans le fonctionnement avec votre version est qu'il lit le texte dans un fichier (pas une grosse différence).

    Maintenant, je rencontre encore le problème suivant :
    - les caractères accentués posent problème : il me dit "illegal UTF-8 sequence"
    Ce que je ne comprend pas, c'est pourquoi ce problème ne se pose pas avec votre version ? (je suis sûr que ça vient de mon get_char...).

    Et sinon, dernière question : si je cherche à verticaliser le texte, c'est pour obtenir un tagger simpliste indiquant la catégorie, le genre et le nombre du mot lu. Et ça aurait cette forme là :

    "Prolog, j'adore!" :
    Prolog : Nom, Sing, Masc
    j : pron.pers, P1
    adore : Verbe, Pres, Ind etc...

    Existe-t-il en Prolog un moyen de stocker les données un peu comme les structures en C++? En d'autres termes, je cherche à, pour chaque mot lu, garder des zones libres pour la catégorie, le genre et le nombre, que je n'aurai plus qu'à remplir avec mes analyses linguistiques.

    Merci beaucoup encore une fois pour votre aide. J'ai vraiment encore beaucoup de mal avec Prolog.

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Henny
    - les caractères accentués posent problème : il me dit "illegal UTF-8 sequence"
    Ce que je ne comprend pas, c'est pourquoi ce problème ne se pose pas avec votre version ? (je suis sûr que ça vient de mon get_char...).
    Tu auras de toute façon un problème équivalent en C avec getchar. Faut qu'on se renseigne à ce sujet.


    Citation Envoyé par Henny
    Existe-t-il en Prolog un moyen de stocker les données un peu comme les structures en C++?
    Oui, ça s'appelle des tuples.

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom('Prolog', sing, masc)
    pronom_pers('je', pers1)
    verbe('adore', 'adorer', present_ind, pers1)
    Va voir dans le tuto de présentation du langage pour en savoir plus.


    Citation Envoyé par Henny
    J'ai vraiment encore beaucoup de mal avec Prolog.
    C'est normal au début.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  8. #8
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par pcaboche
    Tu auras de toute façon un problème équivalent en C avec getchar. Faut qu'on se renseigne à ce sujet.
    Il y a effectivement des problèmes avec l'UTF-8 en C aussi, mais on peut très bien manipuler des accents avec un getchar non? Du moins, c'est ce que je fais depuis toujours, et ça ne m'a jamais posé de problème.

    Citation Envoyé par pcaboche
    Oui, ça s'appelle des tuples.
    Merci pour les tuples et pour le tutorial.


    Sinon, maintenant que tout fonctionne plus ou moins comme je le voudrais, je viens de penser à une chose : sachant que l'on stocke chaque mot lu dans une liste, comme faire pour acceder par exemple au mot qui se situe juste avant le mot lu?
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "Prolog est dangereux pour la santé".
    Je suis en train de lire par exemple "dangereux", mais je veux être capable d'avoir accès au mot juste avant afin d'y faire des tests (par exemple, quelle est sa catégorie grammaticale etc...). En d'autres termes, je veux avoir accès à "est" ou à "Prolog".
    J'ai pensé à mettre tous les mots lus dans une liste, mais cela ne me dit pas comme je vais pouvoir y acceder
    J'avais par exemple fait (ne rions pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    traitement_segmenteur([Precedent,Mot/Mots]):-
         liremot(Mot),
         etc...
    J'ai remplacé la barre séparant la tête et la queue de la liste par '/' parce que ma connection internet est sur un MAC, et je ne sais pas où se trouve ce caractère sur ces claviers

    Evidemment, ça ne marche pas

  9. #9
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    En Prolog, tu ne peux pas revenir en arrière dans une liste, à moins de garder quelque part une référence sur les éléments précédents (voire la liste entière).

    Il exsite cependant pas mal de prédicats sur les listes (en swi-prolog), notamment nth0/3 et nth1/3.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  10. #10
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Merci
    J'étais assez occupé ces derniers temps et je viens de réaliser que je n'ai pas dit merci pour l'aide apportée .

    Le problème est résolu en tout cas.

  11. #11
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par Henny
    J'étais assez occupé ces derniers temps et je viens de réaliser que je n'ai pas dit merci pour l'aide apportée .
    Comme on dit "vieux motard que jamais"
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Segmentation de texte
    Par pretyy dans le forum Images
    Réponses: 3
    Dernier message: 28/11/2011, 10h11
  2. [Débutant] segmentation d'un texte en lignes
    Par meriem/assia dans le forum Images
    Réponses: 1
    Dernier message: 13/04/2011, 22h52
  3. Changer de segment un champ de type text
    Par joel74 dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 05/11/2009, 16h55
  4. Réponses: 3
    Dernier message: 12/06/2009, 14h10
  5. segmentation texte dans un image
    Par dhekrasousou dans le forum Débuter
    Réponses: 0
    Dernier message: 16/03/2009, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo