[PYTHON] 100 Amateur-Sprachverarbeitungsklopfen: 75

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.

75. Gewicht der Identität

Überprüfen Sie die Top 10 Merkmale mit hohem Gewicht und die Top 10 Merkmale mit niedrigem Gewicht im logistischen Regressionsmodell, das in> 73 gelernt wurde.

Der fertige Code:

main.py


# coding: utf-8
import codecs
import numpy as np

fname_features = 'features.txt'
fname_theta = 'theta.npy'
fencoding = 'cp1252'		# Windows-1252 scheint

#Identitätslesung
with codecs.open(fname_features, 'r', fencoding) as file_in:
	features = list(file_in)

#Lernergebnisse lesen
theta = np.load(fname_theta)

#Nach Gewicht sortieren und Indexarray erstellen
index_sorted = np.argsort(theta)

#Die oberen und unteren 10 Elemente werden angezeigt
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)'))

Ausführungsergebnis:

Ausführungsergebnis


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

Gewicht der Identität

Das Gewicht der Identität ist der Wert von $ \ theta $ selbst. Wenn der Wert groß ist, steigt der Wert der hypothetischen Funktion auf die positive Seite, wenn das Wort erscheint, und wenn der Wert negativ ist, nimmt er auf die negative Seite ab. Da es das Ergebnis des Stemmings ist, werden einige Wörter in der Mitte abgeschnitten, aber es scheint, dass die Top 10 positive und die schlechtesten 10 negative Wörter sind, sodass Sie das Gewicht der Identität wie erwartet lernen können. Es scheint zu geben.

Index der sortierten Ergebnisse abrufen

Es ist leicht, nach dem Gewicht der Natur zu sortieren, aber es erfordert etwas Einfallsreichtum.

In dem Code werden die Elementgewichte $ \ theta $ in der Matrix "Theta" gespeichert, und das entsprechende Elementzeichenfolgenarray wird in "Features" gespeichert. Wenn Sie hier einfach nach dem Wert von "Theta" sortieren, wird nur "Theta" neu angeordnet, und obwohl Sie die Gewichtswerte der Top 10 und der schlechtesten 10 sehen können, können Sie die entsprechende Identität nicht kennen. Daher müssen "Features" auch zusammen sortiert werden. Das ist etwas nervig.

Ein nützlicher Ort hier ist Numpy.argsort (). Dies sortiert das Zielarray, aber das Ergebnis ist kein Array sortierter Werte, sondern ein Array sortierter Indexindizes.

Wenn Sie beispielsweise wie dieses Mal in aufsteigender Reihenfolge sortieren, hat der Rückgabewert die Form [Index des minimalen Elements, Index des zweiten Elements, ... Index des maximalen Elements]. Daher können Sie anhand des zurückgegebenen Index die entsprechende Identität finden, indem Sie das entsprechende Element im Array der Features "Features" betrachten. Das ist praktisch!

Eine Sache zu beachten ist, dass "Theta" eine Matrix von 3.228 Elementen ist, während "Merkmale" 3.227 Elemente sind. Wie in Vektorisierung von Problem 73 erläutert, ist das erste Element von "Theta" ein Gewicht, das "keine Identität" entspricht, und wird daher um eins verschoben. Ich bin. Setzen Sie daher den Index auf -1, wenn Sie das entsprechende Element von features überprüfen. Wenn der Index 0 ist, ist dies das Gewicht, das "keine Identität" entspricht.

Das ist alles für den 76. 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: 56
100 Amateur-Sprachverarbeitungsklopfen: 24
100 Amateur-Sprachverarbeitungsklopfen: 50
100 Amateur-Sprachverarbeitungsklopfen: 59
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: 22
100 Amateur-Sprachverarbeitungsklopfen: 61
100 Amateur-Sprachverarbeitungsklopfen: 94
100 Amateur-Sprachverarbeitungsklopfen: 54
100 Amateur-Sprachverarbeitungsklopfen: 04
100 Amateur-Sprachverarbeitungsklopfen: 78
100 Amateur-Sprachverarbeitungsklopfen: 12
100 Amateur-Sprachverarbeitungsklopfen: 14
100 Amateur-Sprachverarbeitungsklopfen: 42
100 Amateur-Sprachverarbeitungsklopfen: 19
100 Amateur-Sprachverarbeitungsklopfen: 75
100 Amateur-Sprachverarbeitungsklopfen: 98
100 Amateur-Sprachverarbeitungsklopfen: 83
100 Amateur-Sprachverarbeitungsklopfen: 95
100 Amateur-Sprachverarbeitungsklopfen: 32
100 Amateur-Sprachverarbeitungsklopfen: 96
100 Amateur-Sprachverarbeitungsklopfen: 87
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