[PYTHON] Sélectionnez des fonctionnalités avec des données textuelles

Que présenter dans cet article

Est-il nécessaire de sélectionner le montant de la fonction?

Si vous lisez ceci, je pense que vous avez déjà essayé une sorte d'apprentissage automatique en extrayant des quantités de caractéristiques (ci-après dénommées «éléments») à partir de données texte. Par exemple, la classification des documents.

Même si vous recherchez rapidement Qiita, vous trouverez des articles "essayés". Morning Musume. J'ai essayé de classer automatiquement les blogs. Traitement du langage naturel avec R. Tentative de classification des documents avec Naive Bays

Dans la classification de documents, la méthode de base consiste à créer des données matricielles en utilisant des mots comme arrière-plan. C'est une matrice appelée matrice de fréquence.

Maintenant, une question se pose ici. __ Il y a beaucoup de mots qui ne sont pas liés à la classification, ça va? __

C'est une bonne question. Ça va pas. S'il contient beaucoup de qualités qui ne sont pas liées à la classification, il fera office de bruit. Le bruit entrave l'amélioration des performances de classification, n'est-ce pas? Troublé. Troublé.

Puis vient l'idée de __ "Il suffit de laisser les qualités pertinentes" __. Oui, c'est celui appelé feature selection.

Il y a deux avantages à sélectionner le montant de la fonction.

  1. Améliorer les performances du modèle en sélectionnant correctement la quantité de fonctionnalités avant de plonger dans l'algorithme d'apprentissage automatique (dans certains cas, comme la forêt aléatoire, la sélection de la quantité de fonctionnalités est incluse dans l'algorithme lui-même, mais c'est une autre histoire)
  2. Facilitez l'observation des données

J'ai créé un package qui facilite la sélection du montant de la fonctionnalité.

Il est assez difficile de sélectionner sérieusement le montant de la fonctionnalité. Par conséquent, j'ai créé une Méthode de sélection des fonctionnalités du package que vous utiliserez souvent.

Fonctionne avec Python 3.x. Python 2.x le supportera bientôt.

Méthodes prises en charge

Caractéristiques du package

(Peut-être) tôt

Tous les traitements internes utilisent des matrices scipy clairsemées. De plus, toutes les pièces qui peuvent être distribuées sont multi-traitées, donc c'est raisonnablement rapide.

Il fait le prétraitement du techto.

Si vous faites un dict dans l'état de division morphologique et le jetez, il construira même une matrice clairsemée.

Par exemple, le dict d'entrée ressemble à ceci


input_dict = {
    "label_a": [
        ["I", "aa", "aa", "aa", "aa", "aa"],
        ["bb", "aa", "aa", "aa", "aa", "aa"],
        ["I", "aa", "hero", "some", "ok", "aa"]
    ],
    "label_b": [
        ["bb", "bb", "bb"],
        ["bb", "bb", "bb"],
        ["hero", "ok", "bb"],
        ["hero", "cc", "bb"],
    ],
    "label_c": [
        ["cc", "cc", "cc"],
        ["cc", "cc", "bb"],
        ["xx", "xx", "cc"],
        ["aa", "xx", "cc"],
    ]
}

Jouons un peu

Je l'ai fait avec beaucoup d'efforts, alors je vais l'essayer. J'ai mis les notes ipython que j'ai essayées dans Gist.

Dans les notes ipython, scipy, package de wrapper d'analyse morphologique et package de sélection de fonctionnalités Utilisez 0.9).

Le texte a cinq genres. J'ai pris le texte qui semble être applicable sur le net et je l'ai fait en le copiant. (~~ Ceci est une connaissance collective ~~)

5 genres

est. [^ 1]

J'ai essayé PMI et SOA.

J'essaierai d'extraire du résultat.

Résultats PMI

Ces résultats ont été vus par ordre décroissant de score.

{'label': 'iranian_cities', 'score': 0.67106056632551592, 'word': 'population'},
{'label': 'conan_movies', 'score': 0.34710665998172219, 'word': 'Apparence'},
 {'label': 'av_actress', 'score': 0.30496452198069324, 'word': 'Actrice AV'},
 {'label': 'av_actress', 'score': 0.26339266409673928, 'word': 'Apparence'},
{'label': 'av_actress', 'score': 0.2313987055319647, 'word': 'Femme'},

Les mots "Euh, ouais, c'est vrai ~" sont alignés.

Les mots qui sont facilement liés à l'étiquette sont fortement pondérés, ce sera donc un succès en termes de sélection de fonctionnalités.

Il ne semble y avoir aucune suggestion particulière en termes d'observation des données.

Au contraire, qu'arrive-t-il aux endroits où le score est faible?

 {'label': 'av_actress', 'score': 5.7340738217327128e-06, 'word': 'Homme'},
 {'label': 'conan_movies', 'score': 5.7340738217327128e-06, 'word': '3'},
 {'label': 'conan_movies', 'score': 5.7340738217327128e-06, 'word': 'À'},
 {'label': 'conan_movies', 'score': 5.7340738217327128e-06, 'word': 'Notation'},
 {'label': 'terror', 'score': 5.7340738217327128e-06, 'word': 'Moule'}

?? Le résultat est également mitigé. Il semble que ce soit un mot utilisé fonctionnellement dans le document. C'est une erreur dans l'analyse morphologique que le nombre "3" soit mélangé ... (Cela arrive souvent lors de l'utilisation du dictionnaire Neologd de Mecab)

Mots fonctionnels supprimés à un score faible. À cet égard, il semble que cela fonctionne.

Résultats SOA

L'ordre a légèrement changé. C'est souvent le cas (probablement) car SOA est basé sur des expressions PMI.

[{'label': 'conan_movies', 'score': 5.3625700793847084, 'word': 'Apparence'},
 {'label': 'iranian_cities', 'score': 5.1604646721932461, 'word': 'population'},
 {'label': 'av_actress', 'score': 5.1395513523987937, 'word': 'Actrice AV'},
 {'label': 'av_actress', 'score': 4.8765169465650002, 'word': 'Sa'},
 {'label': 'av_actress', 'score': 4.8765169465650002, 'word': 'Hmm'},
 {'label': 'av_actress', 'score': 4.8765169465650002, 'word': 'Femme'},
 {'label': 'terror', 'score': 4.8765169465650002, 'word': 'Syrie'},

Maintenant, regardons la partie où le score est faible. La partie avec un score faible en SOA peut être interprétée comme "pertinence à étiqueter".

{'label': 'terror', 'score': -1.4454111483223628, 'word': 'population'},
 {'label': 'iranian_cities', 'score': -1.6468902498643583, 'word': 'Au fait'},
 {'label': 'iranian_cities', 'score': -1.6468902498643583, 'word': 'chose'},
 {'label': 'iranian_cities', 'score': -1.6468902498643583, 'word': 'Pendant ~'},
 {'label': 'iranian_cities', 'score': -1.6468902498643583, 'word': 'Fabrication'},
 {'label': 'iranian_cities', 'score': -2.009460329249066, 'word': 'chose'},
 {'label': 'airplane', 'score': -3.3923174227787602, 'word': 'Homme'}]

D'une manière ou d'une autre, ça ne va pas.

Si vous regardez la fréquence dans le document, ce mot n'apparaît qu'une ou deux fois. En d'autres termes, on peut dire que la relation avec l'étiquette est faible et qu'il est raisonnable que la valeur négative ait augmenté.

Résumé

Dans cet article, nous avons parlé de la sélection de la quantité de fonctionnalités et des packages qui facilitent la sélection de la quantité de fonctionnalités.

Cette fois, je n'ai pas vérifié les performances de la classification des documents après avoir sélectionné le montant de la fonctionnalité.

Cependant, c'est une méthode qui a été suffisamment efficace dans les études précédentes. Veuillez l'utiliser pour les tâches de classification de documents.

Vous pouvez l'installer avec pip install DocumentFeature Selection.

Supplément

À partir de la version 1.0 du package, les données d'entrée peuvent être conçues de manière flexible.

Dans un exemple, si vous voulez concevoir la quantité d'entités avec (mot de surface, POS) comme bigramme, vous pouvez donner un tableau de taples comme celui-ci. Ici, ((" il "," N "), (" est "," V ")) est une quantité de caractéristiques.

input_dict_tuple_feature = {
    "label_a": [
        [ (("he", "N"), ("is", "V")), (("very", "ADV"), ("good", "ADJ")), (("guy", "N"),) ],
        [ (("you", "N"), ("are", "V")), (("very", "ADV"), ("awesome", "ADJ")), (("guy", "N"),) ],
        [ (("i", "N"), ("am", "V")), (("very", "ADV"), ("good", "ADJ")), (("guy", "N"),) ]
    ],
    "label_b": [
        [ (("she", "N"), ("is", "V")), (("very", "ADV"), ("good", "ADJ")), (("girl", "N"),) ],
        [ (("you", "N"), ("are", "V")), (("very", "ADV"), ("awesome", "ADJ")), (("girl", "N"),) ],
        [ (("she", "N"), ("is", "V")), (("very", "ADV"), ("good", "ADJ")), (("guy", "N"),) ]
    ]
}

Puisque le taple peut être donné comme quantité de caractéristique de la phrase d'entrée, l'utilisateur peut librement concevoir la quantité de caractéristique. [^ 2] Par exemple, il peut être utilisé pour de telles tâches

--Lorsque vous souhaitez utiliser (mot de surface, une balise) comme quantité d'entité --Lorsque vous souhaitez utiliser l'étiquette d'arête de la dépendance comme quantité d'entités


[^ 1]: On me demande souvent: "Pourquoi l'exemple de texte contient-il des vidéos pour adultes et du persan ou de l'Iran?" C'est parce que j'aime les vidéos pour adultes. Parce que j'étudiais le persan, j'y suis très attaché. [^ 2]: Même dans le passé, il est possible d'extraire de force des entités en faisant de la surface word_tag un type str. Mais n'est-ce pas quelque chose d'intelligent? Avez-vous besoin d'un prétraitement et d'un post-traitement? J'ai pensé, alors j'ai ajouté cette fonction.

Recommended Posts

Sélectionnez des fonctionnalités avec des données textuelles
Analyser les données à l'aide du texte Flash 100x de RegEx
SELECT des données à l'aide de la bibliothèque cliente avec BigQuery
Analyse des données à l'aide de xarray
Nettoyage des données 2 Nettoyage des données à l'aide de DataFrame
Nettoyage des données à l'aide de Python
[Mémo] Correspondance de texte dans le cadre de données pandas à l'aide de Flashtext
Gonfler des données textuelles par retranslation à l'aide de Google Traduction en Python
Méthode de visualisation de données utilisant matplotlib (1)
Prétraitement des données texte (vectorisation, TF-IDF)
Méthode de visualisation de données utilisant matplotlib (2)
Analyse de données à l'aide de pandas python
Développement de texte à l'aide des services Mac
Obtenez les données de comptage OTU (microorganismes) sous forme de fichier texte à l'aide de QIIME2
[Français] scicit-learn 0.18 Tutorial Manipulation des données de texte
Obtenir des données Salesforce à l'aide de l'API REST
Acquisition de données à l'aide de l'API googlemap de python
Méthode de visualisation de données utilisant matplotlib (+ pandas) (5)
(sqlalchemy) Afficher le texte dans le champ de sélection
Générer des images de texte multilingues à l'aide de Python
Analyser les données au format CSV à l'aide de SQL
Obtenez des données Amazon à l'aide de Keep API # 1 Obtenez des données
Liste de contrôle à l'aide de l'arborescence des cases à cocher → Création de texte
Méthode de visualisation de données utilisant matplotlib (+ pandas) (3)
Mémo d'acquisition de données à l'aide de l'API Backlog
Recommandation d'analyse des données à l'aide de MessagePack
Obtenez des données de Twitter avec Tweepy
Méthode de visualisation de données utilisant matplotlib (+ pandas) (4)