C'est un record de défi de 100 langues de traitement knock 2015. L'environnement est Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64 bits). Cliquez ici pour une liste des coups passés (http://qiita.com/segavvy/items/fb50ba8097d59475f760).
Dans ce chapitre, la tâche de classer les phrases en positives (positives) ou négatives (négatives) à l'aide du jeu de données de polarité des phrases v1.0 de Movie Review Data publié par Bo Pang et Lillian Lee (analyse de polarité). Travailler sur.
Vérifiez les 10 principaux traits de poids élevé et les 10 principaux traits de faible poids dans le modèle de régression logistique appris en> 73.
main.py
# coding: utf-8
import codecs
import numpy as np
fname_features = 'features.txt'
fname_theta = 'theta.npy'
fencoding = 'cp1252' # Windows-1252 semble
#Lecture d'identité
with codecs.open(fname_features, 'r', fencoding) as file_in:
features = list(file_in)
#Lecture des résultats d'apprentissage
theta = np.load(fname_theta)
#Trier par poids et créer un tableau d'index
index_sorted = np.argsort(theta)
#10 éléments du haut et du bas affichés
print('top 10')
for index in index_sorted[:-11:-1]:
print('\t{}\t{}'.format(theta[index],
features[index - 1].strip() if index > 0 else '(none)'))
print('worst 10')
for index in index_sorted[0:10:]:
print('\t{}\t{}'.format(theta[index],
features[index - 1].strip() if index > 0 else '(none)'))
Résultat d'exécution
top 10
2.5513381450571875 refresh
2.3661550679971954 engross
2.1686400756091198 unexpect
1.9558595013013638 examin
1.921611726928927 remark
1.8642762301453122 glorious
1.6736177761639448 quiet
1.6361584092330672 delight
1.6264395695012035 confid
1.6207851665872708 beauti
worst 10
-2.6661835195544206 bore
-2.381809993645082 dull
-2.264732545707236 wast
-2.0944221636736557 fail
-2.043315628825945 flat
-1.9875250134818985 mediocr
-1.921981567258377 worst
-1.9199082235005225 suppos
-1.9103686908457609 routin
-1.8511208689897838 appar
Le poids de l'identité est la valeur de $ \ theta $ lui-même. Si la valeur est grande, la valeur de la fonction hypothétique augmentera vers le côté affirmatif lorsque le mot apparaît, et si la valeur est négative, elle diminuera vers le côté négatif. Puisqu'il s'agit du résultat d'une racine, certains mots sont coupés au milieu, mais il semble que les 10 premiers sont des mots positifs et les 10 pires sont des mots négatifs, vous pouvez donc apprendre le poids de l'identité comme vous vous y attendiez. Il semble y avoir.
Il est facile de trier selon le poids de la nature, mais cela demande une certaine ingéniosité.
Dans le code, les poids d'élément $ \ theta $ sont stockés dans la matrice theta
, et le tableau de chaînes d'élément correspondant est stocké dans features
. Si vous triez simplement par la valeur de theta
ici, seul theta
sera réorganisé, et bien que vous puissiez voir les valeurs de poids des 10 premiers et des 10 pires, vous ne pouvez pas connaître l'identité correspondante. Par conséquent, les «caractéristiques» doivent également être triées en tandem. C'est un peu ennuyeux.
Un endroit utile ici est Numpy.argsort ()
. Cela trie le tableau cible, mais le résultat n'est pas un tableau de valeurs triées, mais un tableau d'index triés.
Par exemple, si vous triez normalement par ordre croissant comme cette fois, la valeur de retour sera sous la forme [index de l'élément minimum, index du deuxième élément, ... index de l'élément maximum]. Par conséquent, en utilisant l'index retourné, vous pouvez trouver l'identité correspondante en regardant l'élément correspondant dans le tableau de fonctionnalités features
. C'est pratique!
Une chose à noter est que «thêta» est une matrice de 3228 éléments, tandis que «features» est de 3227 éléments. Comme expliqué dans Vectorisation du problème 73, le premier élément de theta
est un poids correspondant à" pas d'identité ", il est donc décalé de un. Je suis. Par conséquent, définissez l'index sur -1 lors de la vérification de l'élément correspondant de features
. Si l'indice est 0, c'est le poids correspondant à "pas d'identité".
C'est tout pour le 76e coup. Si vous avez des erreurs, j'apprécierais que vous les signaliez.
Recommended Posts