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 ]
# Traitement du langage naturel
Posté par Jehan (site web personnel, Mastodon) . En réponse au journal Découpage de phrases en structure Sujet-Verbe-Objet. Évalué à 10.
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 ]