2017-10-11 1 views
0

Ich versuche, ähnliche Art von Sätzen mit Stanford Parser zu generieren. Schritte:Satzgenerierung mit Stanford Parser

1.Parse Eingabesatz mit Stanford-Bibliothek.

2.Generate Produktionsregeln von analysierten Sätze

3.Replace einige Endwerte

4.Regenerate Sätze erzeugen() -Funktion von nltk.parse.generate

Ich habe drei Zweifel:

1. Erzeugt StanfordParser immer finite Produktionsregeln?

2.While mit generate-Funktion, für einige Sätze bekomme ich den folgenden Fehler.

"Runtime: maximale Rekursionstiefe überschritten, während ein Python-Objekt aufrufen"

Wenn ich Rekursion Grenze gesetzt sys.setrecursionlimit mit (0x10000000), ich habe Fehler: "Segmentation fault: 11"

2.1 Can Ich erhöhe Rekursionslimit?

2.2 Wie kann ich dieses Problem lösen?

3 Ist dies der richtige Ansatz? Wie kann ich es verbessern?

+0

Willkommen bei Stack Overflow. Was hast du selbst schon versucht? Bitte überprüfen Sie [Wie viel Forschungsaufwand wird erwartet?] (Https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-users). Stack Overflow ist kein Codierungsdienst. Von Ihnen wird erwartet, dass Sie Ihr Problem recherchieren und einen guten Versuch unternehmen, den Code selbst zu verfassen, bevor Sie ihn veröffentlichen. Wenn Sie an etwas Bestimmtem feststecken, kommen Sie zurück und schließen Sie ein [minimales, komplettes und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) und eine Zusammenfassung von, was Sie versuchten, also können wir helfen. – Sand

Antwort

2

Die Funktion nltk.parse.generate.generate() soll alle die Produktionen der Grammatik erzeugen. Das bedeutet, dass selbst eine einzelne rekursive Regel, wie zB ein NP in einem NP (was die ganze Zeit passiert), eine unendliche Rekursion ergibt. Wie die Dokumentation zeigt, können Sie es steuern, indem Sie die Tiefe der Rekursion begrenzen (z. B. depth=20). Wenn Sie möchten, können Sie auch die Anzahl der Bäume angeben, die Sie generieren möchten (n=100).

Die Grenzen werden das Problem der unendlichen Rekursion lösen, aber sie garantieren nicht, dass Ihnen die Ergebnisse gefallen. generate() fügt alle möglichen Erweiterungen in der Reihenfolge ein. Wenn also die erste Regel rekursiv ist, wird sie immer wieder verwendet. Sie erhalten wahrscheinlich bessere Ergebnisse, wenn Sie zum Beispiel den 50. erzeugten Baum auswählen; Aber Sie werden sicherlich die besten Ergebnisse erzielen, wenn Sie die Struktur der von Ihnen generierten Grammatik untersuchen und Ihren eigenen Generator programmieren, der zufällige Entscheidungen unter den möglichen Erweiterungen trifft.

+0

Vielen Dank, Tiefe = 20 hat funktioniert, aber das Problem ist einzelne rekursive Regel erstellt Schleife. z.B. für "Was ist der Preis von großen Latte" Satz erzeugt es "Was ist der Preis des Preises des Preises des Preises des Preises des Preises des großen Preises" gibt es eine Lösung, um diese repetitive Phrase zu behandeln Problem. Gibt es einen besseren Parser, der verwendet werden sollte? – Shaili

+0

Es ist nichts falsch mit dem Parser oder mit den Regeln. Das Problem ist, dass 'generate()' alle möglichen Erweiterungen erzeugen soll, also wählt es Regeln in der richtigen Reihenfolge. Diskussion hinzugefügt. – alexis

Verwandte Themen