2012-01-08 33 views
6

Actualmente estoy tratando de clasificar Tweets usando el clasificador Naive Bayes en NLTK. Estoy clasificando tweets relacionados con símbolos de acciones en particular, usando el prefijo '$' (por ejemplo: $ AAPL). He estado basando mi secuencia de comandos de Python en esta publicación de blog: Twitter Sentiment Analysis using Python and NLTK. Hasta ahora, he estado obteniendo resultados razonablemente buenos. Sin embargo, creo que hay mucho, mucho margen de mejora.Tweet Classifier Feature-Selection NLTK

En mi método de selección de palabras, decidí implementar el algoritmo tf-idf para seleccionar las palabras más informativas. Sin embargo, después de haber hecho esto, sentí que los resultados no fueron tan impresionantes.

Implementé la técnica en el siguiente blog: Text Classification Sentiment Analysis Eliminate Low Information Features. Los resultados fueron muy similares a los obtenidos con el algoritmo tf-idf, lo que me llevó a inspeccionar más detenidamente la lista de "características más informativas" de mi clasificador. Entonces fue cuando me di cuenta de que tenía un problema mayor:

Los tweets y el lenguaje real no usan la misma gramática y redacción. En un texto normal, muchos artículos y verbos se pueden seleccionar usando tf-idf o palabras vacías. Sin embargo, en un corpus de tweets, algunas palabras extremadamente desinformativas, como 'the', 'y', 'is', etc., ocurren tanto como las palabras que son cruciales para categorizar el texto correctamente. No puedo eliminar todas las palabras que tienen menos de 3 letras, porque algunas características no informativas son más grandes que eso, y algunas informativas son más pequeñas.

Si pudiera, me gustaría no tener que usar palabras vacías, debido a la necesidad de actualizar frecuentemente la lista. Sin embargo, si esa es mi única opción, creo que tendré que ir con eso.

Entonces, para resumir mi pregunta, ¿alguien sabe cómo realmente obtener las palabras más informativas en la fuente específica que es un Tweet?

EDIT: Estoy tratando de clasificar en tres grupos: positivo, negativo y neutral. Además, me preguntaba, para TF-IDF, ¿debería limitarme las palabras con los puntajes bajos, o también algunas con los puntajes más altos? En cada caso, ¿qué porcentaje del vocabulario de la fuente de texto excluiría del proceso de selección de características?

+0

¿Cuán grande es tu corpus de tweets? ¿Qué tipo de puntajes estás recibiendo en este momento? Además, ¿ha considerado usar un clasificador diferente al de Naive Bayes y/o usar otras características aparte de las palabras (por ejemplo, autor)? –

+0

No he considerado el uso de otras características: los autores serían demasiado diversos. Mi corpus, por el momento, es solo del orden de un par de cientos de tweets. En cuanto a los puntajes, dependiendo del tamaño de mi corpus de prueba (cada vez más grande), van de 0 a 0.3, diría yo. – elliottbolzan

+0

por puntuación, me refiero a precisión/F1/lo que sea que esté midiendo. Y puede obtener mejores resultados si tiene un corpus más grande: p. idf will puede ser mucho más preciso. –

Respuesta

3

la entrada de blog le vincula con la describe show_most_informative_features método, pero el NaiveBayesClassifier también tiene un most_informative_features método que vuelve las características en lugar de sólo imprimirlos. Simplemente podría establecer un punto de corte basado en su conjunto de entrenamiento: características como "el", "y" y otras características sin importancia se encontrarían en la parte inferior de la lista en términos de información.

Es cierto que este enfoque podría estar sujeto a sobreajuste (algunas características serían mucho más importantes en su conjunto de entrenamiento que en su conjunto de prueba), pero eso sería cierto para cualquier cosa que filtre características basadas en su conjunto de entrenamiento.

+0

¿Te refieres al método show_most_informative_features? Si es así, me encantaría su solución para trabajar, pero ese es exactamente mi problema: resulta que 'el', según los estándares del clasificador, es muy informativo. De hecho, en los tweets que estoy analizando, ¡no parece mucho! – elliottbolzan

+0

Quise decir "most_informative_features", no "show_most_informative_features" - la diferencia es que show_most_informative_features solo las imprime (lo cual es inútil para el algoritmo), mientras que most_informative_features las devuelve (vea la API a la que he vinculado anteriormente). En cuanto a "el" que parece ser informativo, parecería ser el sobreajuste que describo. Pero también podría estar relacionado con la métrica crummy que utiliza NLTK para cuantificar la "informatividad", que no es ganancia de información. Pregunta importante: ¿Cuántas clasificaciones tienes? –

+0

Solo he clasificado alrededor de 200 tweets. Dado que el método de obtención de información de NLTK es malo, ¿debería utilizar el que se encuentra en la publicación del blog que mencioné la ayuda de alguna manera? – elliottbolzan