Clasificación de documentos: tf-idf antes o después del filtrado de características?

8

Tengo un proyecto de clasificación de documentos donde obtengo contenido del sitio y luego asigno una de las numerosas etiquetas al sitio web de acuerdo con el contenido.

Descubrí que tf-idf podría ser muy útil para esto. Sin embargo, no estaba seguro de cuándo exactamente usarlo.

Asumiendo que un sitio web que se ocupa de un tema específico hace mención repetida de él, este fue mi proceso actual:

  1. Recupere el contenido del sitio, analice el texto sin formato
  2. Normalizar y detener el contenido
  3. Tokenizar en unigramas (tal vez bigrams también)
  4. Recupere un recuento de cada unigrama para el documento dado, filtrando palabras de baja longitud y baja ocurrencia
  5. Entrene a un clasificador como NaiveBayes en el conjunto resultante

Mi pregunta es la siguiente: ¿Dónde encajaría tf-idf aquí ? ¿Antes de normalizar / detener? ¿Después de normalizar pero antes de tokenizar? ¿Después de tokenizar?

Cualquier idea sería muy apreciada.


Editar:

Tras una inspección más cercana, creo que me he encontrado con un malentendido sobre cómo opera TF-IDF. En el paso 4 anterior que describo, ¿tendría que ingresar la totalidad de mis datos en TF-IDF de una vez? Si, por ejemplo, mis datos son los siguientes:

[({tokenized_content_site1}, category_string_site1), 
 ({tokenized_content_site2}, category_string_site2), 
...
 ({tokenized_content_siten}, category_string_siten)}]

Aquí, la estructura más externa es una lista, que contiene tuplas, que contiene un diccionario (o hashmap) y una cadena.

¿Tendría que introducir la totalidad de esos datos en la calculadora TF-IDF de una vez para lograr el efecto deseado? Específicamente, he estado mirando el scikit-learn TfidfVectorizer para hacer esto, pero no estoy seguro de su uso, ya que los ejemplos son bastante escasos.

usuario991710
fuente

Respuestas:

8

Como lo ha descrito, el Paso 4 es donde desea usar TF-IDF. Esencialmente, TD-IDF contará cada término en cada documento y asignará un puntaje dada la frecuencia relativa en la colección de documentos.

Sin embargo, falta un gran paso en su proceso: anotar un conjunto de entrenamiento. Antes de entrenar a su clasificador, deberá anotar manualmente una muestra de sus datos con las etiquetas que desea poder aplicar automáticamente usando el clasificador.

Para facilitar todo esto, es posible que desee considerar usar el Clasificador de Stanford . Realizará la extracción de características y construirá el modelo clasificador (compatible con varios algoritmos de aprendizaje automático diferentes), pero aún tendrá que anotar los datos de entrenamiento a mano.

Charlie Greenbacker
fuente
Antes de entrenar al clasificador, formateo los datos en tuplas de ({tokenized content}, category). Como tengo el conjunto de sitios web de capacitación en una base de datos y ya categorizado, no es un problema. Las etiquetas que el clasificador podrá aplicar solo serán aquellas que haya visto en el conjunto de entrenamiento anotado, ¿correcto?
user991710
Re: "Las etiquetas que el clasificador podrá aplicar solo serán aquellas que haya visto en el conjunto de entrenamiento anotado, ¿correcto?" Correcto. En el aprendizaje supervisado, el clasificador no podrá crear categorías nuevas / invisibles. Si desea hacer eso, debe buscar algo como la agrupación o el modelado de temas.
Charlie Greenbacker
¡Muchas gracias por la información! Cuando respondiste mi pregunta también, aceptaré esto como la respuesta.
user991710
Mis disculpas por traer esto de vuelta después de aceptar la respuesta anterior, pero calculé que tendría mejores probabilidades de obtener una respuesta a mi actualización si se lo preguntara directamente. Para evitar comentarios largos, agradecería mucho que pudieras echar un vistazo a mi edición en la publicación original.
user991710
1
RE: "¿tendría que ingresar la totalidad de mis datos en TF-IDF de una vez?" Sí, así es como funciona. RE: "He estado mirando el scikit-learn TfidfVectorizer para hacer esto, pero no estoy seguro de su uso, ya que los ejemplos son bastante escasos". Aquí hay un ejemplo que escribí: github.com/charlieg/… . Probablemente sea mejor si usa un corpus de documentos como entrada, en lugar de una tupla dict + string que creó.
Charlie Greenbacker