2012-01-08 19 views
6

Attualmente sto cercando di classificare i tweet utilizzando il classificatore Naive Bayes in NLTK. Sto classificando tweet relativi a particolari simboli azionari, usando il prefisso '$' (es: $ AAPL). Sto basando il mio script Python su questo post del blog: Twitter Sentiment Analysis using Python and NLTK. Finora, ho ottenuto risultati ragionevolmente buoni. Tuttavia, sento che c'è molto, molto spazio per migliorare.Tweet Classifier Feature-Selection NLTK

Nel mio metodo di selezione delle funzioni di parole, ho deciso di implementare l'algoritmo tf-idf per selezionare le parole più informative. Dopo averlo fatto, ho sentito che i risultati non erano così impressionanti.

Ho quindi implementato la tecnica sul seguente blog: Text Classification Sentiment Analysis Eliminate Low Information Features. I risultati erano molto simili a quelli ottenuti con l'algoritmo tf-idf, che mi ha portato a esaminare più approfonditamente l'elenco delle caratteristiche più informative del mio classificatore. In quel momento ho capito che avevo un problema più grande:

I tweet e il linguaggio reale non usano la stessa grammatica e formulazione. In un testo normale, molti articoli e verbi possono essere individuati usando tf-idf o stopwords. Tuttavia, in un tweet corpus, alcune parole estremamente disinformative, come "il", "e", "è", ecc., Si verificano tanto quanto le parole che sono cruciali per classificare correttamente il testo. Non riesco a rimuovere tutte le parole che hanno meno di 3 lettere, perché alcune caratteristiche non informative sono più grandi di quelle e alcune informative sono più piccole.

Se potessi, mi piacerebbe non dover usare stopword, a causa della necessità di aggiornare frequentemente l'elenco. Tuttavia, se questa è la mia unica opzione, suppongo che dovrò andare con esso.

Quindi, per riassumere la mia domanda, qualcuno sa come veramente ottenere le parole più informative nella fonte specifica che è un Tweet?

EDIT: Sto cercando di classificare in tre gruppi: positivo, negativo e neutro. Inoltre, mi stavo chiedendo, per TF-IDF, dovrei solo tagliare le parole con i punteggi bassi, o anche alcuni con i punteggi più alti? In ogni caso, quale percentuale del vocabolario dell'origine del testo verrebbe esclusa dal processo di selezione delle caratteristiche?

+0

Quanto è grande il tuo gruppo di tweet? Che tipo di punteggi stai ottenendo in questo momento? Inoltre, hai preso in considerazione l'utilizzo di un classificatore diverso da Naive Bayes e/o l'utilizzo di altre funzionalità oltre alle parole (ad esempio, autore)? –

+0

Non ho considerato l'utilizzo di altre funzionalità: gli autori sarebbero troppo diversi. Il mio corpus, per il momento, è solo dell'ordine di un paio di centinaia di tweet. Per quanto riguarda i punteggi, a seconda delle dimensioni del mio corpus test (sempre più grande), vanno da 0 a 0,3, direi. – elliottbolzan

+0

per punteggio, intendevo precisione/F1/qualunque cosa tu stia misurando. E potresti ottenere risultati migliori se hai un corpus più grande: ad es. idf potrebbe diventare molto più accurato. –

risposta

3

il post sul blog vi collega al descrive il metodo dishow_most_informative_features, ma la NaiveBayesClassifier ha anche un most_informative_features metodo che restituisce le caratteristiche e non solo stamparli. Potresti semplicemente impostare un cutoff in base alle tue serie di allenamenti - caratteristiche come "il", "e" e altre caratteristiche non importanti sarebbero in fondo alla lista in termini di informatività.

È vero che questo approccio potrebbe essere soggetto a overfitting (alcune funzionalità sarebbero molto più importanti nel set di allenamento che nel set di test), ma ciò sarebbe vero per tutto ciò che filtra le funzionalità in base al set di allenamento.

+0

Intendi il metodo show_most_informative_features? Se sì, mi piacerebbe molto la tua soluzione per funzionare, ma questo è esattamente il mio problema: si scopre che "il", secondo gli standard del classificatore, è molto informativo. Infatti, nei tweet che sto analizzando, non sembra così tanto! – elliottbolzan

+0

Intendevo "most_informative_features", non "show_most_informative_features" - la differenza è che show_most_informative_features le stampa solo (che non ha alcun valore per l'algoritmo), mentre la maggior parte delle feature_informative restituisce loro (vedi l'API I collegata a sopra). Per quanto riguarda "il" che sembra essere informativo, sembrerebbe essere il sovrametallo che sto descrivendo. Ma potrebbe anche essere correlato alla metrica scadente utilizzata da NLTK per quantificare "l'informatività", che non è un guadagno di informazioni. Domanda importante: quante classificazioni hai? –

+0

Ho solo classificato circa 200 tweet. Dal momento che il metodo di guadagno delle informazioni di NLTK è sbagliato, dovresti usare quello trovato sul post del blog che ho citato in qualche modo aiuto? – elliottbolzan