Saltar al contenido

Python NLTK: bigramas, trigramas, cuatro gramos

Ten en cuenta que en la informática un error casi siempre tiene varias resoluciones, de igual modo nosotros aquí te enseñamos lo más óptimo y eficiente.

Solución:

Si aplica algo de teoría de conjuntos (si estoy interpretando su pregunta correctamente), verá que los trigramas que desea son simplemente elementos [2:5], [4:7], [6:8]etc de la token lista.

Podrías generarlos así:

>>> new_trigrams = []
>>> c = 2
>>> while c < len(token) - 2:
...     new_trigrams.append((token[c], token[c+1], token[c+2]))
...     c += 2
>>> print new_trigrams
[('are', 'you', '?'), ('?', 'i', 'am'), ('am', 'fine', 'and')]

Probar everygrams:

from nltk import everygrams
list(everygrams('hello', 1, 5))

[out]:

[('h',),
 ('e',),
 ('l',),
 ('l',),
 ('o',),
 ('h', 'e'),
 ('e', 'l'),
 ('l', 'l'),
 ('l', 'o'),
 ('h', 'e', 'l'),
 ('e', 'l', 'l'),
 ('l', 'l', 'o'),
 ('h', 'e', 'l', 'l'),
 ('e', 'l', 'l', 'o'),
 ('h', 'e', 'l', 'l', 'o')]

Fichas de palabras:

from nltk import everygrams

list(everygrams('hello word is a fun program'.split(), 1, 5))

[out]:

[('hello',),
 ('word',),
 ('is',),
 ('a',),
 ('fun',),
 ('program',),
 ('hello', 'word'),
 ('word', 'is'),
 ('is', 'a'),
 ('a', 'fun'),
 ('fun', 'program'),
 ('hello', 'word', 'is'),
 ('word', 'is', 'a'),
 ('is', 'a', 'fun'),
 ('a', 'fun', 'program'),
 ('hello', 'word', 'is', 'a'),
 ('word', 'is', 'a', 'fun'),
 ('is', 'a', 'fun', 'program'),
 ('hello', 'word', 'is', 'a', 'fun'),
 ('word', 'is', 'a', 'fun', 'program')]

lo hago así:

def words_to_ngrams(words, n, sep=" "):
    return [sep.join(words[i:i+n]) for i in range(len(words)-n+1)]

Esto toma un lista de palabras como entrada y devuelve una lista de ngramas (para n dada), separados por sep (en este caso un espacio).

valoraciones y comentarios

Más adelante puedes encontrar las acotaciones de otros usuarios, tú además tienes la opción de dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *