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.
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.
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.
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"],
]
}
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.
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.
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é.
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
.
À 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.