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