2012-08-01 15 views
13

Muszę zdobyć najpopularniejsze ngramy z tekstu. Długość Ngrams musi wynosić od 1 do 5 słów.Lista Pythona z Ngrams z częstotliwościami

Wiem, jak uzyskać bigramy i trygramy. Na przykład:

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) 

Jednak dowiedziałem się, że scikit-learn może uzyskać ngramy o różnej długości. Na przykład mogę ngrams o długości od 1 do 5.

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

Ale WordNGramAnalyzer jest teraz przestarzała. Moje pytanie brzmi: W jaki sposób mogę uzyskać N najlepsze słowo kolokacji z mojego tekstu, z długościami kolokacji od 1 do 5. Również muszę uzyskać FreqList z tej kolokacji/ngrams.

Czy mogę to zrobić z nltk/scikit? Muszę uzyskać kombinacje ngramów o różnych długościach z jednego tekstu?

Na przykład przy użyciu bigramów NLTR i trygramów, w których wiele sytuacji, w których moje trygramy zawierają moje bitgramy, lub moje trygramy stanowią część większych 4-gramów. Na przykład:

bitgrams: cześć moje Trygramów: cześć nazywam

wiem jak wykluczyć bigrams z trygramów, ale potrzebujemy lepszych rozwiązań.

Odpowiedz

12

aktualizacja

Od scikit-learn 0,14 format został zmieniony na:

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

starym odpowiedź

WordNGramAnalyzer rzeczywiście jest przestarzała od scikit-learn 0,11. Tworzenie n-gramów i uzyskiwanie częstotliwości terminów jest teraz połączone w sklearn.feature_extraction.text.CountVectorizer. Można utworzyć wszystkie n-gramów w zakresie od 1 do 5 w następujący sposób:

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

Więcej przykładów i informacji można znaleźć w scikit-learn na dokumentacji o text feature extraction.

+3

Jeśli nie chcesz tfidf normalizację po prostu użyj: 'CountVectorizer (min_n = 1, max_n = 5) .fit_transform (list_of_strings)'. – ogrisel

+0

, ale co mam zrobić dalej? Jak mogę uzyskać częstotliwości ngrams? – twoface88

+3

@ twoface88: 'v = CountVectorizer (min_n = 1, max_n = 5); X = v.fit_transform (["Jabłko dziennie nie dopuszcza do siebie lekarza"]); zip (v.inverse_transform (X) [0], X.A [0]) ". Zwróć uwagę, że stopwords i tokeny jednego znaku zostaną domyślnie usunięte. –

7

Jeśli chcesz wygenerować surowe pliki ngrams (i policzyć je samemu, być może), istnieje również nltk.util.ngrams(sequence, n). Wygeneruje sekwencję ngrams dla dowolnej wartości n. Posiada opcje wypełnienia, zobacz dokumentację.