[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 74

Es ist ein Herausforderungsrekord von 100 Sprachverarbeitungsklopfen 2015. Die Umgebung ist Ubuntu 16.04 LTS + Python 3.5.2 : : Anaconda 4.1.1 (64-Bit). Klicken Sie hier, um eine Liste der vergangenen Schläge anzuzeigen (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

Kapitel 8: Maschinelles Lernen

In diesem Kapitel wird die Aufgabe, Sätze mithilfe des Satzpolaritätsdatensatzes v1.0 der von Bo Pang und Lillian Lee veröffentlichten Filmkritikdaten in positive (positive) oder negative (negative) zu klassifizieren (Polaritätsanalyse). Arbeiten Sie daran.

74. Prognose

Implementieren Sie unter Verwendung des in> 73 erlernten logistischen Regressionsmodells ein Programm, das die Polaritätsbezeichnung eines bestimmten Satzes ("+1" für ein positives Beispiel, "-1" für ein negatives Beispiel) und seine Vorhersagewahrscheinlichkeit berechnet.

Der fertige Code:

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 scheint

stemmer = snowballstemmer.stemmer('english')

#Liste der Stoppwörter http://xpo6.com/list-of-english-stop-words/Aus dem CSV-Format
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):
	'''Gibt zurück, ob das Zeichen ein Stoppwort ist
Fall ausgleichen

Rückgabewert:
Richtig für Stoppwörter, Falsch für anders
	'''
	return str.lower() in stop_words


def hypothesis(data_x, theta):
	'''Hypothetische Funktion
	data_Verwenden Sie für x Theta für Daten_Vorhersage y

Rückgabewert:
Vorhersagewertmatrix
	'''
	return 1.0 / (1.0 + np.exp(-data_x.dot(theta)))


def extract_features(data, dict_features):
	'''Extrahieren Sie die Identität aus dem Text
Diktieren Sie aus dem Text_Extrahieren Sie die in den Funktionen und enthaltenen Funktionen
	dict_features['(Identität)']Gibt eine Matrix mit der Position 1 zurück.
Das erste Element ist auf 1 festgelegt. Für Gewichte, die nicht der Natur entsprechen.

Rückgabewert:
Das erste Element und die Position des entsprechenden Elements+Matrix mit 1 als 1
	'''
	data_one_x = np.zeros(len(dict_features) + 1, dtype=np.float64)
	data_one_x[0] = 1		#Das erste Element ist fest und 1 für Gewichte, die nicht der Natur entsprechen.

	for word in data.split(' '):

		#Entfernen Sie vorher und nachher leere Zeichen
		word = word.strip()

		#Stoppen Sie die Wortentfernung
		if is_stopword(word):
			continue

		#Stemming
		word = stemmer.stemWord(word)

		#Identitätsindex abrufen, entsprechenden Teil der Matrix auf 1 setzen
		try:
			data_one_x[dict_features[word]] = 1
		except:
			pass		# dict_Ignorieren Sie Funktionen, die nicht in Funktionen enthalten sind

	return data_one_x


def load_dict_features():
	'''features.Lesen Sie txt und erstellen Sie ein Wörterbuch, um die Identität in einen Index umzuwandeln
Der Indexwert basiert auf 1 Features.Entspricht der Zeilennummer in txt.

Rückgabewert:
Ein Wörterbuch, das Identitäten in Indizes konvertiert
	'''
	with codecs.open(fname_features, 'r', fencoding) as file_in:
		return {line.strip(): i for i, line in enumerate(file_in, start=1)}


#Identitätswörterbuch lesen
dict_features = load_dict_features()

#Lernergebnisse lesen
theta = np.load(fname_theta)

#Eingang
review = input('Bitte geben Sie eine Bewertung ein--> ')

#Identitätsextraktion
data_one_x = extract_features(review, dict_features)

#Prognose
h = hypothesis(data_one_x, theta)
if h > 0.5:
	print('label:+1 ({})'.format(h))
else:
	print('label:-1 ({})'.format(1 - h))

Ausführungsergebnis:

Ich habe die ersten 3 Bewertungen von "sentiment.txt" in Frage 70 abgegeben. Übrigens ist die richtige Antwort der 1. und 3. Bewertung positiv (+1) und die 2. negativ (-1).

Ausführungsergebnis


segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/74$ python main.py 
Bitte geben Sie eine Bewertung ein--> deep intelligence and a warm , enveloping affection breathe out of every frame .
label:+1 (0.9881093733272299)
segavvy@ubuntu:~/Dokument/100 Sprachverarbeitung klopfen 2015/74$ python main.py 
Bitte geben Sie eine Bewertung ein--> 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:~/Dokument/100 Sprachverarbeitung klopfen 2015/74$ python main.py 
Bitte geben Sie eine Bewertung ein--> 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)

Der erste und der zweite Fall wurden korrekt vorhergesagt, aber der dritte Fall sagte eine positive Bewertung als eine negative voraus. Die Vorhersagewahrscheinlichkeit des ersten Falles beträgt 98,8%, daher scheint es sich um eine ziemlich sichere Vorhersage zu handeln. Die Vorhersagewahrscheinlichkeit der dritten falschen Vorhersage beträgt 63,4%, so dass er anscheinend nicht zuversichtlich war.

Vorhersagemethode

Für die Vorhersage ist es in Ordnung, wenn Sie die Identität aus der Eingabeüberprüfung extrahieren und das Ergebnis der hypothetischen Funktion zur Erstellung einer Vorhersage geben. Die Hypothesenfunktion gibt einen Wert zwischen 0 und 1 zurück. Wenn der Wert größer als 0,5 ist, wird vorausgesagt, dass er positiv ist, und wenn er kleiner als 0,5 ist, wird vorausgesagt, dass er negativ ist. Wenn es genau 0,5 ist, scheint es, dass beide in Ordnung sind, aber diesmal habe ich es negativ gemacht.

Die vorhergesagte Wahrscheinlichkeit wird durch den Wert der hypothetischen Funktion selbst angegeben. Wenn die hypothetische Funktion beispielsweise 0,8 zurückgibt, besteht eine Wahrscheinlichkeit von 80%, dass sie positiv ist. Im Fall von negativ ist die Wahrscheinlichkeit jedoch umso höher, je näher an 0 liegt, sodass der Wert, der durch Subtrahieren des Werts der hypothetischen Funktion von 1 erhalten wird, die Vorhersagewahrscheinlichkeit ist. Wenn die hypothetische Funktion beispielsweise 0,3 zurückgibt, besteht eine Wahrscheinlichkeit von 70% (= 1-0,3), dass sie negativ ist.

Das ist alles für den 75. Schlag. Wenn Sie Fehler haben, würde ich mich freuen, wenn Sie darauf hinweisen könnten.


Recommended Posts

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