Classification des documents: tf-idf avant ou après le filtrage des fonctionnalités?

8

J'ai un projet de classification de documents dans lequel j'obtiens le contenu du site, puis j'attribue l'une des nombreuses étiquettes au site Web en fonction du contenu.

J'ai découvert que tf-idf pouvait être très utile pour cela. Cependant, je ne savais pas exactement quand l' utiliser.

En supposant qu'un site Web concerné par un sujet spécifique en fasse mention à plusieurs reprises, c'était mon processus actuel:

  1. Récupérer le contenu du site, analyser le texte brut
  2. Normaliser et limiter le contenu
  3. Tokenize en unigrammes (peut-être aussi des bigrammes)
  4. Récupérer un décompte de chaque unigramme pour le document donné, filtrer les mots de faible longueur et de faible occurrence
  5. Former un classificateur tel que NaiveBayes sur l'ensemble résultant

Ma question est la suivante: où tf-idf se situerait-il ici ? Avant de normaliser / endiguer? Après la normalisation mais avant la tokenisation? Après la tokenisation?

Toute idée serait grandement apprécié.


Éditer:

En y regardant de plus près, je pense que j'ai peut-être rencontré un malentendu quant au fonctionnement de la TF-IDF. À l'étape 4 ci-dessus que je décris, devrais-je alimenter l' intégralité de mes données dans TF-IDF à la fois? Si, par exemple, mes données sont les suivantes:

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

Ici, la structure la plus externe est une liste, contenant des tuples, contenant un dictionnaire (ou hashmap) et une chaîne.

Dois-je introduire l' intégralité de ces données dans le calculateur TF-IDF à la fois pour obtenir l'effet souhaité? Plus précisément, j'ai étudié le scikit-learn TfidfVectorizer pour ce faire, mais je ne suis pas certain de son utilisation, car les exemples sont assez rares.

user991710
la source

Réponses:

8

Comme vous l'avez décrit, l'étape 4 est l'endroit où vous souhaitez utiliser TF-IDF. Essentiellement, TD-IDF comptera chaque terme dans chaque document et attribuera un score compte tenu de la fréquence relative dans l'ensemble de la collection de documents.

Il y a cependant une grande étape manquante dans votre processus: l'annotation d'un ensemble d'entraînement. Avant de former votre classificateur, vous devrez annoter manuellement un échantillon de vos données avec les étiquettes que vous souhaitez pouvoir appliquer automatiquement à l'aide du classificateur.

Pour faciliter tout cela, vous pouvez envisager d'utiliser le classificateur Stanford . Il effectuera l'extraction des fonctionnalités et construira le modèle de classificateur (prenant en charge plusieurs algorithmes d'apprentissage automatique différents), mais vous devrez toujours annoter les données de formation à la main.

Charlie Greenbacker
la source
Avant de former le classificateur, je formate les données en tuples de ({tokenized content}, category). Comme j'ai les sites Web de formation dans une base de données et déjà classés, ce n'est pas un problème. Les étiquettes que le classificateur pourra appliquer ne seront que celles qu'il a vues à partir de l'ensemble d'apprentissage annoté, n'est-ce pas?
user991710
Re: "Les étiquettes que le classifieur pourra appliquer ne seront que celles qu'il a vues de l'ensemble d'entraînement annoté, n'est-ce pas?" Correct. Dans l'apprentissage supervisé, le classificateur ne pourra pas créer de catégories nouvelles / invisibles. Si vous voulez le faire, vous devriez envisager quelque chose comme le clustering ou la modélisation de sujets.
Charlie Greenbacker
Merci beaucoup pour l'information! Comme vous avez également répondu à ma question, je vais l'accepter comme réponse.
user991710
Mes excuses pour avoir rapporté cela après avoir accepté la réponse ci-dessus, mais j'ai estimé que j'aurais de meilleures chances d'obtenir une réponse à ma mise à jour si je vous le demandais directement. Afin d'éviter de longs commentaires, j'apprécierais grandement que vous jetiez un coup d'œil à ma modification dans le message d'origine.
user991710
1
RE: "devrais-je alimenter l'intégralité de mes données dans TF-IDF à la fois?" Oui, c'est comme ça que ça marche. RE: "J'ai regardé le scikit-learn TfidfVectorizer pour ce faire, mais je ne suis pas certain de son utilisation car les exemples sont assez rares." Voici un exemple que j'ai écrit: github.com/charlieg/… - il est probablement préférable que vous utilisiez un corpus de documents en entrée, plutôt qu'un tuple dict + string que vous avez créé.
Charlie Greenbacker