Faire des automates avec PHP?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Faire des automates avec PHP?

par doviet » 27 juil. 2009, 13:35

Oui, tout à fait. Je voulais juste confirmer au cas où tu as d'autres propositions.

Effectivement, j'étais perdu depuis le début. Parce que mon prof m'a forcé de travailler sur la grammaire hors-contexte, sur l'automate, et tous ces trucs de fou.
Et comme je ne maitrise pas les théories d'automate, je n'étais pas sûr que je pouvais laisser tomber ce "bazaar" de grammaires et d'automates.

Maintenant comme tu m'as assuré, j'ai pris la décision.

Merci beaucoup de m'avoir écouté attentivement et de m'avoir aidé très sérieusement, Sékil, et surtout HyWaN!

par Hywan » 27 juil. 2009, 13:12

Tes grammaires sont présentées sous plusieurs formes. La première forme est celle du chunker. Pourquoi se prendre la tête à la transformer ?
Ma solution serait viable pour toi ou pas ?

par doviet » 27 juil. 2009, 12:22

Non y a pas d'erreur dans le code, PP est un syntagme prépositionnel, il encapsule une préposition (PRP) et un syntagme nominal (NP). En tout cas c'est pas grave, ce n'est qu'une représentation.

Alors, j'ai simplement stocké les grammaires dans les fichiers qui portent le nom correspondant à la première règle de la grammaire (par exemple: VN VN NP NP VN VN PP), ça tu as dit aussi.

Et... pas besoin d'automate. Mais c'est-à-dire, pas besoin des règles de grammaire non plus? (on prend juste la première règle pour identifier la grammaire, et l'extraction de données se fait avec Xpath?)
Dans ce cas là, les grammaires que j'ai écrites n'ont aucune importance, n'est-ce pas?

par Hywan » 27 juil. 2009, 11:51

Tu dois avoir une erreur dans le code que tu nous as filé :

Code : Tout sélectionner

<s> <VN> Je PRO:PER je voudrais VER:cond vouloir </VN> <VN> savoir VER:infi savoir </VN> <NP> le DET:ART le temps NOM temps </NP> <NP> qu' PRO:REL que </NP> <VN> il PRO:PER il va VER:pres aller </VN> <VN> faire VER:infi faire </VN> <PP> à PRP à <NP> Périgueux NOM périgueux </NP> </PP> </s>
Que signifie l'encapsulation (NP dans PP) à la fin ?
Bon sinon, la grammaire que tu en sors me semble correcte.
Il faut un moyen de stocker ces grammaires, de les identifier.

Voilà comment je procéderais :
on lance le chunker, on obtient une grammaire. Il faut un identifiant unique par grammaire. Si la grammaire existe déjà dans notre registre de grammaire, alors ça signifie qu'on sait la traiter. Sinon on reçoit une notification et on fait ce qu'il faut pour la reconnaître (et on dit à l'utilisateur que la demande ne peut pas être comprise pour l'instant).
Donc si la grammaire existe, ça veut dire qu'on a le système derrière. Le système c'est un automate.
Pour chaque automate, tu as état finaux. Si on arrive dans ces états finaux, on peut récupérer l'information. Et voilà. Mais au lieu de faire un automate, on peut transformer le résultat du chunker en expression régulière. C'est un brin plus chiant (ou pas) à faire, mais ce sera plus rapide pour PHP.

En fait non … Le résultat du chunker te donne déjà la réponse. Il faut réussir à classifier/identifier les résultats. Typiquement, là on peut appeler notre grammaire : grammaire VNVNNPNPVNVNNP. Si on a cette forme, on sait que le résultat est stocké dans /s/NP[1] et /s/PP/NP (si on utilise les expressions XPath pour lire le XML du chunker).
Donc pour chaque grammaire, on saura associer les chemins vers les réponses.

Au final, pas besoin d'automate, juste un registre de toutes les grammaires possibles.
Tada.

par doviet » 27 juil. 2009, 11:31

Je suis désolé, HyWaN, si j'ai mal compris pour te faire répéter trop de fois. Oui j'ai déjà écrit plusieurs grammaires (une grammaire correspondante pour chaque phrase), et la phrase "Quel temps fait-il à Paris demain?" est un des exemples... Qu'est-ce que je dois faire ensuite?

Je suis un peu perdu, je ne sais même pas si je suis dans la bonne direction... (j'espère que vous ne me lâcherez pas)

J'ai une autre phrase comme exemple: "Je voudrais savoir le temps qu'il va faire à Périgueux". TreeTagger m'a donné:

Code : Tout sélectionner

<s> <VN> Je PRO:PER je voudrais VER:cond vouloir </VN> <VN> savoir VER:infi savoir </VN> <NP> le DET:ART le temps NOM temps </NP> <NP> qu' PRO:REL que </NP> <VN> il PRO:PER il va VER:pres aller </VN> <VN> faire VER:infi faire </VN> <PP> à PRP à <NP> Périgueux NOM périgueux </NP> </PP> </s>
Alors est-ce qu'une grammaire comme ça est correcte?

Code : Tout sélectionner

S -> VN VN NP NP VN VN PP VN -> PRO:PER VER VN -> VER NP -> DET:ART NOM NP -> PRO:REL NP -> NOM PP -> PRP NP
Et comment pourrais-je faire pour extraire:

Code : Tout sélectionner

[type] => temps [ville] => Périgueux
?

par Hywan » 27 juil. 2009, 09:59

Si DET est défini avec exactitude, tu pourras avoir un cas « poubelle » qui serait NOM. Et la probabilité pour arriver dedans est d'autant plus élevée que l'exactitude avec laquelle tu as défini DET. Autrement dit, plus DET est bien défini, plus on a de chance de trouver NOM.
Quand je parle de cas « poubelle », je veux dire : on a traversé tous les cas, tous les états, toutes les transitions, et il nous reste juste une analyse totalement libre (comprendre, qui ne vérifie rien) : c'est ton NOM.

Mais tu dois d'abord générer toutes tes grammaires avant. C'est pour ça que je dis de faire la liste des grammaires sur papier … … (je commence à me lasser de le répéter). Une fois toutes les grammaires établies, on y verra déjà nettement plus clair.

par doviet » 27 juil. 2009, 04:44

Bah je n'ai pas compris ton problème avec ma proposition.
Et je comprends pas ton "pour chaque phrase, je crée une grammaire". Tu ne peux pas créer une grammaire à chaque phrase, sinon cela revient à tout faire manuellement.
Oui, une grammaire pour chaque phrase. C'est comme quand on apprend le français, on doit apprendre des règles pour comprendre quelle est la différence entre une phrase et une autre, ça semble évident, non?
Ce n'est pas "totalement manuellement", mais une partie, oui.
C'est-à-dire, le travail n'est pas de prendre une phrase précise comme "Le chat mange la souris" et en tirer des mots qu'on veut, mais de passer la phrase par un chunker pour avoir une structure comme

Code : Tout sélectionner

S / | \ NP VN NP / \ | / \ DET NOM V DET NOM | | | | | Le chat mange la souris
et dire qu'on a des NOM dans des NP et un V dans un VN, ce sont donc les mots qu'on cherche. Cette structure pourra bien être appliquée à certaines autres phrases comme:
- "Le chien mange un os" (NOM1 = chien, V = mange, NOM2 = os)
- "Les garçons veulent un truc" (NOM1 = garçons, V = veulent, NOM2 = truc)
- "Les filles aiment une chose" (NOM1 = filles, V = aiment, NOM2 = chose)
- ...
Est-ce que c'est faisable?
Avant de partir sur des choses plus avancés, revient à ce que je t'ai dit. Écrit tes grammaires ou dessine tes automates. On verra pour la suite. Car je pense qu'on pourra sûrement faire des unions ou des intersections (on est dans un langage régulier, on a de bonnes propriétés, ça se comporte bien).

Sinon, pour l'apprentissage, je conseille plutôt les réseaux de neurones, mais on est hors-sujet ;-).
Hmm.. ça a l'air bien compliqué, ce dont tu parles :?
Mais je voudrais faire un truc simple. D'après toi, est-ce que c'est possible de créer un automate qui prend une grammaire telle que

Code : Tout sélectionner

S -> NP VN NP NP -> DET NOM VN -> V
pour qu'il donne automatiquement les mots souhaités (NOM et V)?

par Hywan » 25 juil. 2009, 15:26

Avant de partir sur des choses plus avancés, revient à ce que je t'ai dit. Écrit tes grammaires ou dessine tes automates. On verra pour la suite. Car je pense qu'on pourra sûrement faire des unions ou des intersections (on est dans un langage régulier, on a de bonnes propriétés, ça se comporte bien).

Sinon, pour l'apprentissage, je conseille plutôt les réseaux de neurones, mais on est hors-sujet ;-).

par Sékiltoyai » 25 juil. 2009, 13:48

Bah je n'ai pas compris ton problème avec ma proposition.
Et je comprends pas ton "pour chaque phrase, je crée une grammaire". Tu ne peux pas créer une grammaire à chaque phrase, sinon cela revient à tout faire manuellement.

par doviet » 25 juil. 2009, 13:10

Je ne comprend pas là…
Oups... Qu'est-ce que j'ai mal exprimé? :?

par Sékiltoyai » 25 juil. 2009, 13:02

Je ne comprend pas là…

par doviet » 25 juil. 2009, 12:57

Oui mais tu pourras difficilement écrire toutes les règles de grammaire en une fois. Une langue, c'est autrement plus compliqué que des langages informatiques.
Oh, mais je n'ai jamais dit que je voulais écrire une seule grammaire qui reconnaîtrait plusieurs phrases. C'est pour cela que j'ai demandé comment créer "des automates" mais pas "un automate".
Pour chaque phrase je dois appliquer une grammaire (un automate).
Pour la phrase "Quel temps fait-il à Paris demain?", j'ai la grammaire:
S -> AP SENT VN PP
AP -> PRO:INT
SENT -> NOM
VN -> VER
VN -> ADV
PP -> NP
NP -> NAM
Et pour la phrase "Le chat mange la souris", j'ai:
S -> NP VN NP
NP -> PRP NOM
VN -> VER
Alors pour n'importe quelle phrase, je veux trouver les noms communs (NOM) ou les noms propres (NAM) dans les groupes nominaux (NP), et les verbes (VER) dans les groupes verbaux (VN), par exemple.
Bah ça peut ête très simple. A chaque fois qu'il y a une phrase qu'il ne comprend pas, tu lui rajoutes des règles pour qu'il réussisse à l'intégrer.
Ca peut être très compliqué. Il a des phrases qu'il acceptera à tort et d'autres qu'il refusera à tort, et dans ce cas, tu repasses derrière lui pour lui signaler qu'il avait tort, et il faut programmer le moteur de telle manière qu'il assimile des nouvelles règles en fonction de ce que tu lui as dit. C'est pas impossible à faire mais c'est vrai que ça relève pas mal du datamining et de l'intelligence artificielle.
Voilà, c'est ce que je pensais faire. Pour chaque phrase, je crée une grammaire, et je ferai pour toutes les phrases dans mes corpus de dialogue, c'est déjà pas mal.

par Sékiltoyai » 25 juil. 2009, 12:42

En fait, il te faut des structures types de phrase :
...
Tu vas avoir énormément de cas à traiter.
Oui mais... ce n'est pas pour ça qu'on fait appel aux grammaires?
Oui mais tu pourras difficilement écrire toutes les règles de grammaire en une fois. Une langue, c'est autrement plus compliqué que des langages informatiques.
Ca dépend de l'application, mais si tu peux te permettre de traiter manuellement les cas les plus compliqués dans un premier temps, tu peux mettre en place un algorithme d'apprentissage basique pour ton moteur de règles.
"Un algorithme d'apprentissage basique", à quoi il ressemble?
Bah ça peut ête très simple. A chaque fois qu'il y a une phrase qu'il ne comprend pas, tu lui rajoutes des règles pour qu'il réussisse à l'intégrer.
Ca peut être très compliqué. Il a des phrases qu'il acceptera à tort et d'autres qu'il refusera à tort, et dans ce cas, tu repasses derrière lui pour lui signaler qu'il avait tort, et il faut programmer le moteur de telle manière qu'il assimile des nouvelles règles en fonction de ce que tu lui as dit. C'est pas impossible à faire mais c'est vrai que ça relève pas mal du datamining et de l'intelligence artificielle.

par doviet » 25 juil. 2009, 12:22

En fait, il te faut des structures types de phrase :
...
Tu vas avoir énormément de cas à traiter.
Oui mais... ce n'est pas pour ça qu'on fait appel aux grammaires?
Plus précisément, je ne traite que des phrases dans le domaine de la météo. J'ai plusieurs corpus de dialogue (question-réponse), que je dois pouvoir traiter pour extraire les mots clés importants dans chaque phrase.
Quoi que soit le nombre de phrase que je dois traiter, je voudrais dans un premier temps arriver à traiter quelques phrases du genre: "Quel temps fait-il demain à Paris?" ou "est-ce qu'il va pleuvoir à Paris demain?".
Ca dépend de l'application, mais si tu peux te permettre de traiter manuellement les cas les plus compliqués dans un premier temps, tu peux mettre en place un algorithme d'apprentissage basique pour ton moteur de règles.
"Un algorithme d'apprentissage basique", à quoi il ressemble?

Merci beaucoup!

par Sékiltoyai » 24 juil. 2009, 19:13

En fait, il te faut des structures types de phrase :
- Phrases pronominales.
- sujet verbe_trans cod.
- sujet verbe_etat adjectif.
- pronom_interrogatif verbe sujet (pour une phrase de type interrogative).
Tu vas avoir énormément de cas à traiter. Ca dépend de l'application, mais si tu peux te permettre de traiter manuellement les cas les plus compliqués dans un premier temps, tu peux mettre en place un algorithme d'apprentissage basique pour ton moteur de règles.