2016-07-24 10 views
0

Ich versuche Tokenisierung von Wörtern in einer Textdatei mit Python 3.5, aber ein paar Fehler. Hier ist der Code:Tokenisierung von Textdatei in Python 3.5

import re 
f = open('/Users/Half_Pint_Boy/Desktop/sentenses.txt', 'r') 
a=0 
c=0 
for line in f: 
    b=re.split('[^a-z]', line.lower()) 
    a+=len(filter(None, b)) 
    c = c + 1 
    d = d + b 
print (a) 
print (c) 

Meine Fragen:

  1. Construction a+=len(filter(None, b)) funktioniert in Python 2.7, aber in 3.5 verursachen sie einen Fehler vom Typ dieses Objekt von:

    Typ ' Filter 'hat keine len()

    Wie kann es sein gelöst mit Python 3.5?

  2. Wenn ich Tokenization mache, zählt mein Code auch leere Leerzeichen als Word-Tokens. Wie kann ich sie löschen?

Vielen Dank!

+0

danke für den ersten Punkt! aber wie genau kann ich die leeren Token nach dem Splitting komplett loswerden? – HalfPintBoy

Antwort

1
  1. Sie benötigen eine explizite Umwandlung in Python 3.5 zur Liste der Länge der Sequenz zu erhalten, wie filter Benutzer Iterator Objekt zurückgibt und keine Liste als mit Python 2.7:

    a += len(list(filter(None, b))) 
    #   ^^ 
    
  2. die leeren Räume, in denen von Ihrem re.split zurückgegeben, zB:

    >>> line = 'sdksljd sdjsh 1213hjs sjdks' 
    >>> b=re.split('[^a-z]', line.lower()) 
    >>> b 
    ['sdksljd', 'sdjsh', '', '', '', '', 'hjs', 'sjdks'] 
    

Sie können sie entfernen auf if in einem Liste Verständnis auf den Ergebnissen aus Ihrem re.split wie so ein Filter mit:

b = [i for i in re.split('[^a-z]', line.lower()) if i] 

Der if i Teil in der Liste comp. gibt False für eine leere Zeichenfolge zurück, weil bool('') is False. So werden leere Strings gelöscht.

b = list(filter(None, re.split('[^a-z]', line.lower()))) # use the list comprehension if you don't like brackets 

Und schließlich a kann nach jeder der beiden berechnet werden:


Die Ergebnisse aus der Liste Verständnis kann auch mit filter (die Sie bereits verwendet, um mit a) erreicht werden Ansätze wie:

a += len(b) 
+0

Weißt du, warum OP-Filter auf 'None' filtern? Erwartete er, dass die leeren Saiten verschwinden würden? – usr2564301

+1

@RadLexus Der Filter auf 'None' entfernt zwar Leerzeichen, aber ich habe das Gefühl, dass sie immer noch das Original' b' irgendwo mit 'd = d + b' verwenden –