2016-12-07 5 views
0

Ich verfolge ein Turtorial auf LDA und stoße auf ein Problem, da das Turtorial in Python 3 gemacht wurde und ich in 2.7 arbeite (das Turtorial behauptet in beiden zu arbeiten). Soweit ich verstehe, muss ich Strings in Python 2.x in Unicode verwandeln, bevor ich token.isnumeric() anwenden kann. Aufgrund meines Mangels an Erfahrung und Wissen bin ich mir nicht sicher, wie ich das im folgenden Skript gut machen soll. Hat jemand eine Lösung?Effektive Umwandlung von Strings in Unicode für Python 2.7

data_dir = 'nipstxt/' 
yrs = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'] 
dirs = ['nips' + yr for yr in yrs] 
docs = [] 
for yr_dir in dirs: 
files = os.listdir(data_dir + yr_dir) 
    for filen in files: 
     # Note: ignoring characters that cause encoding errors. 
     with open(data_dir + yr_dir + '/' + filen) as fid: 
      txt = fid.read() 
     docs.append(txt) 

tokenizer = RegexpTokenizer(r'\w+') 
for idx in range(len(docs)): 
    docs[idx] = docs[idx].lower() # Convert to lowercase. 
    docs[idx] = tokenizer.tokenize(docs[idx]) # Split into words. 

docs = [[token for token in doc if not token.isnumeric()] for doc in docs] 

docs = [[token for token in doc if len(token) > 1] for doc in docs] 

Antwort

0

Die generische Art und Weise einen Byte-String in ein Unicode-String zu konvertieren ist mit decode. Wenn Sie wissen, dass die Zeichenfolge nur ASCII-Zeichen enthält (wie eine Zahl), müssen Sie keinen Parameter angeben, sondern standardmäßig ascii.

docs = [[token for token in doc if not token.decode().isnumeric()] for doc in docs] 

Wenn es eine Chance, dass die Zeichenfolge nicht-ASCII-Zeichen enthalten, werden Sie diejenigen ersetzt mit einem Sonderzeichen erhalten können, die nicht als numerisches zählen.

docs = [[token for token in doc if not token.decode(errors='replace').isnumeric()] for doc in docs] 
+0

Danke, so scheint es, auf richtigen Weg zu sein, da es mir einen neuen Fehler gab: UnicodeDecodeError: 'ascii' Codec Byte 0xF8 in Position nicht dekodieren kann 0: ordinal nicht in Reichweite (128). Ich denke, es bedeutet, dass einige nicht 'ASCII'-Zeichen. Kann ich einen Parameter einstellen, um damit umzugehen? – WiggyStardust

+0

@WiggyStardust Ich habe dieses Problem bereits vorhergesehen, siehe meine Bearbeitung. –

+0

Perfekt, danke! – WiggyStardust

Verwandte Themen