Sélection de fonctions et réduction pour la classification de texte

Je travaille actuellement sur un projet, un simple parsingur de sentiments, de sorte qu’il y aura 2 et 3 classes dans des cas distincts . J’utilise un corpus assez riche en termes de mots uniques (environ 200 000). J’ai utilisé la méthode du « sac de mots » pour la sélection des fonctionnalités et pour réduire le nombre de caractéristiques uniques , une élimination est effectuée en raison d’une valeur de seuil de fréquence d’occurrence . Le dernier ensemble de fonctionnalités comprend environ 20 000 fonctionnalités, soit une diminution de 90% , mais insuffisante pour la précision prévue de la prédiction de test. J’utilise à mon tour LibSVM et SVM-light pour l’entraînement et la prédiction ( kernel linéaire et RBF ), ainsi que Python et Bash en général.

La plus grande précision observée jusqu’à présent est d’environ 75% et j’ai besoin d’au moins 90% . C’est le cas pour la classification binary . Pour l’ entraînement multi-classes , la précision tombe à environ 60% . J’ai besoin d’au moins 90% dans les deux cas et je ne peux pas imaginer comment l’augmenter: en optimisant les parameters d’entraînement ou en optimisant la sélection des fonctionnalités ?

J’ai lu des articles sur la sélection des fonctionnalités dans la classification des textes et j’ai découvert que trois méthodes différentes sont utilisées, avec une corrélation claire entre elles. Ces méthodes sont les suivantes:

  • Approche de fréquence des sacs de mots (BOW)
  • Gain d’information (IG)
  • X ^ 2 Statistique (CHI)

La première méthode est déjà celle que j’utilise, mais je l’utilise très simplement et j’ai besoin de conseils pour mieux l’utiliser afin d’obtenir une précision suffisante. Je manque également de connaissances sur les implémentations pratiques d’ IG et de CHI et je cherche une aide pour me guider dans cette voie.

Merci beaucoup, et si vous avez besoin d’informations supplémentaires pour obtenir de l’aide, faites le moi savoir.


  • @larsmans: Seuil de fréquence : Je recherche les occurrences de mots uniques dans des exemples, de sorte que si un mot apparaît dans différents exemples assez fréquemment, il est inclus dans l’ensemble de fonctionnalités en tant que fonctionnalité unique.

  • @TheManWithNoName: Tout d’abord merci pour vos efforts pour expliquer les préoccupations générales de la classification des documents. J’ai examiné et expérimenté toutes les méthodes que vous proposez et autres. J’ai trouvé la méthode de la différence proportionnelle (PD) la meilleure pour la sélection des fonctionnalités, où les caractéristiques sont unifiées et la présence de termes (TP) pour la pondération (je ne comprenais pas pourquoi vous appeliez TF-Fréquence). IDF) en tant que méthode d’indexation, je la considère plutôt comme une méthode de pondération des caractéristiques ). Le prétraitement est également un aspect important pour cette tâche, comme vous l’avez mentionné. J’ai utilisé certains types d’élimination de chaînes pour affiner les données, ainsi que l’ parsing syntaxique et l’ parsing . Notez également que je travaille sur le turc , qui a des caractéristiques différentes de l’anglais. Enfin, j’ai réussi à atteindre ~ 88% de précision (f-mesure) pour la classification binary et ~ 84% pour la multi-classe . Ces valeurs sont des preuves solides du succès du modèle que j’ai utilisé. C’est ce que j’ai fait jusqu’ici. Travaillant maintenant sur des modèles de regroupement et de réduction, ont essayé LDA et LSI et passé aux modèles moVMF et peut-être sphériques (LDA + moVMF), qui semblent mieux fonctionner sur des corpus de nature objective, comme le corpus d’actualités. Si vous avez des informations et des conseils sur ces questions, j’apprécierai. J’ai besoin d’informations en particulier pour configurer une interface (orientée python, open-source) entre les méthodes de réduction de la dimension de l’espace des fonctionnalités (LDA, LSI, moVMF, etc.) et les méthodes de clustering (k-means, hiérarchique, etc.).

C’est probablement un peu tard pour la table, mais …

Comme Bee le souligne et que vous êtes déjà au courant, l’utilisation de SVM en tant que classificateur est perdue si vous avez déjà perdu les informations dans les étapes préalables à la classification. Cependant, le processus de classification des textes nécessite beaucoup plus que quelques étapes et que chaque étape ait des effets significatifs sur le résultat. Par conséquent, avant d’examiner des mesures de sélection de caractéristiques plus complexes, il existe un certain nombre de possibilités beaucoup plus simples qui nécessitent généralement une consommation de ressources beaucoup plus faible.

Est-ce que vous pré-traitez les documents avant d’effectuer une numérisation / une représentation dans le format bag-of-words? Supprimer simplement les mots vides ou la ponctuation peut améliorer considérablement la précision.

Avez-vous envisagé de modifier la représentation de vos sacs de mots pour utiliser, par exemple, des paires de mots ou des n-grammes? Vous pouvez constater que vous avez plus de dimensions pour commencer mais qu’elles se condensent beaucoup plus et contiennent plus d’informations utiles.

Il est également intéressant de noter que la réduction de dimension est la sélection de fonctionnalités / extraction de caractéristiques. La différence réside dans le fait que la sélection de caractéristiques réduit les dimensions de manière univariée, c’est-à-dire qu’elle supprime les termes tels qu’ils apparaissent sans les modifier, alors que l’extraction de caractéristiques (à laquelle Ben Allison fait référence) des termes simples pour produire des termes orthodonaux plus élevés qui, espérons-le, contiennent plus d’informations et réduisent l’espace des fonctionnalités.

En ce qui concerne votre utilisation de la fréquence des documents, utilisez-vous simplement la probabilité / le pourcentage de documents contenant un terme ou utilisez-vous les densités de terme trouvées dans les documents? Si la catégorie 1 ne comporte que 10 douches et qu’elles contiennent chacune un terme, alors la catégorie 1 est bien associée au document. Cependant, si la catégorie 2 ne comporte que 10 documents contenant chacun le même terme cent fois, alors la catégorie 2 a évidemment un rapport beaucoup plus élevé avec ce terme que la catégorie 1. Si les densités de termes ne sont pas sockets en compte, cette information est perdue et moins vous avez de catégories, plus l’impact de cette perte est grand. Dans le même ordre d’idées, il n’est pas toujours prudent de ne retenir que les termes ayant des fréquences élevées, car ils ne fournissent peut-être pas d’informations utiles. Par exemple, si un terme apparaît une centaine de fois dans chaque document, il est considéré comme un terme de bruit et, bien qu’il soit important, il est inutile de le conserver dans votre jeu de fonctionnalités.

En outre, comment indexez-vous les données, utilisez-vous le modèle d’espace vectoriel avec une indexation booléenne simple ou une mesure plus complexe telle que TF-IDF? Compte tenu du faible nombre de catégories dans votre scénario, une mesure plus complexe sera bénéfique car elles peuvent prendre en compte l’importance du terme pour chaque catégorie par rapport à son importance dans l’ensemble du jeu de données.

Personnellement, j’expérimenterais d’abord certaines des possibilités ci-dessus, puis envisagerais de modifier la sélection / extraction des entités avec une (ou une combinaison de) équations complexes si vous avez besoin d’une amélioration supplémentaire des performances.


Additionnel

Sur la base des nouvelles informations, il semble que vous soyez sur la bonne voie et que la précision de 84% (F1 ou BEP – précision et rappel basée sur des problèmes multi-classes) est généralement considérée comme très bonne pour la plupart des jeux de données. Il se peut que vous ayez déjà acquis toutes les fonctionnalités riches en informations à partir des données, ou que certains soient encore élagués.

Cela dit, l’parsing du «dénombrement des valeurs aberrantes», qui utilise le déclin du gain d’information dans les caractéristiques périphériques, permet de déterminer la probabilité de réduction de la dimension agressive pour un jeu de données particulier. être perdu lors de la sélection des fonctionnalités. Vous pouvez l’utiliser sur les données brutes et / ou traitées pour donner une estimation de l’agressivité avec laquelle vous devriez viser à élaguer les fonctions (ou les supprimer le cas échéant). Un article le décrivant peut être trouvé ici:

Papier avec comptage des informations aberrantes

En ce qui concerne la description de TF-IDF comme méthode d’indexation, vous avez raison de dire qu’elle est une mesure de pondération des fonctionnalités, mais j’estime qu’elle est principalement utilisée dans le processus d’indexation (elle peut également être utilisée pour réduire les dimensions). Le raisonnement en est que certaines mesures sont mieux orientées vers la sélection / extraction de caractéristiques, tandis que d’autres sont préférables pour la pondération des fonctionnalités spécifiquement dans vos vecteurs de document (à savoir les données indexées). Cela est généralement dû au fait que les mesures de réduction des dimensions sont déterminées par catégorie, tandis que les mesures de pondération des indices ont tendance à être davantage orientées vers les documents pour donner une représentation vectorielle supérieure.

En ce qui concerne LDA, LSI et moVMF, je crains d’avoir trop peu d’expérience pour vous donner des conseils. Malheureusement, je n’ai pas non plus travaillé avec des jeux de données turcs ou le langage python.

Je recommande la réduction de la dimensionnalité au lieu de la sélection des fonctionnalités. Considérez soit la décomposition en valeurs singulières, soit l’ parsing en composantes principales , soit même mieux, étant donné qu’elle est adaptée aux représentations de types de mots, l’ allocation de Dirichlet latente . Cela vous permettra de retenir théoriquement des représentations qui incluent tous les mots, mais de les réduire à des dimensions moins importantes en exploitant les relations de similarité (ou même de synonymie) entre elles.

Toutes ces méthodes ont des implémentations assez standard auxquelles vous pouvez accéder et exécuter — si vous nous indiquez la langue que vous utilisez, moi ou quelqu’un d’autre sera en mesure de vous orienter dans la bonne direction.

Le svm linéaire est recommandé pour les caractéristiques de grande dimension. Sur la base de mon expérience, la limitation ultime de la précision SVM dépend des “caractéristiques” positives et négatives. Vous pouvez faire une recherche de grid (ou dans le cas de svm linéaire, vous pouvez simplement rechercher la meilleure valeur de coût) pour trouver les parameters optimaux pour une précision maximale, mais à la fin vous êtes limité par la séparabilité de vos ensembles de caractéristiques. Le fait que vous n’obtenez pas 90% signifie que vous avez encore du travail à faire pour trouver de meilleures fonctionnalités pour décrire vos membres des classes.

Je suis sûr que c’est trop tard pour l’affiche, mais peut-être que ce sera utile à quelqu’un d’autre. L’approche chi-carré de la réduction des fonctionnalités est assez simple à mettre en œuvre. En supposant une classification binary de BoW dans les classes C1 et C2, pour chaque caractéristique f dans candidate_features, calculez la fréquence de f dans C1; calculer les mots totaux C1; répéter les calculs pour C2; Calculer un filtre chi-sqaure détermine les propriétés candidates_features selon que la valeur p est inférieure à un certain seuil (par exemple, p <0,05). Un tutoriel utilisant Python et nltk peut être vu ici: http://streamhacker.com/2010/06/16/text-classification-sentiment-analysis-eliminate-low-information-features/ (mais si je me souviens bien, je crois l’auteur applique incorrectement cette technique à ses données de test, ce qui biaise les résultats rapportés).