Was würde bewirken, dass WordNetCorpusReader kein Attribut LazyCorpusLoader hat?

9

Ich habe eine kurze Funktion, um zu überprüfen, ob ein Wort ein echtes Wort ist, indem ich es mit dem WordNet-Korpus aus dem Natural Language Toolkit vergleiche. Ich rufe diese Funktion von einem Thread, der TXT-Dateien validiert. Wenn ich meinen Code ausführe, wird beim ersten Aufruf der Funktion ein AttributeError mit der Nachricht

ausgelöst %Vor%

Wenn ich die Ausführung pausiere, wirft die selbe Codezeile keinen Fehler, daher nehme ich an, dass der Korpus bei meinem ersten Aufruf noch nicht geladen ist und den Fehler verursacht.

Ich habe versucht, mit nltk.wordnet.ensure_loaded() den Corpus zu laden, aber ich bekomme immer noch den gleichen Fehler.

Hier ist meine Funktion:

%Vor%

Wenn ich eine print-Anweisung in derselben Datei im globalen Bereich habe, wird der Fehler nicht ausgegeben. Wenn ich es jedoch von meinem Thread aus anrufe, tut es das. Das folgende ist ein minimales Beispiel, um den Fehler zu reproduzieren. Ich habe es getestet und auf meinem Rechner gibt es die Ausgabe

%Vor%

Minimales Beispiel:

%Vor%     
Cecilia 11.12.2014, 22:11
quelle

1 Antwort

12

Ich habe Ihren Code ausgeführt und den gleichen Fehler erhalten. Für eine funktionierende Lösung, siehe unten. Hier ist die Erklärung:

LazyCorpusLoader ist ein Proxy-Objekt, das vor einem Corpus-Objekt steht der Korpus ist geladen. (Dies verhindert, dass die NLTK große Korpora in den Speicher lädt, bevor sie benötigt werden.) Beim ersten Zugriff auf dieses Proxy-Objekt wird jedoch zu dem Korpus, den Sie laden möchten. Das heißt, das Proxy-Objekt LazyCorpusLoader transformiert seine __dict__ und __class__ in die __dict__ und __class__ des Korpus, den Sie laden.

Wenn Sie Ihren Code mit den obigen Fehlern vergleichen, können Sie sehen, dass Sie 9 Fehler erhalten haben, als Sie versucht haben, 10 Instanzen Ihrer Klasse zu erstellen. Die erste Umwandlung des LazyCorpusLoader -Proxy-Objekts in ein WordNetCorpusReader -Objekt war erfolgreich. Diese Aktion wurde ausgelöst, als Sie zum ersten Mal auf wordnet zugegriffen haben:

Der erste Thread

%Vor%

Der zweite Thread

Wenn Sie Ihre is_good_word -Funktion in einem zweiten Thread ausführen, hat Ihr erster Thread das LazyCorpusLoader -Proxy-Objekt jedoch nicht vollständig in ein WordNetCorpusReader umgewandelt. wn ist immer noch ein LazyCorpusLoader Proxy-Objekt, daher wird der Prozess __load erneut gestartet. Sobald es zu dem Punkt kommt, an dem es versucht, seine __class__ und __dict__ in ein WordNetCorpusReader Objekt zu konvertieren, hat der erste Thread das LazyCorpusLoader Proxy-Objekt jedoch bereits in eine WordNetCorpusReader konvertiert. Meine Vermutung ist, dass in der Zeile mit meinem Kommentar unten ein Fehler auftritt:

%Vor%

Sobald der erste Thread das Proxy-Objekt LazyCorpusLoader in ein Objekt WordNetCorpusReader transformiert hat, funktionieren die verstümmelten Namen nicht mehr. Das WordNetCorpusReader -Objekt wird nicht LazyCorpusLoader irgendwo in seinen verkrüppelten Namen haben. ( self.__args ist äquivalent zu self._LazyCorpusLoader__args, während das Objekt ein Objekt LazyCorpusLoader ist.) Daher erhalten Sie den folgenden Fehler:

%Vor%

Eine Alternative

Angesichts dieses Problems möchten Sie auf das wn -Objekt zugreifen, bevor Sie in Ihr Threading eingeben. Hier ist Ihr Code entsprechend geändert:

%Vor%

Ich habe den obigen Code getestet und keine Fehler erhalten.

    
πόδας ὠκύς 12.12.2014, 05:00
quelle