[PYTHON] 100 coups de traitement du langage amateur: 74

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).

Chapitre 8: Apprentissage automatique

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.

74. Prévisions

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.

Le code fini:

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))

Résultat de l'exécution:

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.

Méthode de prédiction

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

100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 71
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 60
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 30
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 84
100 coups de traitement du langage amateur: 81
100 coups de langue amateur: 33
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 40
100 coups de traitement du langage amateur: 45
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 22
100 coups de traitement du langage amateur: 61
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de langue amateur: 04
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de langue amateur: 08
100 coups de traitement du langage amateur: 42
100 coups de traitement du langage amateur: 19
100 coups de traitement du langage amateur: 73
100 coups de traitement du langage amateur: 75
100 coups de traitement du langage amateur: 83
100 coups de traitement du langage amateur: 95
100 coups de traitement du langage amateur: 96
100 coups de traitement du langage amateur: 72
100 coups de traitement du langage amateur: 79
100 coups de traitement du langage amateur: 23
100 coups de langue amateur: 05
100 coups de langue amateur: 00
100 coups de langue amateur: 02
100 coups de traitement du langage amateur: 37
100 coups de traitement du langage amateur: 21
100 coups de traitement du langage amateur: 68
100 coups de traitement du langage amateur: 11
100 coups de traitement du langage amateur: 90
100 coups de traitement du langage amateur: 74
100 coups de traitement du langage amateur: 66
100 coups de traitement du langage amateur: 28
100 coups de traitement du langage amateur: 64
100 coups de traitement du langage amateur: 34
100 coups de traitement du langage amateur: 36
100 coups de traitement du langage amateur: 77
100 coups de langue amateur: 01
100 coups de traitement du langage amateur: 16
100 coups de traitement du langage amateur: 27
100 coups de traitement du langage amateur: 10
100 coups de traitement du langage amateur: 03
100 coups de traitement du langage amateur: 82
100 coups de traitement du langage amateur: 69
100 coups de traitement du langage amateur: 53