Come Estrarre Ngrams Facilmente

Installando la libreria NLTK per Python3 si possono immediatamente provare molti dei suoi strumenti sui corpora che la libreria stessa fornisce. Il modo più semplice per scaricare e installare i vari moduli e corpora è usando la funzione nltk.download() in uno shell di python oppure con python -m nltk.downloader nel terminale. Tramite il downloader installate i moduli stopwords, punkt e il corpus gutenberg.

Moduli da importare

Per prima cosa si importano i moduli che servono. wordtokenize dividerà il corpus in parole singole, stopwords toglierà dai token raccolti tutti quelli meno utili e che fornirebbero ben poche informazioni (come le parole "but" o "so"). Per finire, ngrams produrrà gli ngram desiderati e con nltk si potranno rappresentare i risultati in un grafico.

from nltk import ngrams
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords

Importare il corpus e impostare le stopwords

with open("austen-emma.txt", "r") as corpus:
    corpus = corpus.read()

stop_words = set(stopwords.words('english'))

Tokenizzare

Per prima cosa si tokenizza tutto il testo, producendo una lista di parole singole che contengono sia parole utili che parole meno utili e caratteri come ? o !. Successivamente, utilizzando la variabile precedentemente impostata, si eliminano tutte le stopword con un semplice for loop che inserirà le parole utili in una nuova lista di token filtrati.

tokens = word_tokenize(corpus)

filteredTokens = []

## Togliere le stopwords dai tokens

for token in tokens:
    if token not in stop_words:
        filteredTokens.append(token)

Ngram

Ora che si è ottenuta la lista di tokens filtrati, utilizzando il modulo ngrams si imposta prima il numero di parole e poi si crea la lista di ngrams.

n = 3 #Numero di ngrams

ngrammi = list(ngrams(filteredTokens, n))

fDist = nltk.FreqDist(ngrammi)

mostComm = fDist.most_common(30) #I 30 ngrammi più frequenti

Grafici

fDist.plot(30,                      # I 30 ngrammi più frequenti
           cumulative=False,        # Se mostrare frequenza cumulativa
           title="Titolo",          # Titolo del grafico
           color="blue",            # Colore della linea
           linestyle='solid',       # Tipo di linea (dotted, dashed, ecc...)
           marker=".",              # Punti di riferimento sulla linea
           markerfacecolor="red",   # Colore interno del marker
           markeredgecolor="blue",  # Contorno del marker 
           markersize=10.0)         # Dimensione del Marker (float)

Austen-Word-Freq.png

Il risultato finale sarà un grafico simile a questo.

Altri oggetti / arguments per il grafico disponibili sono linewidth e alpha. Descrizioni di questi ed altri si possono trovare nella documentazione di Matplotlib.

Date: <2018-01-07 Sun>

Author: Andrew

Other posts