2012-10-10 19 views
11

He leído un documento que utiliza el recuento Ngram como función de un clasificador, y me preguntaba lo que esto significa exactamente.¿Cuáles son los recuentos Ngram y cómo implementar usando NLTK?

Ejemplo de texto: "Lorem ipsum dolor sit amet, elitr consetetur sadipscing, diam sed"

puedo crear unigrams, bigramas, trigramas, etc. fuera de este texto, donde tengo que definir en qué "nivel "para crear estos unigrams. El "nivel" puede ser de carácter, sílaba, palabra, ...

¿Entonces crear unigramas de la oración anterior simplemente crearía una lista de todas las palabras?

¿Crear birams dará como resultado pares de palabras que junten palabras que se suceden?

De modo que si el documento habla acerca de los recuentos de ngram, simplemente crea unigrams, bigrams, trigrams, etc. del texto, y cuenta con qué frecuencia se produce ngram?

¿Existe un método existente en el paquete nltk de python? ¿O debo implementar una versión propia?

+1

suya es una interpretación común, pero la unidad "gramo" podría ser, por ejemplo bytes o caracteres, también. Entonces el personaje de 3 gramos de "lorem" podría ser "lor" y "em" o incluso "lor", "ore", "rem" si usa una ventana deslizante. – tripleee

Respuesta

15

Encontré mi código anterior, tal vez es útil.

import nltk 
from nltk import bigrams 
from nltk import trigrams 

text="""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare 
tempor lacus, quis pellentesque diam tempus vitae. Morbi justo mauris, 
congue sit amet imperdiet ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare 
tempor lacus, quis pellentesque diam""" 
# split the texts into tokens 
tokens = nltk.word_tokenize(text) 
tokens = [token.lower() for token in tokens if len(token) > 1] #same as unigrams 
bi_tokens = bigrams(tokens) 
tri_tokens = trigrams(tokens) 

# print trigrams count 

print [(item, tri_tokens.count(item)) for item in sorted(set(tri_tokens))] 
>>> 
[(('adipiscing', 'elit.', 'nullam'), 2), (('amet', 'consectetur', 'adipiscing'), 2),(('amet', 'imperdiet', 'ipsum'), 1), (('congue', 'sit', 'amet'), 1), (('consectetur', 'adipiscing', 'elit.'), 2), (('diam', 'tempus', 'vitae.'), 1), (('dolor', 'sit', 'amet'), 2), (('elit.', 'nullam', 'ornare'), 2), (('imperdiet', 'ipsum', 'dolor'), 1), (('ipsum', 'dolor', 'sit'), 2), (('justo', 'mauris', 'congue'), 1), (('lacus', 'quis', 'pellentesque'), 2), (('lorem', 'ipsum', 'dolor'), 1), (('mauris', 'congue', 'sit'), 1), (('morbi', 'justo', 'mauris'), 1), (('nullam', 'ornare', 'tempor'), 2), (('ornare', 'tempor', 'lacus'), 2), (('pellentesque', 'diam', 'tempus'), 1), (('quis', 'pellentesque', 'diam'), 2), (('sit', 'amet', 'consectetur'), 2), (('sit', 'amet', 'imperdiet'), 1), (('tempor', 'lacus', 'quis'), 2), (('tempus', 'vitae.', 'morbi'), 1), (('vitae.', 'morbi', 'justo'), 1)] 
+0

Gracias por su código! – akohout

+0

¿Es correcto que cuente ['tempus', 'vitae', 'morbi'] como un trigrama si no están en la misma oración? – Mouscellaneous

-1

No creo que haya un método específico en nltk para ayudar con esto. Esto no es difícil sin embargo. Si tiene una oración de n palabras (suponiendo que esté usando un nivel de palabra), obtenga todos los ngrams de longitud 1-n, repita cada uno de esos ngrams y conviértalos en claves en una matriz asociativa, cuyo valor es el recuento. no debe contener más de 30 líneas de código, usted podría construir su propio paquete para esto y lo importa donde sea necesario.

+1

Ok, entonces parece como si yo entiendo las cosas correctamente Ngram :) – akohout

2

Cuando cuenta n-grams, es mejor usar la tabla hash (diccionario) en lugar de usar count. Para el ejemplo anterior:

unigrams = {} 
for token in tokens: 
    if token not in unigrams: 
    unigrams[token] = 1 
    else: 
    unigrams[token] += 1 

esto le da complejidad O (n) tiempo

+1

¿Es esta una respuesta? si es así, publícalo con detalles. – Sachith

Cuestiones relacionadas