Classificação do documento: tf-idf antes ou depois da filtragem de recursos?


8

Tenho um projeto de classificação de documentos em que estou obtendo o conteúdo do site e depois atribuindo um dos vários rótulos ao site de acordo com o conteúdo.

Eu descobri que o tf-idf poderia ser muito útil para isso. No entanto, eu não tinha certeza de quando exatamente usá-lo.

Supondo que um site que se preocupe com um tópico específico faça menção repetida, esse foi o meu processo atual:

  1. Recuperar conteúdo do site, analisar o texto sem formatação
  2. Normalizar e conter o conteúdo
  3. Tokenize em unigramas (talvez bigrams também)
  4. Recupere uma contagem de cada unigrama para o documento fornecido, filtrando palavras de tamanho baixo e de ocorrência baixa
  5. Treine um classificador como NaiveBayes no conjunto resultante

Minha pergunta é a seguinte: Onde o tf-idf se encaixaria aqui ? Antes de normalizar / stemming? Depois de normalizar, mas antes de tokenizar? Depois de tokenizar?

Qualquer insight seria muito apreciado.


Editar:

Após uma inspeção mais minuciosa, acho que posso ter entendido mal como o TF-IDF opera. Na etapa acima de 4 que eu descrevo, eu teria que alimentar a totalidade dos meus dados em TF-IDF de uma vez? Se, por exemplo, meus dados forem os seguintes:

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

Aqui, a estrutura mais externa é uma lista, contendo tuplas, contendo um dicionário (ou mapa de hash) e uma string.

Eu teria que alimentar a totalidade desses dados na calculadora TF-IDF de uma vez para alcançar o efeito desejado? Especificamente, observei o TfidfVectorizer do scikit -learn para fazer isso, mas estou um pouco inseguro quanto ao seu uso, pois os exemplos são escassos.

Respostas:


8

Como você descreveu, a Etapa 4 é onde você deseja usar o TF-IDF. Essencialmente, o TD-IDF contará cada termo em cada documento e atribuirá uma pontuação, dada a frequência relativa na coleção de documentos.

No entanto, há um grande passo faltando no seu processo: anotando um conjunto de treinamento. Antes de treinar seu classificador, você precisará anotar manualmente uma amostra de seus dados com os rótulos que deseja aplicar automaticamente usando o classificador.

Para facilitar tudo isso, considere usar o Classificador Stanford . Ele executará a extração do recurso e criará o modelo do classificador (suportando vários algoritmos diferentes de aprendizado de máquina), mas você ainda precisará anotar os dados do treinamento manualmente.


Antes de treinar o classificador, eu formato os dados em tuplas de ({tokenized content}, category). Como eu tenho os sites do conjunto de treinamento em um banco de dados e já categorizados, isso não é um problema. Os rótulos que o classificador poderá aplicar serão apenas os que foram vistos no conjunto de treinamento anotado, correto?
user991710

Re: "Os rótulos que o classificador poderá aplicar serão apenas aqueles que foram vistos no conjunto de treinamento anotado, correto?" Corrigir. No aprendizado supervisionado, o classificador não poderá criar categorias novas / invisíveis. Se você quiser fazer isso, deve procurar algo como cluster ou modelagem de tópicos.
Charlie Greenbacker

Muito obrigado pela informação! Como você também respondeu minha pergunta, eu aceitarei isso como a resposta.
user991710

Peço desculpas por trazer isso de volta depois de aceitar a resposta acima, mas achei que teria melhores chances de obter uma resposta para a minha atualização se lhe perguntasse diretamente. Para evitar comentários longos, eu apreciaria muito se você pudesse dar uma olhada na minha edição no post original.
user991710

1
RE: "eu precisaria alimentar todos os meus dados no TF-IDF de uma só vez?" Sim, é assim que funciona. RE: "Eu estive analisando o TfidfVectorizer do scikit-learn para fazer isso, mas estou um pouco inseguro quanto ao seu uso, pois os exemplos são muito escassos". Aqui está um exemplo que eu escrevi: github.com/charlieg/… - provavelmente é melhor se você usar um corpus de documentos como entrada, em vez de alguma tupla dict + string que você criou.
Charlie Greenbacker
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.