usar significado reservadas palabras insertar generar escribir contar con claves python-2.7 n-gram

python-2.7 - significado - python html



Implementación rápida de n-gramas de caracteres usando python (3)

Escribí el siguiente código para calcular bigramas de caracteres y la salida está justo debajo. Mi pregunta es, ¿cómo obtengo una salida que excluye el último carácter (es decir, t)? ¿Existe un método más rápido y eficiente para calcular n-gramas de caracteres?

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

Aquí está el resultado que me gustaría obtener: [''st'',''tu'',''ud'',''de'',''nt]

Gracias por adelantado por tus sugerencias.


Esta función le da ngrams para n = 1 a n:

def getNgrams(sentences, n): ngrams = [] for sentence in sentences: _ngrams = [] for _n in range(1,n+1): for pos in range(1,len(sentence)-_n): _ngrams.append([sentence[pos:pos+_n]]) ngrams.append(_ngrams) return ngrams


Para generar bigramas:

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

Para generalizar a una n diferente:

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


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

pero tenga en cuenta que es más lento:

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

[afuera]:

0.314492940903 0.197558879852 True