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