Auswählen des fließendsten Textes aus einer Reihe von Möglichkeiten über Grammatiküberprüfung (Python)

StackOverflow https://stackoverflow.com/questions/8842817

Frage

Ein Hintergrund

Ich bin Literaturstudentin am New College of Florida, der derzeit an einem übermäßig ehrgeizigen kreativen Projekt arbeitet. Das Projekt ist auf die algorithmische Generation von Poesie ausgerichtet. Es ist in Python geschrieben. Mein Wissen in Python und das Wissen über natürliche Sprachen entstehen nur, wenn ich mir Dinge über das Internet unterrichtet. Ich habe ungefähr ein Jahr lang mit diesem Zeug gearbeitet, also bin ich nicht hilflos, aber an verschiedenen Punkten hatte ich Probleme, in diesem Projekt voranzukommen. Derzeit trete ich in die endgültigen Entwicklungsphasen ein und habe eine kleine Straßensperre erreicht.

Ich muss irgendeine Form der grammatikalischen Normalisierung implementieren, damit die Ausgabe nicht als nicht konjugiertes/gebrochenes Höhlenmensch spielt. Vor ungefähr einem Monat einige freundliche Leute darauf gab mir einige Ratschläge, wie ich dieses Problem lösen könnte durch Verwendung eines NGRAM -Sprachmodeller, Grundsätzlich - aber ich suche nach anderen Lösungen, da es so aussieht, (Die Möglichkeiten des POS-Tagging wurden ebenfalls erwähnt, aber mein Text ist möglicherweise zu fragmentarisch und seltsam für eine Umsetzung von solchen, um angesichts meiner Amateur-Ness leicht zu werden.)

Vielleicht brauche ich so etwas wie ATD, aber hoffentlich weniger komplex

Ich denke, ich brauche etwas, das funktioniert wie Nach der Frist oder Queequeg, aber keiner von diesen scheint genau richtig zu sein. Queequeg passt wahrscheinlich nicht gut - es wurde 2003 für Unix geschrieben und ich kann es nicht für das Leben meines Lebens unter Windows zum Laufen bringen (habe alles ausprobiert). Aber ich mag, dass alles, worauf es überprüft, die ordnungsgemäße Verb -Konjugation und -zahlvereinbarung ist.

Andererseits ist ATD viel strenger und bietet mehr Fähigkeiten als ich brauche. Aber ich kann das nicht bekommen Python -Bindungen denn es funktioniert. (Ich erhalte 502 Fehler vom ATD -Server, was ich sicher einfach zu beheben ist, aber meine Anwendung wird online sein, und ich würde es eher vermeiden, abhängig von einem anderen Server. Ich kann es mir nicht leisten, einen ATD -Server auszuführen Ich selbst, weil die Anzahl der "Dienste" meine Bewerbung für meinen Webhost erfordern wird, droht bereits Probleme, diese Anwendung billig zu hüten.)

Dinge, die ich vermeiden möchte

Das Aufbau von Ngram -Sprachmodellen selbst scheint für die Aufgabe nicht richtig zu sein. Meine Anwendung wirft viel unbekanntes Vokabular und verzerrt alle Ergebnisse. (Es sei denn, ich benutze einen Korpus, der so groß ist, dass es für meine Anwendung viel zu langsam läuft - die Anwendung muss ziemlich bissig sein.)

Die Grammatik streng zu überprüfen, ist weder für die Aufgabe das Richtige. Die Grammatik muss nicht perfekt sein, und die Sätze müssen nicht sinnvoller sein als die Art von englischähnlichem Ausfall, die Sie mit NGRAMS erzeugen können. Auch wenn es ausspült ist, muss ich nur Verb -Konjugation, Zahlenvereinbarung durchsetzen und Dinge wie zusätzliche Artikel entfernen.

Tatsächlich brauche ich keine Art von irgendwelche Art von Anregungen für Korrekturen. Ich denke, alles was ich brauche, ist, dass etwas auffällt, wie viele Fehler in jedem Satz in einer Gruppe möglicher Sätze zu sein scheinen, damit ich nach ihrer Punktzahl sortieren und die mit den geringsten grammatikalischen Problemen auswählen kann.

Eine einfache Lösung? Bewertung der Sprachgebrauch durch Erkennung offensichtlicher Fehler

Wenn ein Drehbuch vorhanden ist, das sich um all das kümmert, wäre ich überglücklich (ich habe noch keinen gefunden). Ich kann Code für das schreiben, was ich natürlich nicht finden kann. Ich suche Ratschläge, wie ich meinen Ansatz optimieren kann.

Nehmen wir an, wir haben bereits ein bisschen Text angelegt:

existing_text = "The old river"

Nehmen wir nun an, mein Drehbuch muss herausfinden, welche Beugung des Verbs "zu beergte" als nächstes kommen könnte. Ich bin offen für Vorschläge zu dieser Routine. Aber ich brauche Hilfe hauptsächlich mit Schritt 2, Bewertung der Flüssigkeit durch zahlreiche grammatikalische Fehler:

  1. Verwenden Sie die Verb -Konjugationsmethoden in Nodebox Linguistics alle Konjugationen dieses Verbs zu finden; ['bear', 'bears', 'bearing', 'bore', 'borne'].
  2. Über die Möglichkeiten wiederholen, (flach) die Grammatik der Schnur überprüft, die aus existing_text + " " + possibility ("Der alte Flussbär", "Der alte Flussbären" usw.). Zählen Sie die Fehleranzahl für jede Konstruktion. In diesem Fall wäre die einzige Konstruktion, die einen Fehler aufwirft, anscheinend "der alte Flussbär".
  3. Das Abwickeln sollte einfach sein ... der Möglichkeiten mit der niedrigsten Fehleranzahl, zufällig auszuwählen.
War es hilfreich?

Lösung

Grammatiküberprüfung mit Link Grammatik

Intro, um Grammatik zu verknüpfen

Link Grammar, entwickelt von Davy Temperley, Daniel Sleator und John Lafferty, ist ein syntaktischer Parser des Englischen: "Bei einem Satz weist das System eine syntaktische Struktur zu, die aus einer Reihe von markierten Links besteht, die Paare von Wörtern verbinden. Parser erzeugt auch eine "Bestandteil" Repräsentation eines Satzes (zeigt Substantivphrasen, Verbphrasen usw.). " Du kannst Lesen Sie mehr über die Link -Grammatik und Interagieren Sie hier mit einem Online -Parser.

Vor ein paar Jahren Abiword übernahm das Projekt über. Sie erklären das AbiWord verwendet die Link -Grammatik, um die Grammatik zu überprüfen. Ich kenne die Feinheiten nicht, wie Abiword tatsächlich ihre Grammatiküberprüfung durchführt, aber ich habe über den grundlegenden Ansatz in einem Q & A über Grammatikprüfungen gelesen (den Link, an den ich jetzt verloren habe). Im Gegensatz zu einigen anderen Parsers, mit denen ich interagiert habe, liefert Link Grammatar sehr unterschiedliche Ergebnisse, wenn ein Satz nicht grammatikalisch gut geformt ist: Es kann keine vollständige Verknüpfung für grammatikalisch unzulässige Sätze finden.

Du kannst Überzeugen Sie sich selbst mit dem Online -Parser: In den Satz "Dies ist der Mann, dessen Hund, der ich gekauft habe, erzeugt" 1 Verknüpfung, während dies der Mann ist, dessen Hund, der ich gekauft habe ", bildet keine vollständigen Verknüpfungen.

Dies "zählt" die Anzahl der Fehler nicht, wie ich gefragt habe. Es erfüllt jedoch das Original für Eine Möglichkeit, grammatikalisch unplausible (dh unsachgemäß konjugierte) Möglichkeiten auszuschließen.

Python -Bindungen: Sie existieren!

Link -Grammatik ist in C geschrieben. Dies war ein Problem für mich, als ich zum ersten Mal recherchierte, da ich nur ein Jahr in der Python-Codierung bin und ich mich schwer fällt würde, selbst Bindungen zu schaffen. Ich war auch besorgt über meine Prozess-/Servicezahl, daher wollte ich das Link -Grammatikprogramm nicht über meinen Python -Prozess ausführen. Aber ein oder zwei Tage nach der Veröffentlichung dieser Frage am 13. Januar bin ich auf Jeff Elmores (Enzondio) Beitrag von gestoßen pyninkgrammar zu pypi - was nur einen Tag zuvor passiert ist.

Als die pyninkgrammar Seite erklärt, Sie müssen immer noch Erstellen und installieren Sie zuerst die Linkgrammar. Anweisungen zum Verwenden finden Sie auf dieser Seite. Einige Vorsichtsmaßnahmen zur Installation von PyLinkGrammar:

  1. Ich konnte Pyninkgrammar nicht mit Windows 7 an Python 2.7 arbeiten lassen. Ich denke, dass es darauf zurückzuführen ist, dass Cmake unter Windows 7 mit Python 2.7 arbeiten.
  2. So habe ich mein gesamtes Projekt in Ubuntu (10.10) verlegt, weil ich das so schlimm brauchte. Aber als ich Ubuntu aufstellte, habe ich versucht, alles für Python 2.7 zu installieren (sogar 2.6). Ich konnte immer noch nicht mit Python 2.7 arbeiten lassen. Ich denke, das war immer noch auf Probleme zwischen CMake & Python 2.7 zurückzuführen.
  3. Ich begann mit meiner Ubuntu -Installation von vorne, weil die Dinge chaotisch geworden waren und stattdessen alles mit Python 2.6 aufstellte. Ich habe jetzt die Pyklinkgrammar mit Python 2.6 zusammengearbeitet. (Aber ich muss tippen from pylinkgrammar.linkgrammar import Parser, was sich geringfügig von den Anweisungen der PYPI -Seite unterscheidet).

Nodebox Linguistics: der andere Teil meiner Lösung

In meiner Frage erklärte ich die Notwendigkeit zu Generieren Sie alle Beugungen/Konjugationen eines bestimmten Satzes, Um all diese Variationen zu überprüfen und grammatisch unplausible Elemente zu beseitigen. (Ich verwende WordNet, um bestimmte Teile der Benutzereingaben vor dem Ausgabe zu ändern.

Eine sehr informative Blogeintrag führte mich zur Nodebox Linguistics Library, eine Reihe von Werkzeugen, mit denen Sie "tun können Grammatikbeugung und Semantische Operationen auf englischen Inhalten. "In der Bibliothek kann es verwendet werden konjugierte Verben, Singularisierung und Pluralisierung von Substantiven, unter vielen anderen Operationen. Genau das brauchte ich. Meine Anwendung weiß, welche Wörter in einer Eingabe, die sie für eine neue, unbeeinflusstige Sprache ausgetauscht hat. Diese Stücke sind diejenigen, für die es Variationen erzeugt, wobei die Methoden in der Nodebox -Linguistik verwendet werden.

Ich füttere diese Variationen in die Pyleinkgrammar- und Drop -Variationen, für die keine vollständigen Verknüpfungen gefunden werden können. Manchmal liefert dies überhaupt keine Ergebnisse, aber meistens liefert es nützliche Ergebnisse. Bitte beachte, dass Die Link -Grammatik findet keine vollständigen Verknüpfungen für die meisten unvollständigen Sätze. Wenn Sie die Konjugationen in fragmentierten Sätzen wie ich überprüfen möchten, versuchen Sie es mit Erweitern Sie fragmentierte Sätze mit Füllstoff vor dem Überprüfen und geben Sie den Füllstoff vor Ausgabe ab. Ich erhalte diesen "Füllstoff", indem ich das letzte Wort aus den Daten nehme, im Brown Corpus nach oben nachgeschlagen und den Rest dieses Satzes vom Korpus angehängt hat.

Ich habe keine Tests, um darüber zu berichten, wie genau dieser Ansatz statistisch ist, aber er hat für meine (besonderen) Zwecke funktioniert die meisten der ganzen Zeit. Ich bin immer noch dabei, diese Implementierung auszuräumen und außergewöhnliche Fälle zu schreiben und Möglichkeiten zur Bereinigung der Eingabedaten. Hoffentlich hilft diese Informationen auch jemand anderem aus! Bitte zögern Sie nicht, um Klärung zu bitten.

Andere Tipps

Sehr cooles Projekt, vor allem.

Ich habe einen ... gefunden Java Grammatikprüfer. Ich habe es nie verwendet, aber die Dokumente behaupten, es könne als Server ausgeführt werden. Sowohl Java als auch das Hören eines Ports sollten im Grunde genommen überall unterstützt werden.

Ich komme gerade mit einem CS -Hintergrund in NLP ein, daher würde es mir nichts ausmachen, detaillierter zu gehen, damit Sie alles integrieren können, was Sie verwenden. Fühlen Sie sich frei, um mehr Details zu fragen.

Ein anderer Ansatz wäre, einen sogenannten Übergenerierungs- und Rangansatz zu verwenden. Im ersten Schritt generiert Ihr Gedichtgenerator mehrere Kandidatengenerationen. Dann nutzen Sie einen Dienst wie den mechanischen Turk von Amazon, um menschliche Beurteilungen der fließenden Beurteilungen zu sammeln. Ich würde tatsächlich empfehlen, gleichzeitige Urteile für eine Reihe von Sätzen zu sammeln, die unter denselben Samenbedingungen erzeugt wurden. Zuletzt extrahieren Sie Funktionen aus den generierten Sätzen (vermutlich unter Verwendung einer Form von syntaktischem Parser), um ein Modell zu trainieren, um die Fragenqualität zu bewerten oder zu klassifizieren. Sie könnten sogar die oben aufgeführten Heuristiken geworfen.

Michael Heilman verwendet diesen Ansatz für die Fragengenerierung. Weitere Details finden Sie in folgenden Zeitungen:Gute Frage! Statistisches Ranking für die Fragengenerierung undBewertung computergenerierter Fragen mit mechanischer Türke.

Der oben bereitgestellte Pyninkgrammar -Link ist etwas veraltet. Es zeigt auf Version 0.1.9, und die Code -Beispiele für diese Version funktionieren nicht mehr. Wenn Sie diesen Weg unterwegs gehen, verwenden Sie die neueste Version, die finden Sie unter:

https://pypi.python.org/pypi/pylinkgrammar

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top