web-dev-qa-db-fra.com

Est-il possible pour un ordinateur "d'apprendre" une expression régulière à l'aide d'exemples fournis par l'utilisateur?

Est-il possible pour un ordinateur "d'apprendre" une expression régulière à l'aide d'exemples fournis par l'utilisateur?

Clarifier:

  • Je veux pas vouloir apprendre les expressions régulières.
  • Je veux créer un programme qui "apprend" une expression régulière à partir d'exemples fournis de manière interactive par un utilisateur, peut-être en sélectionnant des parties d'un texte ou en sélectionnant des marqueurs de début ou de fin.

C'est possible? Existe-t-il des algorithmes, des mots clés, etc. pour lesquels je peux utiliser Google?

MODIFIER : Merci pour les réponses, mais je ne suis pas intéressé par les outils qui fournissent cette fonctionnalité. Je recherche des informations théoriques, comme des articles, des tutoriels, du code source, des noms d'algorithmes, afin que je puisse créer quelque chose pour moi.

90
Daniel Rikowski

Le livre An Introduction to Computational Learning Theory contient un algorithme pour l'apprentissage d'un automate fini. Comme chaque langage régulier est équivalent à un automate fini, il est possible d'apprendre quelques expressions régulières par un programme. Kearns et Valiant montre quelques cas où il n'est pas possible d'apprendre un automate fini. Un problème connexe est apprentissage des modèles de Markov cachés , qui sont des automates probabilistes qui peuvent décrire une séquence de caractères. Notez que la plupart des "expressions régulières" modernes utilisées dans les langages de programmation sont en fait plus fortes que les langages réguliers, et donc parfois plus difficiles à apprendre.

41
Yuval F

Oui, c'est possible, nous pouvons générer des expressions rationnelles à partir d'exemples (texte -> extractions souhaitées). Il s'agit d'un outil en ligne qui fait le travail: http://regex.inginf.units.it/

L'outil en ligne Regex Generator ++ génère une expression régulière à partir des exemples fournis à l'aide d'un algorithme de recherche GP. L'algorithme GP est dirigé par une aptitude multi-objectifs qui conduit à des performances plus élevées et à une structure de solution plus simple (le rasoir d'Occam). Cet outil est une application de démonstration du Machine Lerning Lab de l'Université de Trieste (Università degli studi di Trieste). Veuillez regarder le tutoriel vidéo ici .

Il s'agit d'un projet de recherche afin que vous puissiez lire sur les algorithmes utilisés ici .

Voici! :-)

Il est possible de trouver une expression rationnelle/solution significative à partir d'exemples si et seulement si les exemples fournis décrivent bien le problème. Considérez ces exemples qui décrivent une tâche d'extraction, nous recherchons des codes d'article particuliers; les exemples sont des paires texte/extraction:

"The product code is 467-345A" -> "467-345A"
"The item 789-345B is broken"  -> "789-345B"

Un gars (humain), en regardant les exemples, peut dire: "les codes d'article sont des choses comme\d ++ - 345 [AB]"

Lorsque le code d'article est plus permissif mais que nous n'avons pas fourni d'autres exemples, nous n'avons pas de preuves pour bien comprendre le problème. Lors de l'application de la solution générée par l'homme\d ++ - 345 [AB] au texte suivant, elle échoue:

"On the back of the item there is a code: 966-347Z"

Vous devez fournir d'autres exemples, afin de mieux décrire ce qui est une correspondance et ce qui ne l'est pas: --i.e:

"My phone is +39-128-3905 , and the phone product id is 966-347Z" -> "966-347Z"

Le numéro de téléphone n'est pas un identifiant de produit, cela peut être une preuve importante.

40
Fabiano Tarlao

Aucun programme informatique ne pourra jamais générer une expression régulière significative basée uniquement sur une liste de correspondances valides. Permettez-moi de vous montrer pourquoi.

Supposons que vous fournissiez les exemples 111111 et 999999, si l'ordinateur génère:

  1. Une expression régulière correspondant exactement à ces deux exemples: (111111|999999)
  2. Une expression régulière correspondant à 6 chiffres identiques (\d)\1{5}
  3. Un regex correspondant à 6 uns et neuf [19]{6}
  4. Une expression régulière correspondant à 6 chiffres \d{6}
  5. L'un des trois ci-dessus, avec des limites de Word, par ex. \b\d{6}\b
  6. L'un des trois premiers, non précédé ou suivi d'un chiffre, par ex. (?<!\d)\d{6}(?!\d)

Comme vous pouvez le voir, il existe de nombreuses façons de généraliser des exemples en une expression régulière. La seule façon pour l'ordinateur de créer une expression régulière prévisible est de vous demander de répertorier toutes les correspondances possibles . Ensuite, il pourrait générer un modèle de recherche qui correspond exactement à ces correspondances.

Si vous ne souhaitez pas répertorier toutes les correspondances possibles, vous avez besoin d'une description de niveau supérieur. C'est exactement ce que les expressions régulières sont conçues pour fournir. Au lieu de fournir une longue liste de nombres à 6 chiffres, vous dites simplement au programme de faire correspondre "six chiffres quelconques". Dans la syntaxe des expressions régulières, cela devient\d {6}.

Toute méthode permettant de fournir une description de niveau supérieur aussi flexible que les expressions régulières sera également aussi complexe que les expressions régulières. Tous les outils tels que RegexBuddy peuvent faciliter la création et le test de la description de haut niveau. Au lieu d'utiliser directement la syntaxe d'expression régulière laconique, RegexBuddy vous permet d'utiliser des blocs de construction en anglais simple. Mais il ne peut pas créer la description de haut niveau pour vous, car il ne peut pas savoir par magie quand il devrait généraliser vos exemples et quand il ne devrait pas.

Il est certainement possible de créer un outil qui utilise un exemple de texte ainsi que des directives fournies par l'utilisateur pour générer une expression régulière. La difficulté dans la conception d'un tel outil est de savoir comment demander à l'utilisateur les informations de guidage dont il a besoin, sans rendre l'outil plus difficile à apprendre que les expressions régulières elles-mêmes, et sans restreindre l'outil à des travaux d'expression régulière courants ou à de simples expressions régulières.

36
Jan Goyvaerts

Oui, c'est certainement "possible"; Voici le pseudo-code:

string MakeRegexFromExamples(<listOfPosExamples>, <listOfNegExamples>)
{
   if HasIntersection(<listOfPosExamples>, <listOfNegExamples>)
     return <IntersectionError>

   string regex = "";
   foreach(string example in <listOfPosExamples>)
   {
      if(regex != "")
      {
         regex += "|";
      }
      regex += DoRegexEscaping(example);
   }
   regex = "^(" + regex + ")$";

   // Ignore <listOfNegExamples>; they're excluded by definition

   return regex;
}

Le problème est qu'il existe un nombre infini d'expressions rationnelles qui correspondront à une liste d'exemples. Ce code fournit l'expression rationnelle la plus simple/stupide de l'ensemble, correspondant essentiellement à tout dans la liste d'exemples positifs (et rien d'autre, y compris l'un des exemples négatifs).

Je suppose que le vrai défi serait de trouver l'expression rationnelle la plus courte qui correspond à tous les exemples, mais même alors, l'utilisateur devrait fournir de très bonnes entrées pour s'assurer que l'expression résultante était "la bonne".

8

Je crois que le terme est "induction". Vous souhaitez induire une grammaire régulière.

Je ne pense pas que ce soit possible avec un ensemble fini d'exemples (positifs ou négatifs). Mais, si je me souviens bien, cela peut se faire s'il existe un Oracle consultable. (Fondamentalement, vous devez laisser le programme poser des questions oui/non à l'utilisateur jusqu'à ce qu'il soit contenu.)

6
Jay Kominek

Vous voudrez peut-être jouer un peu avec ce site, c'est assez cool et sonne comme quelque chose de similaire à ce dont vous parlez: http://txt2re.com

5
Chad Birch

Il existe un langage dédié à de tels problèmes, basé sur prolog. Cela s'appelle progol .

Comme d'autres l'ont mentionné, l'idée de base est l'apprentissage inductif, souvent appelé ILP ( programmation logique inductive ) dans les cercles de l'IA.

Le deuxième lien est l'article wiki sur ILP, qui contient de nombreuses sources utiles si vous souhaitez en savoir plus sur le sujet.

4
patros

@Yuval est correct. Vous regardez la théorie de l'apprentissage informatique, ou "inférence inductive".

La question est plus compliquée que vous ne le pensez, car la définition de "apprendre" n'est pas anodine. Une définition courante est que l'apprenant peut cracher des réponses quand il le souhaite, mais finalement, il doit soit cesser de cracher des réponses, soit toujours cracher la même réponse. Cela suppose un nombre infini de contributions et ne donne absolument aucune garantie quant au moment où le programme prendra sa décision. En outre, vous ne pouvez pas dire quand il a pris sa décision, car il pourrait toujours produire quelque chose de différent plus tard.

Par cette définition, je suis à peu près sûr que les langues normales peuvent être apprises. Par d'autres définitions, pas tellement ...

2
Brian Postow

J'ai fait des recherches sur Google et CiteSeer et trouvé ces techniques/documents:

Aussi "Apprendre des ensembles réguliers à partir de requêtes et de contre-exemples" de Dana Angluin semble prometteur, mais je n'ai pas pu trouver de PS ou PDF, seulement des citations et des documents de séminaire.

Il semble que ce soit un problème délicat, même au niveau théorique.

2
Daniel Rikowski

S'il est possible pour une personne d'apprendre une expression régulière, il est fondamentalement possible pour un programme. Cependant, ce programme devra être correctement programmé pour pouvoir apprendre. Heureusement, c'est un espace de logique assez limité, donc ce ne serait pas aussi complexe que d'enseigner un programme pour pouvoir voir des objets ou quelque chose comme ça.

0
cjk