Ist es einem Computer möglich, einen regulären Ausdruck anhand von vom Benutzer bereitgestellten Beispielen zu "lernen"?
Zu klären:
- Ich möchte keine regulären Ausdrücke lernen.
- Ich möchte ein Programm erstellen, das einen regulären Ausdruck aus Beispielen "lernt", die von einem Benutzer interaktiv bereitgestellt werden, möglicherweise durch Auswahl von Teilen aus einem Text oder Auswahl von Anfangs- oder Endmarkierungen.
Ist es möglich? Gibt es Algorithmen, Schlüsselwörter usw., für die ich Google verwenden kann?
EDIT : Vielen Dank für die Antworten, aber ich bin nicht an Tools interessiert, die diese Funktion bieten . Ich suche nach theoretischen Informationen wie Artikeln, Tutorials, Quellcode und Namen von Algorithmen, damit ich etwas für mich selbst erstellen kann.
regex
artificial-intelligence
theory
automata
Daniel Rikowski
quelle
quelle
Antworten:
Das Buch Eine Einführung in die rechnergestützte Lerntheorie enthält einen Algorithmus zum Lernen eines endlichen Automaten. Da jede reguläre Sprache einem endlichen Automaten entspricht, ist es möglich, einige reguläre Ausdrücke von einem Programm zu lernen. Kearns und Valiant zeigen einige Fälle, in denen es nicht möglich ist, einen endlichen Automaten zu lernen. Ein verwandtes Problem ist das Lernen versteckter Markov-Modelle , bei denen es sich um probabilistische Automaten handelt, die eine Zeichenfolge beschreiben können. Beachten Sie, dass die meisten modernen "regulären Ausdrücke", die in Programmiersprachen verwendet werden, tatsächlich stärker als reguläre Sprachen sind und daher manchmal schwerer zu lernen sind.
quelle
Ja, es ist möglich, wir können reguläre Ausdrücke aus Beispielen generieren (Text -> gewünschte Extraktionen). Dies ist ein funktionierendes Online-Tool, das die Aufgabe erfüllt: http://regex.inginf.units.it/
Das Online-Tool Regex Generator ++ generiert einen Regex aus den bereitgestellten Beispielen mithilfe eines GP-Suchalgorithmus. Der GP-Algorithmus basiert auf einer multiobjektiven Fitness, die zu einer höheren Leistung und einer einfacheren Lösungsstruktur führt (Occam's Razor). Dieses Tool ist eine demostrative Anwendung des Machine Lerning Lab der Universität Triest (Università degli studi di Trieste). Bitte schauen Sie sich das Video-Tutorial hier an .
Dies ist ein Forschungsprojekt , so dass Sie über Algorithmen lesen hier .
Erblicken! :-)
Das Finden einer aussagekräftigen Regex / Lösung aus Beispielen ist nur dann möglich, wenn die bereitgestellten Beispiele das Problem gut beschreiben. Betrachten Sie diese Beispiele, die eine Extraktionsaufgabe beschreiben. Wir suchen nach bestimmten Artikelcodes. Die Beispiele sind Text / Extraktions-Paare:
Ein (menschlicher) Typ, der sich die Beispiele ansieht, kann sagen: "Die Artikelcodes sind Dinge wie \ d ++ - 345 [AB]."
Wenn der Artikelcode freizügiger ist, wir jedoch keine anderen Beispiele angegeben haben, haben wir keine Beweise, um das Problem gut zu verstehen. Wenn die vom Menschen generierte Lösung \ d ++ - 345 [AB] auf den folgenden Text angewendet wird, schlägt dies fehl:
Sie müssen andere Beispiele angeben, um besser beschreiben zu können, was eine Übereinstimmung ist und was keine gewünschte Übereinstimmung ist: --ie:
Die Telefonnummer ist keine Produkt-ID, dies kann ein wichtiger Beweis sein.
quelle
Kein Computerprogramm wird jemals in der Lage sein, einen aussagekräftigen regulären Ausdruck zu generieren, der ausschließlich darauf basiert auf einer Liste gültiger Übereinstimmungen . Lass mich dir zeigen warum.
Angenommen, Sie geben die Beispiele 111111 und 999999 an, falls der Computer Folgendes generiert:
(111111|999999)
(\d)\1{5}
[19]{6}
\d{6}
\b\d{6}\b
(?<!\d)\d{6}(?!\d)
Wie Sie sehen, gibt es viele Möglichkeiten, Beispiele in einen regulären Ausdruck zu verallgemeinern. Die einzige Möglichkeit für den Computer, einen vorhersehbaren regulären Ausdruck zu erstellen, besteht darin, dass Sie alle möglichen Übereinstimmungen auflisten müssen. Dann könnte es ein Suchmuster erzeugen, das genau diesen Übereinstimmungen entspricht.
Wenn Sie nicht alle möglichen Übereinstimmungen auflisten möchten, benötigen Sie eine übergeordnete Beschreibung. Genau dafür sollen reguläre Ausdrücke sorgen. Anstatt eine lange Liste mit 6-stelligen Zahlen anzugeben, weisen Sie das Programm einfach an, mit "sechs Ziffern" übereinzustimmen. In der Syntax regulärer Ausdrücke wird dies zu \ d {6}.
Jede Methode zur Bereitstellung einer übergeordneten Beschreibung, die so flexibel ist wie reguläre Ausdrücke, ist auch so komplex wie reguläre Ausdrücke. Alle Tools wie RegexBuddy können das Erstellen und Testen der allgemeinen Beschreibung vereinfachen. Anstatt die knappe Syntax für reguläre Ausdrücke direkt zu verwenden, können Sie mit RegexBuddy einfache englische Bausteine verwenden. Es kann jedoch keine allgemeine Beschreibung für Sie erstellen, da es nicht auf magische Weise wissen kann, wann es Ihre Beispiele verallgemeinern sollte und wann nicht.
Es ist sicherlich möglich, ein Tool zu erstellen, das Beispieltext zusammen mit den vom Benutzer bereitgestellten Richtlinien verwendet, um einen regulären Ausdruck zu generieren. Der schwierige Teil beim Entwerfen eines solchen Tools besteht darin, wie der Benutzer nach den benötigten Leitinformationen gefragt wird, ohne dass das Tool schwieriger zu erlernen ist als reguläre Ausdrücke selbst und ohne das Tool auf allgemeine Regex-Jobs oder einfache reguläre Ausdrücke zu beschränken.
quelle
Ja, es ist sicherlich "möglich"; Hier ist der Pseudocode:
Das Problem ist, dass es unendlich viele Regexs gibt, die einer Liste von Beispielen entsprechen. Dieser Code bietet den einfachsten / dümmsten regulären Ausdruck in der Menge und stimmt im Grunde mit allem in der Liste der positiven Beispiele überein (und nichts anderes, einschließlich eines der negativen Beispiele).
Ich nehme an, die eigentliche Herausforderung wäre es, den kürzesten regulären Ausdruck zu finden, der allen Beispielen entspricht, aber selbst dann müsste der Benutzer sehr gute Eingaben machen, um sicherzustellen, dass der resultierende Ausdruck "der richtige" ist.
quelle
Ich glaube, der Begriff ist "Induktion". Sie möchten eine reguläre Grammatik einführen.
Ich denke nicht, dass es mit einer endlichen Reihe von Beispielen (positiv oder negativ) möglich ist. Aber wenn ich mich richtig erinnere, kann es gemacht werden, wenn es ein Oracle gibt, das konsultiert werden kann. (Grundsätzlich müsste das Programm dem Benutzer Ja / Nein-Fragen stellen lassen, bis es zufrieden ist.)
quelle
Vielleicht möchten Sie ein bisschen mit dieser Seite spielen, sie ist ziemlich cool und klingt so, als würde sie etwas Ähnliches tun wie das, worüber Sie sprechen: http://txt2re.com
quelle
Es gibt eine Sprache für solche Probleme, die auf Prolog basiert. Es heißt Progol .
Wie andere bereits erwähnt haben, ist die Grundidee das induktive Lernen, das in KI-Kreisen häufig als ILP ( Inductive Logic Programming ) bezeichnet wird.
Der zweite Link ist der Wiki-Artikel zu ILP, der viele nützliche Quellen enthält, wenn Sie mehr über das Thema erfahren möchten.
quelle
@ Yuval ist richtig. Sie betrachten die Theorie des rechnergestützten Lernens oder "induktive Inferenz".
Die Frage ist komplizierter als Sie denken, da die Definition von "lernen" nicht trivial ist. Eine gebräuchliche Definition ist, dass der Lernende Antworten ausspucken kann, wann immer er will, aber schließlich muss er entweder aufhören, Antworten auszuspucken, oder immer dieselbe Antwort ausspucken. Dies setzt eine unendliche Anzahl von Eingaben voraus und gibt absolut keinen Hinweis darauf, wann das Programm seine Entscheidung treffen wird. Außerdem können Sie nicht sagen, wann es seine Entscheidung getroffen hat, da es später möglicherweise noch etwas anderes ausgibt.
Nach dieser Definition bin ich mir ziemlich sicher, dass reguläre Sprachen lernbar sind. Nach anderen Definitionen nicht so sehr ...
quelle
Ich habe einige Nachforschungen über Google und CiteSeer angestellt und folgende Techniken / Artikel gefunden:
Auch Dana Angluins "Lernen regelmäßiger Sets aus Abfragen und Gegenbeispielen" scheint vielversprechend, aber ich konnte keine PS- oder PDF-Version finden, sondern nur Zitate und Seminararbeiten.
Es scheint, dass dies selbst auf theoretischer Ebene ein heikles Problem ist.
quelle
Wenn es einer Person möglich ist, einen regulären Ausdruck zu lernen, ist es für ein Programm grundsätzlich möglich. Dieses Programm muss jedoch korrekt programmiert sein, um lernen zu können. Glücklicherweise ist dies ein ziemlich begrenzter Raum der Logik, daher wäre es nicht so komplex wie das Unterrichten eines Programms, um Objekte oder ähnliches sehen zu können.
quelle