2016-04-04 1 views
1

Wenn ich Brill Tagger verwende, erhalte ich diesen Fehler.'_sre.SRE_Pattern' Objekt ist in Python 3.4 nicht iterierbar

TypeError: '_sre.SRE_Pattern' object is not iterable 
WARNING:root:2016-04-05 00:05:37.503718 is when this event was logged. 
ERROR:root:'_sre.SRE_Pattern' object is not iterable 
Traceback (most recent call last): 
    File "D:\Dropbox\VCL\MyWrapper.py", line 137, in run_alg 
    CLC_POS.tag_file(input_utf8, path_out + '.pos', file_encoding, CLC_POS.load_tagger('pos_tbl_86943.model'), '') 
    File "D:\Dropbox\VCL\CLC_POS.py", line 277, in tag_file 
    token_tag = tagger.tag(word_list) 
    File "C:\Python34\lib\site-packages\nltk\tag\brill.py", line 264, in tag 
    tagged_tokens = self._initial_tagger.tag(tokens) 
    File "C:\Python34\lib\site-packages\nltk\tag\sequential.py", line 61, in tag 
    tags.append(self.tag_one(tokens, i, tags)) 
    File "C:\Python34\lib\site-packages\nltk\tag\sequential.py", line 81, in tag_one 
    tag = tagger.choose_tag(tokens, index, history) 
    File "C:\Python34\lib\site-packages\nltk\tag\sequential.py", line 546, in choose_tag 
    for regexp, tag in self._regexs: 
TypeError: '_sre.SRE_Pattern' object is not iterable 

In sequential.py, bekomme ich Fehler, wenn es um für Schleife kommt.

def choose_tag(self, tokens, index, history): 
    for regexp, tag in self._regexs: 
     if re.match(regexp, tokens[index]): 
      return tag 
    return None 

Ich habe den gleichen Code vor einem Monat ausgeführt und es gab keinen Fehler. sequential.py gehört zu Nltk-Dateien, bedeutet das, dass ich damit umgehen sollte?

Was habe ich falsch gemacht? Bitte geben Sie eine Korrektur an, wenn möglich.

+1

'self._regexs' ist keine Liste. Es ist ** ein ** kompiliertes reguläres Ausdrucksobjekt. –

+0

Ich kann keine Lösung bereitstellen, da ohne Ihren Code, der den 'tagger' erzeugt und anderweitig damit interagiert, wir Ihnen nicht sagen können, was diese Liste mit einem einzelnen regulären Ausdruck ersetzt haben könnte. –

Antwort

-1

Die Lösung ist ziemlich einfach.

Wir müssen nur die Daten erneut trainieren, um ein neues Modell zu erhalten.

Ich denke, Problem ist einige Änderungen in NLTK, aber nicht sicher, wo es ist. Außerdem betrifft dies nur Brill Tagger, nicht CRF Tagger.

2

self._regexs ist kein iterierbares Objekt (wie eine Liste oder ein Tupel). Es ist eins kompilierten regulären Ausdruck Objekt.

Irgendwo anders in Ihrem Code, hast du etwas, das diese endet effektiv viel wie etwas zu tun:

self._regexs = re.compile(r'...') 

Es könnte sein, dass Sie irgendwo in einem einzigen Punkt geführt, wo das nltk API eine Sequenz erwartet von solche Objekte. Ich sehe keinen offensichtlichen Weg für den nltk Code, dies jedoch getan zu haben.

+0

Danke Martijn. Aber ich habe nirgendwo kompiliert. Ich habe eine Menge Ausdruckstring erstellt und sie zu einer Liste hinzugefügt. Dann benutze ich eine Liste, um einen RegexpTagger zu erstellen. Das ist der einzige Teil, in dem ich Regex benutze. –

+0

@Alex: Ja, und etwas hat 'tagger._regexs' durch ein einzelnes Objekt ersetzt. Ich kann keinen Code * in 'nltk' * sehen, der dies jedoch tun würde. –