2013-09-06 5 views
15

Ich schrieb den folgenden Code für die Berechnung von Zeichen Bigramme und die Ausgabe ist direkt unter. Meine Frage ist, wie bekomme ich eine Ausgabe, die das letzte Zeichen (dh t) ausschließt? und gibt es ein schnelleres und effizienteres Verfahren zum Berechnen von Zeichen-N-Grammen?Schnelle Implementierung von Zeichen N-Gramm mit Python

b='student' 
>>> y=[] 
>>> for x in range(len(b)): 
    n=b[x:x+2] 
    y.append(n) 
>>> y 
['st', 'tu', 'ud', 'de', 'en', 'nt', 't'] 

Hier ist das Ergebnis Ich mag würde erhalten: für Ihre Anregungen ['st','tu','ud','de','nt]

Vielen Dank im Voraus.

Antwort

25

generieren Bigrams:

In [8]: b='student' 

In [9]: [b[i:i+2] for i in range(len(b)-1)] 
Out[9]: ['st', 'tu', 'ud', 'de', 'en', 'nt'] 

zu einem anderen n zu verallgemeinern:

In [10]: n=4 

In [11]: [b[i:i+n] for i in range(len(b)-n+1)] 
Out[11]: ['stud', 'tude', 'uden', 'dent'] 
+0

Dank lot.I wirklich zu schätzen wissen. – Tiger1

5

Versuchen zip:

>>> def word2ngrams(text, n=3, exact=True): 
... """ Convert text into character ngrams. """ 
... return ["".join(j) for j in zip(*[text[i:] for i in range(n)])] 
... 
>>> word2ngrams('foobarbarblacksheep') 
['foo', 'oob', 'oba', 'bar', 'arb', 'rba', 'bar', 'arb', 'rbl', 'bla', 'lac', 'ack', 'cks', 'ksh', 'she', 'hee', 'eep'] 

aber beachten Sie, dass es langsamer:

import string, random, time 

def zip_ngrams(text, n=3, exact=True): 
    return ["".join(j) for j in zip(*[text[i:] for i in range(n)])] 

def nozip_ngrams(text, n=3): 
    return [text[i:i+n] for i in range(len(text)-n+1)] 

# Generate 10000 random strings of length 100. 
words = [''.join(random.choice(string.ascii_uppercase) for j in range(100)) for i in range(10000)] 

start = time.time() 
x = [zip_ngrams(w) for w in words] 
print time.time() - start 

start = time.time() 
y = [nozip_ngrams(w) for w in words] 
print time.time() - start   

print x==y 

[out]:

0.314492940903 
0.197558879852 
True 
Verwandte Themen