2012-08-01 163 views
13

Necesito obtener los ngrams más populares del texto. La longitud de los ngrams debe ser de 1 a 5 palabras.Python Lista de Ngrams con frecuencias

Sé cómo obtener bigramas y trigramas. Por ejemplo:

bigram_measures = nltk.collocations.BigramAssocMeasures() 
finder = nltk.collocations.BigramCollocationFinder.from_words(words) 
finder.apply_freq_filter(3) 
finder.apply_word_filter(filter_stops) 
matches1 = finder.nbest(bigram_measures.pmi, 20) 

Sin embargo, descubrí que scikit-learn puede obtener ngrams con varias longitudes. Por ejemplo, yo puedo conseguir N-gramas con una longitud de 1 a 5.

v = CountVectorizer(analyzer=WordNGramAnalyzer(min_n=1, max_n=5)) 

Pero WordNGramAnalyzer ahora es obsoleto. Mi pregunta es: ¿Cómo puedo obtener N las mejores colocaciones de palabras de mi texto, con una longitud de las colocaciones de 1 a 5. También necesito obtener FreqList de estas colocaciones/ngramas.

¿Puedo hacer eso con nltk/scikit? Necesito obtener combinaciones de ngrams con varias longitudes a partir de un texto?

Por ejemplo, usando bigramas y trigramas NLTK donde muchas situaciones en las que mis trigramas incluyen mis bitgramos, o mis trigramas son parte de 4 gramos más grandes. Por ejemplo:

bitgrams: hola mis trigramas: hola mi nombre

Sé cómo excluir Bigramas de trigramas, pero necesito mejores soluciones.

Respuesta

12

actualización

Desde scikit-learn 0,14 el formato ha cambiado a:

n_grams = CountVectorizer(ngram_range=(1, 5)) 

vieja respuesta

WordNGramAnalyzer es de hecho desuso desde scikit-learn 0,11. Crear n-grams y obtener frecuencias de términos ahora se combina en sklearn.feature_extraction.text.CountVectorizer. Puede crear todos los n-gramas que van desde 1 hasta las 5 de la siguiente manera:

n_grams = CountVectorizer(min_n=1, max_n=5) 

Más ejemplos e información se pueden encontrar en scikit-learn documentación sobre text feature extraction.

+3

Si no desea TF-IDF normalización solo use: 'CountVectorizer (min_n = 1, max_n = 5) .fit_transform (list_of_strings)'. – ogrisel

+0

, pero ¿qué debo hacer ahora? ¿cómo obtengo las frecuencias de ngrams? – twoface88

+3

@ twoface88: 'v = CountVectorizer (min_n = 1, max_n = 5); X = v.fit_transform (["una manzana al día mantiene alejado al médico"]); zip (v.inversión_inversión (X) [0], X.A [0]) '. Tenga en cuenta que las palabras vacías y los tokens de un carácter se eliminarán de forma predeterminada. –

7

Si desea generar los ngrams en bruto (y contarlos usted mismo, tal vez), también hay nltk.util.ngrams(sequence, n). Generará una secuencia de ngrams para cualquier valor de n. Tiene opciones para el relleno, mira la documentación.

Cuestiones relacionadas