Faire des automates avec PHP?

ViPHP
ViPHP | 4674 Messages

21 juil. 2009, 14:36

Qu'est-ce qu'on utilise pour faire fonctionner l'automate? une fonction récursive? une boucle?

Et... on n'a toujours qu'un état initial, non?

Je n'ai suivi que quelques cours de grammaire formelle (un plus, trop théoriques, je n'arrive pas bien à suivre), je ne maitrise pas les théories des automates. Alors je peux te poser des fois des questions très bêtes, j'espère que ça ne te gènera pas.
Alors, une fois que tu as ton automate qui est codé, tu peux avancer avec une boucle oui. Ce sera plus rapide. Mais commence par écrire tes fonctions (ou méthodes) pour coder ton automate. Une fois que c'est codé, on verra comment l'utiliser. Je peux te pondre le code en 30mn, mais ça n'aurait aucun intérêt pour toi. On va y aller étape par étape.
Euh :
1/ T'aurais arrêté hoa ? Et tes utilisateurs ?
2/ Un framework C, pour quoi faire ? Pas des sites Web rassure moi ?
1. Bah PHP me limitait et le C m'attirait, donc je réfléchissais à arrêter Hoa en PHP pour le passer en C. Et mes utilisateurs, euh … bah ils auraient forker Hoa en PHP ^^ ? Ma réflexion n'avait pas été jusque là. Si j'y avais songé plus sérieusement, j'aurais commencé à me poser cette question.
2. Du C pour faire du site Web si. Ça aurait pu être marrant non ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

21 juil. 2009, 19:29

Euh :
1/ T'aurais arrêté hoa ? Et tes utilisateurs ?
2/ Un framework C, pour quoi faire ? Pas des sites Web rassure moi ?
1. Bah PHP me limitait et le C m'attirait, donc je réfléchissais à arrêter Hoa en PHP pour le passer en C. Et mes utilisateurs, euh … bah ils auraient forker Hoa en PHP ^^ ? Ma réflexion n'avait pas été jusque là. Si j'y avais songé plus sérieusement, j'aurais commencé à me poser cette question.
2. Du C pour faire du site Web si. Ça aurait pu être marrant non ?
Euh, bah pour blaguer ouais, pour faire des vrais sites non.
Si on dit que PHP n'est pas adapté pour faire du dev standalone, on va pas derrière dire que le C est adapté pour faire des sites Web. Ce sera immaintenable un site Web en C.

ViPHP
ViPHP | 5924 Messages

21 juil. 2009, 19:30

Qu'est-ce qu'on utilise pour faire fonctionner l'automate? une fonction récursive? une boucle?

Et... on n'a toujours qu'un état initial, non?

Je n'ai suivi que quelques cours de grammaire formelle (un plus, trop théoriques, je n'arrive pas bien à suivre), je ne maitrise pas les théories des automates. Alors je peux te poser des fois des questions très bêtes, j'espère que ça ne te gènera pas.
Alors, une fois que tu as ton automate qui est codé, tu peux avancer avec une boucle oui.
Une boucle ?
Pourquoi pas en fonctionnel ? Ce serait plus simple.

Eléphanteau du PHP | 31 Messages

22 juil. 2009, 04:02

Alors, une fois que tu as ton automate qui est codé, tu peux avancer avec une boucle oui. Ce sera plus rapide. Mais commence par écrire tes fonctions (ou méthodes) pour coder ton automate. Une fois que c'est codé, on verra comment l'utiliser.
Mais si je ne vois pas comment l'utiliser, je ne vois pas non plus comment le coder :?
Je peux te pondre le code en 30mn, mais ça n'aurait aucun intérêt pour toi. On va y aller étape par étape.
Oui, tout à fait d'accord.
Une boucle ?
Pourquoi pas en fonctionnel ? Ce serait plus simple.
En "fonctionnel", comment ce sera?

Merci de votre aide!

ViPHP
ViPHP | 4674 Messages

22 juil. 2009, 10:39

Je t'ai donné ta structure pour tes automates. Il faut réussir à les manipuler. Donc tu fais une fonction : creer_automate(), ajouter_etat(), ajouter_transition(), afficher_automate() etc. Je te conseille de faire un objet, mais ça ne regarde que toi.

Si tu es curieux, tu peux regarder les sources d'un projet que j'ai fait cette année : http://university.android-bay.net/Licen ... ageTheory/. Rien d'incroyable, mais le code est propre, les algorithmes sont bons, et tu as pas mal d'explication. Tu as surtout les structures en C, ce qui peut t'être utile j'imagine. Tu devrais naviguer dans le code, tous les .h, les différents rendus etc.

Si tu es perdu, dis le moi, et je te code un début.

Enfin, en fonctionnel, on pourra le faire aussi, mais ça dépend de ton codage de base. On verra ça par la suite, mais je pensais à une boucle pour une raison de mémoire. En effet, ce sera plus rapide que d'utiliser du fonctionnel, mais c'est un détail …
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 31 Messages

23 juil. 2009, 12:00

Bonjour HyWaN,

Oui, j'avoue que je suis perdu là.
J'ai essayé de lire le code de ton programme, mais il y a beaucoup de fonctions, je n'arrive pas à voir lesquelles sont importantes pour moi de lire.
La seule chose qui m'a beaucoup intéressé, c'est les résultats en PNG. Ils ont été créés par le programme "dot"?

Je ne sais pas faire une application de théorie sur le traitement que je dois faire maintenant. C'est-à-dire, toute l'histoire des états (0, 1, 2...) et des transitions ('a', 'b', 'c'...) ne m'aide pas à voir comment je pourrai créer un automate qui reconnait les mots dans les phrases françaises. J'espère que tu vois un peu mon problème.

A ton avis, est-ce qu'une structure comme ça est bien et peut servir à faire un automate?
Array
(
    [S] => Array
        (
            [AP] => Array
                (
                    [PRO:INT] => quel
                )

            [SENT] => Array
                (
                    [NOM] => temps
                )

            [VN] => Array
                (
                    [VER] => faire:pres
                    [ADV] => demain
                )

            [PP] => Array
                (
                    [NAM] => Paris
                )

        )

)
Je te remercie beaucoup!

ViPHP
ViPHP | 4674 Messages

23 juil. 2009, 12:15

Pour la sortie PNG, oui c'est du langage DOT.

Sinon, si tu veux reconnaître tous les mots français, ça risque de te faire un sacré automate là.
Déjà, tu pensais faire comment au départ ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

23 juil. 2009, 19:10

Oui, tu veux scinder les mots dans une phrase ou faire de l'analyse sémantique de la phrase ?
Parce que le premier se fait sans automate, avec une simple expression régulière (preg_split), d'ailleurs un automate à états finis est une expression régulière. Si tu veux analyser le sens d'une phrase, c'est du domaine de la recherche. A la limite, avec un dico, tu peux obtenir la nature du mot (nom, verbe, etc…), mais t'iras pas beaucoup plus loin…

ViPHP
ViPHP | 4674 Messages

23 juil. 2009, 19:35

C'pour ça que je proposais une regex au début.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

23 juil. 2009, 19:49

C'pour ça que je proposais une regex au début.
Ok, désolé :D

Eléphanteau du PHP | 31 Messages

24 juil. 2009, 04:56

Sinon, si tu veux reconnaître tous les mots français, ça risque de te faire un sacré automate là.
Déjà, tu pensais faire comment au départ ?
Non non, ce n'est pas le travail de reconnaissance de tous les mots français.
En fait, il existe des outils d'étiquettage (tagger) et de truncage (chunker) qui nous facilitent la tâche.
En passant la phrase par un chunker (TreeTagger), j'ai obtenu le résultat que tu as vu ci-dessus.
La phrase est coupée en chunks, chacun de ses chunks porte un nom (qui peut être n'importe quoi, mais dans le cas de TreeTagger, ils ont utilisé les noms dans la grammaire catégorielle, donc SN, NP, VN...).
Mon travail est de trouver les "têtes de chunks", donc les mots qui semblent les plus importants dans la phrase.
Par exemple, la phrase "Le chat mange la souris" peut être coupée en:

Code : Tout sélectionner

[Le chat] [mange] [la souris]. SN VN SN
Dans ces chunks, on a aussi: SN = Dét + N, VN = V
("Dét" = déterminant)
Pour un SN (groupe nominal), je veux récupérer le nom (N).
Et pour un VN (groupe verbal), je veux le verbe (V).
Alors les mots que je souhaite trouver sont: "chat" (N), "mange" (V), "souris" (N).

Pour cela, je peux (ou je dois) appliquer cette grammaire:
S -> SN VN SN
SN -> Det N
VN -> V
Est-ce que tu vois en peu mieux ma situation, HyWaN?
Oui, tu veux scinder les mots dans une phrase ou faire de l'analyse sémantique de la phrase ?
Parce que le premier se fait sans automate, avec une simple expression régulière (preg_split), d'ailleurs un automate à états finis est une expression régulière. Si tu veux analyser le sens d'une phrase, c'est du domaine de la recherche. A la limite, avec un dico, tu peux obtenir la nature du mot (nom, verbe, etc…), mais t'iras pas beaucoup plus loin…
Oui c'est ça, un analyse sémantique de la phrase.
Comme tu as vu, il y a déjà un dictionnaire derrière le chunker, ce n'est plus à moi d'y penser. Avec un chunker, j'ai les chunks. Le problème maintenant, c'est de créer des automates pour parcourir ces chunks et trouver les mots importants dans la phrase. Est-ce que tu as une idée?

Merci beaucoup, HyWaN et Sékiltoyai!

ViPHP
ViPHP | 5924 Messages

24 juil. 2009, 09:18

Ce n'est pas une analyse sémantique alors, c'est une analyse grammaticale.
Alors du coup en effet ce que tu dis est possible. C'est exactement le même concept que pour un langage :
Avec un automate, on identifie les tokens (éléments indivisibles comme des mots, des ponctuations) : C'est une analyse lexicale.
Avec un dictionnaire, on vérifie que ces tokens appartiennent au langage et on leur donne un type (nom, verbe, point) : C'est la deuxième partie de l'analyse lexicale.
Avec une grammaire, on vérifie que les phrases son correctes et on abstrait leur représentation : C'est l'analyse gramaticale.
L'analyse du sens vient après.

Sur un plan pratique, le plus strict serait un automate, mais pour faire rapide j'aurais divisé les phrases à coup de explode ou de preg_split(). Tu dois pouvoir trouver une technique pour associer une étiquette à chaque phrase explodée (phrase exclamative, interrogative, etc). Tu divises ensuite chaque phrase selon les virgules, en expressions.
Tu divises chaque expression selon les espaces et caractères blancs pour avoir les mots. Tu peux d'ores et déjà foutre les mots dans une structure de données, pour les gérer plus facilement. Tu en profite pour faire la deuxième partie en même temps, à chaque fois, tu regardes les types potentiels de ce mot dans le dico et tu donnes à ton mot sa liste de types.
A ce moment tu as une liste de phrases typées, qui sont une liste d'expressions, qui sont une liste de mots typés. Tu fais l'analyse grammaticale en fonction de ta grammaire, tu enregistres le résultat et c'est fini.

ViPHP
ViPHP | 4674 Messages

24 juil. 2009, 10:39

Je vais appuyer Sékil' sur ce coup. Dans la théorie, il te faudrait coder un automate. Dans la pratique, les expressions régulières (qui sont des automates hein, faut pas l'oublier …) de PHP (en fait, de Perl) seront tout à fait suffisantes.

En Java, il existe JJTree et JavaCC qui te permettent de réaliser ce travail plus facilement. Ils ont un langage grammatical que JavaCC comprend et sait transformer en code pour avoir un lexer et un parser. Ensuite, le résultat sort sous forme JJTree où chaque nœud et feuille sont des tokens de ta grammaire.
En PHP, il n'existe rien. Ça fait un moment que je songe à me lancer là-dedans, mais je réfléchis à pas mal de chose. JavaCC a beaucoup de limitations. Le mieux est Yacc (ou Bison) car ils supportent des grammaires d'ordre supérieure (comprendre, algébriques), la grande classe. D'ailleurs, le compilateur PHP est fait avec Bison (pour info').

Ta grammaire tu l'as. C'est déjà un bon point. Mais elle est encore trop peu précise.
Tu as ton état initial S j'imagine, alors :

Code : Tout sélectionner

S -> SN VN SN SN -> Det N VN -> V
Il faut préciser la forme de Det, N et V, donc tu as doit avoir au moins trois règles de productions supplémentaires :

Code : Tout sélectionner

S -> SN VN SN SN -> Det N VN - > V Det -> ??? N -> ??? V -> ???
Commence à faire ça sur papier (et sur le forum ;-)) avant de commencer le codage. Dans ce genre de problème, le codage se fait réellement à la fin et ne te prend que 5% de ton temps. Crois-moi ;-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 31 Messages

24 juil. 2009, 13:42

Mais Det, N et V sont déjà des terminaux, non?
Ou est-ce que tu veux dire qu'il faudra faire ça aussi:
Det -> le
Det -> la
N -> chat
N -> souris
V -> mange
?

En tout cas, je ne peux pas commencer à programmer, tant que je ne comprends pas comment ça fonctionne :(

ViPHP
ViPHP | 4674 Messages

24 juil. 2009, 13:54

Ah, tu crées un automate par phrase … Mais tu ne les connais pas à l'avance justement … enfin, c'est ce que j'ai compris de ton problème.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).