Il existe un algorithme qui fait exactement cela pour les exemples positifs.
L'expression régulière est équivalente à DFA (Deterministic Finite Automata). La stratégie est la plupart du temps toujours la même:
Regardez Alergia (pour la théorie) et l'algorithme MDI (pour une utilisation réelle) si générer un automate déterministe est suffisant.
L'algorithme Alergia et MDI sont tous deux décrits ici: http://www.info.ucl.ac.be/~pdupont/pdupont/pdf/icml2k.pdf
Si vous voulez générer des modèles plus petits, vous pouvez utiliser un autre algorithme. L'article décrit est ici: http://www.grappa.univ-lille3.fr/~lemay/publi/TCS02.ps.gz
Sa page d'accueil est ici: http://www.grappa.univ-lille3.fr/~lemay
Si vous souhaitez utiliser exemple négatif, je vous suggère d'utiliser une règle simple (coloration) qui empêchent deux états du DFA être fusionné.
Si vous posez la question à ces personnes, je suis sûr qu'elles partageront leur source de code.
J'ai fait le même type d'algorithme pendant mon doctorat. pour les automates probabilistes. Cela signifie que vous pouvez associer une probabilité à chaque chaîne, et j'ai créé un programme C++ qui "apprend" des automates pondérés.
Principalement ces travaux d'algorithme comme ça:
d'exemples positifs: {abb, aba, abbb}
créer la DFA simple qui acceptent exactement tous ces exemples:
-> x -- a --> (y) -- b --> (z)
\
b --> t -- b --> (v)
x catifs Je dois dire y en lisant la lettre «a» par exemple. Les états sont x, y, z, t et v. (Z) signifie que c'est un état fini.
puis « fusion » états du DFA:. (Ici par exemple le résultat après la fusion des états y et t
_
/\
v | a,b (<- this is a loop :-))
x -- a -> (y,t) _/
le nouvel état (y, t) est un état terminal obtenir en fusionnant y et Maintenant, le DFA peut accepter: a (a | b) * et il est facile de construire l'expression régulière à partir de l'AFD
un choix qui fait la différence entre les algorithmes
XD. J'ai juste dans mon esprit l'utilisateur qui entre une entrée acceptée comme "Doit correspondre" bob ',' charlie 'et' grant '", et le générateur d'expression rationnelle crache" REGEXP = bob | charlie | grant ". > _>. – Stephen
@Stephen c'est aussi ma préoccupation, c'est pourquoi je cherche une entrée: P –
Peut-être qu'un algorithme génétique pourrait donner des points pour des expressions plus courtes ... –