2013-09-06 17 views
15

Karakter bigramları için aşağıdaki kodu yazdım ve çıktı aşağıya doğru. Sorum şu: Son karakteri (yani t) hariç tutan bir çıktıyı nasıl alabilirim? ve karakter n-gramlarının hesaplanması için daha hızlı ve daha etkili bir yöntem var mı? ['st','tu','ud','de','nt]Python kullanarak karakter n-gramının hızlı uygulanması

peşin Önerileriniz için: Burada

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'] 

ben almak istiyorum sonucudur.

cevap

25

oluşturmak için Bigramlar:

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'] 

farklı n için genelleme için:

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

sayesinde bir lot.I gerçekten takdir ediyorum. – Tiger1

5

zip deneyin:

>>> 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'] 

ama bu kadar dikkat do yavaş:

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 

[dışarı]:

0.314492940903 
0.197558879852 
True