Journal Découpage de phrases en structure Sujet-Verbe-Objet

Posté par (page perso) .
Tags : aucun
0
8
août
2008
Bonjour, je cherche à écrire un petit programme permettant de découper des phrases en structure sujet - verbe - objet, ie. de découper ma phrase en groupe sujet, groupe verbal, et groupe objet.

Un exemple simple :
"Pierre et son ami ont fabriqué un avion en papier"
Ici, le groupe sujet est "Pierre et son ami" ,
le groupe verbal "ont fabriqué",
et le groupe objet "un avion en papier"

Un autre moins simple :
"Un employé de la télévision publique suédoise a découvert dans les archive, cet été, une vidéo inédite d'un concert de Jimi Hendrix"
Groupe sujet : "Un employé de la télévision publique suédoise"
Groupe verbal : " a découvert dans les archive, cet été,"
Groupe objet : "une vidéo inédite d'un concert de Jimi Hendrix"

J'imagine que ce genre de problème est un grand classique en TAL (Traitement Automatique du Langage), néanmoins, je ne parviens pas à trouver une doc claire et xploitable sur le sujet. Je manque aussi de recul sur l'ensemble des solutions existantes.

A priori, j'imagine que l'on peut traiter le problème simple de la manière suivante : Etant donné que je dispose de Morphalou, un arbre XML listant 600 000 mots et donnant leur nature grammaticale de chaque mot ("mangeaient" dans morphalou est défini comme le verbe manger à la troisième personne du pluriel, à l'imparfait de l'indicatif. De même "il" est un pronom personnel), j'imagine que je peux repérer des structures grammaticales schématiques et découper en fonction :
"Charles joue à la balle" : Charles = pronom personel (nom propre) ; joue = indicatif présent, 3ème personne du singulier ; à = préposition ; la = déterminant ; balle = nom commun;
Et donc de matcher que mon groupe sujet est mon pronom, mon groupe verbal mon verbe et mon groupe objet ma structure Préposition+déterminant+nom commun.

Le problème est que je peux avoir une grande variabilité dans ce genre de schéma. J'imagine qu'il est impossible de découper de grande phrase Desprogiennes (aller pour le plaisir : "'La femme est le produit d'un os surnuméraire', disait Bossuet qu'on ne saurait taxer de mysoginie étant donnée l'excellente compréhension qu'il afficha toute sa vie à l'endroit de la gente féminine, Huguenottes et catins exeptées"), mais au moins d'avoir des résultats probant pour des phrases à peu près simple.

D'où mes questions :
- Quels sont les principales approches utilisées pour résoudre ce problème (Prolog, Markov, ???) ?
- Existe t-il des cours, des docs exploitables sur le sujet ?
  • # NLP

    Posté par . Évalué à 5.

    C'est des problemes assez classique en NLP. J'aime bien le framework (un peu usine à gaz) nltk, par contre il a pas beaucoup de support pour le français.
    Pour le français je crois que TreeTagger marche pas mal (par contre je crois que c'est pas open source), ce serait vraiment cool d'avoir un truc équivalent dans nltk.

    http://www.ims.uni-stuttgart.de/projekte/corplex/TreeTagger/
    http://nltk.org/index.php/Main_Page

    Pour la pub, une intro à nltk:
    http://www.ibm.com/developerworks/linux/library/l-cpnltk.htm(...)
  • # Traitement du langage naturel

    Posté par (page perso) . Évalué à 10.

    Salut,

    comme tu le soulignes, c'est du classique du traitement de langage naturel, mais c'est loin d'être évident. Ou du moins, il existe bien évidemment des algorithmes qui marchent plus ou moins bien (en fonction de la complexité de la phrase, de la qualité de l'implémentation, mais aussi de la qualité de l'apprentissage, car il s'agit très souvent d'algorithme basés sur l'apprentissage).

    Alors tu peux sûrement faire quelque chose de moins complexe, mais ça sera sûrement peu fiable. Tout dépend ce que tu veux faire au final, le but, les moyens que tu peux mettre en oeuvre, le type de machine sur lesquelles tu veux que ça tourne (parce que traiter un arbre de 600 000 mots comme tu dis... ça peut paraitre simple dit comme ça, mais c'est sacrément de données en mémoire... et autant à parser, complexe et lent à naviguer dedans,, etc. Et encore... tu dis 600 000 mots, mais avec tous les dérivés qu'ont les mots, etc. ça peut être assez faible si tu veux un dico très exhaustif).

    Comme je le disais, très souvent ce genre de problème s'implémente par des algorithmes avec apprentissage et beaucoup de probabilité (d'où l'apprentissage en général qui sert à créer des probabilités significatives, car elles vont souvent être originellement générées aléatoirement), du genre réseau de neurone. En fait là si je me souviens bien, c'était plutôt des réseaux bayésiens qu'on utiliserait dans un système de ce genre.

    L'idée est "simple" une fois comprise, mais pas intuitive avant. En réalité, ce n'est pas si simple de voir un mot et de dire "ah ça c'est un nom, un adjectif, le verbe, etc." car déjà des mots avec la même orthographe peuvent être des mots complètement différents.

    Exemple: l'arme est sale.

    L'air de rien, dans cette phrase toute bête (et très aisée à inventer, la preuve, je viens de le faire!), on a 3 mots qui pourraient être des verbes:
    - "arme". Même avec le "l'" ça peut aussi être un verbe, par exemple: "larmurier l'arme".
    - "est" est le verbe, mais cela pourrait être la direction (Nord/Sud...).
    - "sale" est un adjectif, mais ça pourrait être "saler" conjugué, voire un adjectif substantivé (qui prend dans la nature de nom: quel sale!).

    Nous on est capable de voir immédiatement le sens de cette phrase, parce que notre cerveau est très fort, mais l'ordi... Dans un livre d'IA, je me rappelle même avoir vu un exemple formidable, car super basique et pourtant sans le contexte, on ne pouvait savoir son sens (il y avait 2 possibilités, qui n'avaient rien à voir et qui avaient toutes les deux du sens). Cependant dans une conversation, jamais on ne se poserait la moindre question dessus. C'était étonnant de se rendre compte que notre cerveau fait sans équivoque des distinctions (sans même qu'on s'en rende compte) que quasi aucun ordi ne pourrait faire.
    Dommage que je me souvienne plus l'exemple, ni le livre...

    Alors évidemment dans mon exemple, y a aussi l'ordre. Souvent on se dit "Sujet-Verbe-Complément", facile à automatiser! Mais on sait bien qu'il arrive que cet ordre soit un peu bouleversé, encore une fois sans problème pour nous, mais brutal pour une machine.

    En gros l'idée du réseau bayesien pour le traitement lexicale de ta phrase serait d'avancer dans la phrase et, à chaque mot, calculer la probabilité que ce mot arrive après la partie de la phrase que tu as déjà lu.
    Exemple:
    1/ l' :
    1.1: probabilité que la phrase commence par l'article l' = X
    1.2: probabilité que la phrase commence par le pronom l': Y
    ... [autre cas?]
    2/ arme
    2.1 probabilité que le nom "arme" arrive après l'article "l'" = X1/X (= X1, sachant X)
    2.2 probabilité que le nom "arme" arrive après le pronom "l'" = X2/X (X2, sachant X)
    2.3 probabilité que le verbe "arme" arrive après l'article "l'" = Y1/Y
    2.4 probabilité que le verbe "arme" arrive après le pronom "l'" = Y2/Y

    etc.

    Et en gros, à la fin, une fois que tu as toutes tes possibilités, tu regardes la probabilité la plus haute, et tu dis que c'est le bon choix => et voilà tu as ta réponse. (pendant l'apprentissage, tu vas plutôt regarder la proba la plus haute, tu regardes si c'est le bon choix: si oui, cool; sinon, tu modifies tes paramètres dans le "sens" voulu pour que la prochaine fois, la réponse soit bonne).

    Bon c'est très résumé et pis ce sont des souvenirs qui ont au moins 2 ans. J'espère que j'ai pas dit trop de bêtises et que je me suis pas trop planté (enfin globalement, je sais que l'idée y est; et il me semble bien que c'est souvent les réseaux bayésiens qui sont utilisés pour ce type de problématique, mais même là je peux me planter. Et en plus y a très sûrement d'autres modèles utilsiés aussi)... Vous l'aurez compris, j'ai étudié l'IA à la fac.
    Donc si y a des spécialistes dans le coin, prière de pas me sabrer. J'essayais surtout d'être pédagogique pour expliquer le fonctionnement/la logique globale.

    Et tout ça pour dire: c'est vraiment pas si simple le traitement du langage naturel... Donc faire un "petit programme" me paraît très dur (encore une fois, sauf si les prétentions sont faibles, car c'est pour un cas très précis où un système de grande qualité n'est pas requis).
    Bye!

    Jehan

    Film d'animation libre en CC by-sa/Art Libre, fait avec GIMP et autre logiciels libres: ZeMarmot [ http://film.zemarmot.net ]

  • # Statgram-fr

    Posté par (page perso) . Évalué à 3.

    On m'a soufflé un lien. Peut-être qu'il pourra t'aider.
    http://code.google.com/p/statgram-fr/
  • # Mémé

    Posté par (page perso) . Évalué à 1.

    Un parseur d'Earley devrait faire l'affaire, ou un CYK
    En gros, il te faut un analyseur syntaxique non deterministe qui te rendra la liste des parsings obtenus. Et donc, il te faut formaliser ta grammaire. Pour ça, plein de méthodes (grammaires transformationelles, algébrique, etc), et plein de langages différents...

    Je te conseille le toolkit ZEN pour Ocaml, voire Lingua::LinkParser pour Perl.

    Dans tous les cas, http://en.wikipedia.org/wiki/Parsing contient des informations utiles pour toi.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.