[Python] Percentage Positief/Negatief uit word2vec

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Hieronymus
  • Registratie: Juli 2005
  • Niet online
Ik ben bezig met sentiment analysis uit word2vec, en gebruik daarvoor Linan Qiu's code (Github).

In het kort: Deze code maakt vectors van woorden uit een trainbestand die je kan trainen tot een classifier. Die classifier laat je dan los op een stel reviews (hier van IMDB) die zegt of ze positief of negatief zijn.

Ik heb dit allemaal werkend, en uiteindelijk rolt uit het stukje code (test.py, hieronder toegevoegd) simpelweg een percentage van hoeveel er correct is voorspeld. Ik neem aan dat de code dus een prediction per review maakt, en dit checkt tegen de bekende waarde. Die bekende waarde lijkt in dit geval gewoon een complete .txt met alleen negatieve of positieve reviews. Ik wil echter graag weten hoeveel documenten (hier reviews) nu eigenlijk als positief of negatief zijn voorspeld, om daar vervolgens een percentage uit te kunnen destilleren.

Iemand idee hoe dat te tellen? (Uiteindelijk wil ik uiteindelijk gewoon een positief en een negatief percentage qua documenten per bestand)

Thanks!

Hier het stuk code, in Python 2.7.10. Dit is dus post-vectorisatie (wat gebeurt met run.py in die Github)

code: test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# gensim modules
from gensim import utils
from gensim.models.doc2vec import LabeledSentence
from gensim.models import Doc2Vec

# numpy
import numpy

# shuffle
from random import shuffle

# logging
import logging
import os.path
import sys
import cPickle as pickle

# logres
from sklearn.linear_model import LogisticRegression

#commit

model = Doc2Vec.load('./imdb.d2v')

train_arrays = numpy.zeros((25000, 100))
train_labels = numpy.zeros(25000)

for i in range(12500):
    prefix_train_pos = 'TRAIN_POS_' + str(i)
    prefix_train_neg = 'TRAIN_NEG_' + str(i)
    train_arrays[i] = model.docvecs[prefix_train_pos]
    train_arrays[12500 + i] = model.docvecs[prefix_train_neg]
    train_labels[i] = 1
    train_labels[12500 + i] = 0


test_arrays = numpy.zeros((25000, 100))
test_labels = numpy.zeros(25000)

for i in range(12500):
    prefix_test_pos = 'TEST_POS_' + str(i)
    prefix_test_neg = 'TEST_NEG_' + str(i)
    test_arrays[i] = model.docvecs[prefix_test_pos]
    test_arrays[12500 + i] = model.docvecs[prefix_test_neg]
    test_labels[i] = 1
    test_labels[12500 + i] = 0
   

classifier = LogisticRegression()
classifier.fit(train_arrays, train_labels)

print classifier.score(test_arrays, test_labels)

So now, less than five years later, you can go up on a steep hill in Las Vegas and look West, and with the right kind of eyes you can almost see the high-water mark — that place where the wave finally broke and rolled back.

Beste antwoord (via Hieronymus op 10-03-2016 20:21)


  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
De echte labels lijken in dit geval een verdeling van 50%/50% te hebben, maar als ik je goed begrijp wil je de verdeling weten van de voorspellingen. Met een classifier in sklearn kun je de voorspellingen krijgen met de predict(X) methode. Vervolgens moet je daarvan berekenen welk percentage positief is. Dit komt neer op de volgende regels:

code:
1
2
3
predictions = classifier.predict(test_arrays)
posratio = (predictions == 1).mean()
print 'pos/neg', posratio, (1. - posratio)


Mocht je niet bekend zijn met NumPy volgt hier wat uitleg. predictions is een vector van voorspellingen, welke allemaal 0 of 1 zijn (dit is de set van je class labels zoals je die gebruikt hebt in je training set). Met predictions == 1 krijg je een vector met booleans terug voor alle voorspelling of 't positief was of niet. Aangezien false als 0 geldt en true als 1, kun je de ratio van positieve terugkrijgen door het gemiddelde van deze vector te berekenen. Dit is dus een shortcut voor (predictions == 1).sum()/len(predictions).

[ Voor 48% gewijzigd door narotic op 10-03-2016 16:18 ]

- = Step Into The Pit | Industrial Strength = -

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • narotic
  • Registratie: Maart 2002
  • Laatst online: 02-11-2021
De echte labels lijken in dit geval een verdeling van 50%/50% te hebben, maar als ik je goed begrijp wil je de verdeling weten van de voorspellingen. Met een classifier in sklearn kun je de voorspellingen krijgen met de predict(X) methode. Vervolgens moet je daarvan berekenen welk percentage positief is. Dit komt neer op de volgende regels:

code:
1
2
3
predictions = classifier.predict(test_arrays)
posratio = (predictions == 1).mean()
print 'pos/neg', posratio, (1. - posratio)


Mocht je niet bekend zijn met NumPy volgt hier wat uitleg. predictions is een vector van voorspellingen, welke allemaal 0 of 1 zijn (dit is de set van je class labels zoals je die gebruikt hebt in je training set). Met predictions == 1 krijg je een vector met booleans terug voor alle voorspelling of 't positief was of niet. Aangezien false als 0 geldt en true als 1, kun je de ratio van positieve terugkrijgen door het gemiddelde van deze vector te berekenen. Dit is dus een shortcut voor (predictions == 1).sum()/len(predictions).

[ Voor 48% gewijzigd door narotic op 10-03-2016 16:18 ]

- = Step Into The Pit | Industrial Strength = -


Acties:
  • 0 Henk 'm!

  • Hieronymus
  • Registratie: Juli 2005
  • Niet online
De "echte" labels zijn idd hier ook 50/50 verdeeld, dat wordt straks anders. ;) Thanks! :D

So now, less than five years later, you can go up on a steep hill in Las Vegas and look West, and with the right kind of eyes you can almost see the high-water mark — that place where the wave finally broke and rolled back.