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.
En utilisant le modèle de régression logistique appris en> 73, implémentez un programme qui calcule l'étiquette de polarité d'une phrase donnée ("+1" pour un exemple positif, "-1" pour un exemple négatif) et sa probabilité de prédiction.
main.py
# coding: utf-8
import codecs
import snowballstemmer
import numpy as np
fname_sentiment = 'sentiment.txt'
fname_features = 'features.txt'
fname_theta = 'theta.npy'
fencoding = 'cp1252' # Windows-1252 semble
stemmer = snowballstemmer.stemmer('english')
#Liste des mots vides http://xpo6.com/list-of-english-stop-words/À partir du format CSV
stop_words = (
'a,able,about,across,after,all,almost,also,am,among,an,and,any,are,'
'as,at,be,because,been,but,by,can,cannot,could,dear,did,do,does,'
'either,else,ever,every,for,from,get,got,had,has,have,he,her,hers,'
'him,his,how,however,i,if,in,into,is,it,its,just,least,let,like,'
'likely,may,me,might,most,must,my,neither,no,nor,not,of,off,often,'
'on,only,or,other,our,own,rather,said,say,says,she,should,since,so,'
'some,than,that,the,their,them,then,there,these,they,this,tis,to,too,'
'twas,us,wants,was,we,were,what,when,where,which,while,who,whom,why,'
'will,with,would,yet,you,your').lower().split(',')
def is_stopword(str):
'''Renvoie si le caractère est un mot vide
Égaliser le cas
Valeur de retour:
Vrai pour les mots vides, Faux pour différents
'''
return str.lower() in stop_words
def hypothesis(data_x, theta):
'''Fonction hypothétique
data_Pour x, utilisez thêta pour les données_Prédire y
Valeur de retour:
Matrice de valeurs prédites
'''
return 1.0 / (1.0 + np.exp(-data_x.dot(theta)))
def extract_features(data, dict_features):
'''Extraire l'identité du texte
Dict du texte_Extraire les fonctionnalités incluses dans les fonctionnalités et
dict_features['(Identité)']Renvoie une matrice avec la position 1.
Le premier élément est fixé à 1. Pour des poids qui ne correspondent pas à la nature.
Valeur de retour:
Le premier élément et la position de l'élément correspondant+Matrice avec 1 comme 1
'''
data_one_x = np.zeros(len(dict_features) + 1, dtype=np.float64)
data_one_x[0] = 1 #Le premier élément est fixe et 1 pour les poids qui ne correspondent pas à la nature.
for word in data.split(' '):
#Supprimer les caractères vides avant et après
word = word.strip()
#Arrêter la suppression des mots
if is_stopword(word):
continue
#Tige
word = stemmer.stemWord(word)
#Obtenez l'indice d'identité, définissez la partie correspondante de la matrice sur 1
try:
data_one_x[dict_features[word]] = 1
except:
pass # dict_Ignorer les fonctionnalités introuvables dans les fonctionnalités
return data_one_x
def load_dict_features():
'''features.Lire txt et créer un dictionnaire pour convertir l'identité en index
La valeur de l'index est basée sur 1, caractéristiques.Correspond au numéro de ligne en txt.
Valeur de retour:
Un dictionnaire qui convertit les identités en index
'''
with codecs.open(fname_features, 'r', fencoding) as file_in:
return {line.strip(): i for i, line in enumerate(file_in, start=1)}
#Lire le dictionnaire d'identité
dict_features = load_dict_features()
#Lecture des résultats d'apprentissage
theta = np.load(fname_theta)
#contribution
review = input('Veuillez entrer un commentaire--> ')
#Extraction d'identité
data_one_x = extract_features(review, dict_features)
#Prévoir
h = hypothesis(data_one_x, theta)
if h > 0.5:
print('label:+1 ({})'.format(h))
else:
print('label:-1 ({})'.format(1 - h))
J'ai mis dans les 3 premières critiques de "sentiment.txt" faites à la question 70. À propos, la bonne réponse aux 1er et 3e avis est positive (+1) et la 2e est négative (-1).
Résultat d'exécution
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/74$ python main.py
Veuillez entrer un commentaire--> deep intelligence and a warm , enveloping affection breathe out of every frame .
label:+1 (0.9881093733272299)
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/74$ python main.py
Veuillez entrer un commentaire--> before long , the film starts playing like general hospital crossed with a saturday night live spoof of dog day afternoon .
label:-1 (0.6713196688353891)
segavvy@ubuntu:~/document/100 traitement du langage Knock 2015/74$ python main.py
Veuillez entrer un commentaire--> by the time it ends in a rush of sequins , flashbulbs , blaring brass and back-stabbing babes , it has said plenty about how show business has infiltrated every corner of society -- and not always for the better .
label:-1 (0.6339673922580253)
Les premier et deuxième cas ont été correctement prédits, mais le troisième cas a prédit une évaluation positive comme négative. La probabilité de prédiction du premier cas est de 98,8%, il semble donc être une prédiction assez confiante. La probabilité de prédiction d'une troisième mauvaise prédiction est de 63,4%, il semble donc qu'il n'était pas confiant.
La prédiction est OK si vous extrayez l'identité de la revue d'entrée et donnez le résultat à la fonction d'hypothèse pour faire une prédiction. La fonction hypothétique renvoie une valeur comprise entre 0 et 1. Si la valeur est supérieure à 0,5, il est prédit qu'elle sera positive et si elle est inférieure à 0,5, elle sera négative. Si c'est exactement 0,5, il semble que l'un ou l'autre va bien, mais cette fois je l'ai rendu négatif.
La probabilité prédite est indiquée par la valeur de la fonction hypothétique elle-même. Par exemple, si la fonction hypothétique renvoie 0,8, il y a 80% de chances qu'elle soit positive. Cependant, dans le cas de négatif, plus proche de 0, plus la probabilité est élevée, donc la valeur obtenue en soustrayant la valeur de la fonction hypothétique de 1 est la probabilité de prédiction. Par exemple, si la fonction hypothétique renvoie 0,3, il y a 70% de chances (= 1-0,3) qu'elle soit négative.
C'est tout pour le 75e coup. Si vous avez des erreurs, j'apprécierais que vous les signaliez.
Recommended Posts