È possibile che un computer "apprenda" un'espressione regolare tramite esempi forniti dall'utente?


95

È possibile che un computer "apprenda" un'espressione regolare tramite esempi forniti dall'utente?

Chiarire:

  • Io non voglio imparare le espressioni regolari.
  • Voglio creare un programma che "impara" un'espressione regolare da esempi forniti in modo interattivo da un utente, magari selezionando parti da un testo o selezionando marcatori di inizio o fine.

È possibile? Esistono algoritmi, parole chiave, ecc. Per i quali posso utilizzare Google?

EDIT : Grazie per le risposte, ma non sono interessato agli strumenti che forniscono questa funzionalità. Sto cercando informazioni teoriche, come documenti, tutorial, codice sorgente, nomi di algoritmi, in modo da poter creare qualcosa per me stesso.


4
Sono sorpreso che nessuno abbia menzionato Regex :: PreSuf
tripleee

Risposte:


44

Il libro An Introduction to Computational Learning Theory contiene un algoritmo per l'apprendimento di un automa finito. Poiché ogni linguaggio regolare è equivalente a un automa finito, è possibile apprendere alcune espressioni regolari da un programma. Kearns e Valiant mostrano alcuni casi in cui non è possibile imparare un automa finito. Un problema correlato è l' apprendimento dei modelli di Markov nascosti , che sono automi probabilistici in grado di descrivere una sequenza di caratteri. Si noti che la maggior parte delle "espressioni regolari" moderne utilizzate nei linguaggi di programmazione sono in realtà più forti dei linguaggi normali e quindi a volte più difficili da imparare.


43

Sì, è possibile, possiamo generare regex da esempi (testo -> estrazioni desiderate). Questo è uno strumento online funzionante che fa il lavoro: http://regex.inginf.units.it/

Lo strumento online Regex Generator ++ genera un'espressione regolare dagli esempi forniti utilizzando un algoritmo di ricerca GP. L'algoritmo GP è guidato da un fitness multiobiettivo che porta a prestazioni più elevate e struttura della soluzione più semplice (Razor di Occam). Questo strumento è un'applicazione dimostrativa del Machine Lerning Lab, Università di Trieste (Università degli studi di Trieste). Guarda il video tutorial qui .

Questo è un progetto di ricerca, quindi puoi leggere gli algoritmi utilizzati qui .

Guarda! :-)

Trovare una regex / soluzione significativa dagli esempi è possibile se e solo se gli esempi forniti descrivono bene il problema. Considera questi esempi che descrivono un'attività di estrazione, stiamo cercando codici articolo particolari; gli esempi sono coppie testo / estrazione:

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

Un ragazzo (umano), guardando gli esempi, potrebbe dire: "i codici oggetto sono cose come \ d ++ - 345 [AB]"

Quando il codice dell'articolo è più permissivo ma non abbiamo fornito altri esempi, non abbiamo prove per comprendere bene il problema. Quando si applica la soluzione generata dall'uomo \ d ++ - 345 [AB] al testo seguente, non riesce:

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

Devi fornire altri esempi, al fine di descrivere meglio cosa è una corrispondenza e cosa non è una corrispondenza desiderata: --ie:

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

Il numero di telefono non è un ID prodotto, potrebbe essere una prova importante.


4
Questa dovrebbe essere la risposta migliore. È possibile, e questo lo dimostra. La fonte è disponibile qui: github.com/MaLeLabTs/RegexGenerator
rjurney

Il tuo esempio dei codici di prodotto illustra perché detto umano dovrebbe cercare le specifiche per i codici di prodotto e scrivere l'espressione regolare in base alla specifica, piuttosto che cercare di dedurre la regex da un insieme limitato di codici di prodotto campione (indipendentemente dal fatto che una persona o un programma sta cercando di dedurre la regex).
Jan Goyvaerts

2
Questo è il modo giusto per fare le cose. Il mio esempio è solo un modo per spiegare concettualmente il problema. A volte non ci sono specifiche o il ragazzo semplicemente non è in grado di scrivere l'espressione regolare (mancanza di conoscenza) da solo.
Fabiano Tarlao

Per essere più precisi e inequivocabili :-), "Questo è il modo giusto di fare le cose" -> "Hai ragione, il tuo è il miglior modo di fare le cose, dovresti sempre partire dalle specifiche quando possibile"
Fabiano Tarlao

2
L'articolo "Inference di espressioni regolari per il testo Estrazione da Esempi" contiene una spiegazione dettagliata dell'algoritmo machinelearning.inginf.units.it/publications/...
mimmuz

36

Nessun programma per computer sarà mai in grado di generare un'espressione regolare significativa basata esclusivamente su un elenco di corrispondenze valide. Lascia che ti mostri il motivo.

Supponiamo di fornire gli esempi 111111 e 999999, se il computer genera:

  1. Una regex che corrisponde esattamente a questi due esempi: (111111|999999)
  2. Una regex che corrisponde a 6 cifre identiche (\d)\1{5}
  3. Una regex che abbina 6 unità e nove [19]{6}
  4. Una regex che corrisponde a qualsiasi 6 cifre \d{6}
  5. Uno qualsiasi dei tre precedenti, con i confini delle parole, ad es \b\d{6}\b
  6. Uno qualsiasi dei primi tre, non preceduto o seguito da una cifra, ad es (?<!\d)\d{6}(?!\d)

Come puoi vedere, ci sono molti modi in cui gli esempi possono essere generalizzati in un'espressione regolare. L'unico modo in cui il computer può creare un'espressione regolare prevedibile è richiedere di elencare tutte le corrispondenze possibili. Quindi potrebbe generare un modello di ricerca che corrisponde esattamente a quelle corrispondenze.

Se non vuoi elencare tutte le possibili corrispondenze, hai bisogno di una descrizione di livello superiore. Questo è esattamente ciò che le espressioni regolari sono progettate per fornire. Invece di fornire un lungo elenco di numeri a 6 cifre, si dice semplicemente al programma di abbinare "qualsiasi sei cifre". Nella sintassi delle espressioni regolari, diventa \ d {6}.

Qualsiasi metodo per fornire una descrizione di livello superiore che sia flessibile come le espressioni regolari sarà anche complesso come le espressioni regolari. Tutti gli strumenti come RegexBuddy possono fare è semplificare la creazione e il test della descrizione di alto livello. Invece di utilizzare direttamente la sintassi concisa delle espressioni regolari, RegexBuddy consente di utilizzare semplici blocchi predefiniti in inglese. Ma non può creare la descrizione di alto livello per te, dal momento che non può sapere magicamente quando dovrebbe generalizzare i tuoi esempi e quando non dovrebbe.

È certamente possibile creare uno strumento che utilizzi un testo di esempio insieme alle linee guida fornite dall'utente per generare un'espressione regolare. La parte difficile nella progettazione di uno strumento di questo tipo è come chiede all'utente le informazioni di guida di cui ha bisogno, senza rendere lo strumento più difficile da apprendere rispetto alle espressioni regolari stesse e senza limitare lo strumento a lavori regex comuni oa semplici espressioni regolari.


Hai ragione, molti algoritmi di apprendimento che ho trovato dopo aver pubblicato la mia domanda richiedono informazioni positive e negative. Per quanto ne so, una "descrizione di livello superiore" esplicita non è necessaria, perché l'utente la fornisce rispondendo alle domande.
Daniel Rikowski

Se uno strumento pone domande, la combinazione delle domande e delle risposte fornite forma la descrizione di livello superiore. La qualità di tali strumenti dipende in gran parte dalle domande che pone.
Jan Goyvaerts

È stupido perché se fornisci un altro esempio, puoi eliminare alcune di queste possibilità. Un altro esempio elimina di più.
Cris

2
@ Cris: il principio rimane, indipendentemente dal numero di campioni forniti. Cambia semplicemente le possibilità. Ad esempio, l'aggiunta di 123456 cambia il numero 2 in (\ d) \ 1 {5} | 123456 e il numero 3 in [19] {6} | 123456. Oppure potrebbe cambiare # 3 in [1-69] {6}. Potrebbe anche essere che il modello desiderato corrisponda a 6 cifre identiche o 6 cifre in cui ogni cifra è maggiore di una rispetto alla cifra precedente. Anche se fornisci 10.000 campioni di numeri a 6 cifre, il programma non è in grado di distinguere tra # 1, # 4, # 5 o # 6 senza istruzioni aggiuntive da parte dell'utente.
Jan Goyvaerts

Mi sembra che questo problema possa essere facilmente risolto come segue: il programma cerca di essere il più generale possibile (entro limiti ragionevoli) e quindi fornisce esempi di altre cose che pensa possano corrispondere. Dicendogli semplicemente "sì" e "no" alle corrispondenze proposte, potresti aiutarlo a capire i limiti di ciò che stai effettivamente cercando di catturare. Mi piacerebbe vedere uno strumento in un editor di testo che usasse questo concetto e proponesse corrispondenze dal file attualmente aperto.
Jon McClung

9

Sì, è certamente "possibile"; Ecco lo pseudo codice:

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;
}

Il problema è che esiste un numero infinito di regex che corrisponderanno a un elenco di esempi. Questo codice fornisce la regex più semplice / stupida del set, fondamentalmente facendo corrispondere qualsiasi cosa nell'elenco di esempi positivi (e nient'altro, incluso uno qualsiasi degli esempi negativi).

Suppongo che la vera sfida sarebbe trovare la regex più breve che corrisponda a tutti gli esempi, ma anche in questo caso l'utente dovrebbe fornire ottimi input per assicurarsi che l'espressione risultante sia "quella giusta".


3
Inizia a diventare interessante quando l'utente inserisce campioni positivi e negativi . L'espressione regolare dovrebbe abbinare i campioni positivi e non corrispondere a quelli negativi.
user55400

@blixtor - In realtà, è abbastanza facile. Basta non inserire nessuno degli esempi negativi nella regex costruita e verranno rifiutati. Ricorda, quello creato dal codice corrisponde solo a un esempio positivo; gli esempi negativi (e quant'altro) sono esclusi per definizione!
Daniel LeCheminant

Daniel ha ragione. Senza una descrizione di livello superiore, un elenco di alternative è tutto ciò che può essere dedotto in modo coerente e accurato da un elenco di esempi.
Jan Goyvaerts

6

Credo che il termine sia "induzione". Vuoi indurre una grammatica regolare.

Non credo sia possibile con un insieme finito di esempi (positivi o negativi). Ma, se ricordo bene, può essere fatto se c'è un Oracle che può essere consultato. (Fondamentalmente dovresti lasciare che il programma chieda all'utente domande sì / no fino a quando non fosse contenuto.)


Sì, è quello che voglio fare, chiedi all'utente in modo interattivo.
Daniel Rikowski

I riferimenti di Yuval F sembrano essere ciò che avevo in mente, suggerirei di dare un'occhiata a quelli.
Jay Kominek

5

Potresti voler giocare un po 'con questo sito, è piuttosto interessante e sembra che faccia qualcosa di simile a quello di cui stai parlando: http://txt2re.com


4

C'è un linguaggio dedicato a problemi come questo, basato sul prologo. Si chiama progol .

Come altri hanno già detto, l'idea di base è l'apprendimento induttivo, spesso chiamato ILP ( programmazione logica induttiva ) nei circoli di intelligenza artificiale.

Il secondo collegamento è l'articolo wiki su ILP, che contiene molto materiale utile se sei interessato a saperne di più sull'argomento.


2

@Yuval è corretto. Stai guardando alla teoria dell'apprendimento computazionale, o "inferenza induttiva".

La domanda è più complicata di quanto pensi, in quanto la definizione di "impara" non è banale. Una definizione comune è che lo studente può sputare risposte ogni volta che vuole, ma alla fine deve smettere di sputare risposte o sputare sempre la stessa risposta. Ciò presuppone un numero infinito di input e non fornisce assolutamente alcuna garanzia su quando il programma raggiungerà la sua decisione. Inoltre, non puoi dire quando ha preso la sua decisione perché potrebbe ancora produrre qualcosa di diverso in seguito.

Secondo questa definizione, sono abbastanza sicuro che le lingue normali siano apprendibili. Secondo altre definizioni, non tanto ...



0

Se è possibile per una persona imparare un'espressione regolare, allora è fondamentalmente possibile per un programma. Tuttavia, quel programma dovrà essere programmato correttamente per essere in grado di apprendere. Fortunatamente questo è uno spazio logico abbastanza finito, quindi non sarebbe così complesso come insegnare a un programma per essere in grado di vedere oggetti o qualcosa del genere.


1
Non è vero, dovresti cercare problemi che sono indecidibili sulle macchine di Turing.
Stephen Curial

Per essere onesti, ho detto che se una persona può imparare un REGEX, allora può farlo una macchina. Non lo intendevo in generale.
cjk

@scurial Non penso ci siano problemi che si sono dimostrati risolvibili dalle persone ma indecidibili sulle macchine turing, vero?
Sunny88
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.