Einführung Als ich die Verarbeitung der natürlichen Sprache reibungslos las, wurde ich in Kapitel 6, Übung 5, erwischt. Als ich versuchte, Dokumente anhand der maximalen Entropieklassifizierung zu klassifizieren, wurden Fehler ausgegeben und nicht verschoben.
# -*- coding: utf-8 -*-
#from __future__ import division
import nltk,re
import random
import numpy
#Kategorisieren Sie Filmkritiken als positiv oder negativ
#Daten
from nltk.corpus import movie_reviews
documents = [(list(movie_reviews.words(fileid)),category)
for category in movie_reviews.categories()
for fileid in movie_reviews.fileids(category)]
random.shuffle(documents)
#Identitätsextraktor
all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
word_features = all_words.keys()[:2000]#Häufiges Wort 2000
def document_features(document):
document_words = set(document)
features = {}
for w in word_features:
features['contains(%s)' % w] = (w in document) #Gibt an, ob sich top2000 Zeichen im Dokument befinden
return features
#Schulung und Prüfung von Klassifikatoren
featuresets = [(document_features(d),c) for (d,c) in documents]
train_set,test_set = featuresets[100:],featuresets[:100]
#Maximale Entropieklassifizierung
maxentclassifier = nltk.MaxentClassifier.train(train_set)
#test
print "MaxentClassifier"
print nltk.classify.accuracy(maxentclassifier,test_set)
print maxentclassifier.show_most_informative_features(5)
Der Fehler sieht so aus
==> Training (100 iterations)
Iteration Log Likelihood Accuracy
---------------------------------------
1 -0.69315 0.498
/usr/local/lib/python2.7/site-packages/nltk/classify/maxent.py:1332: RuntimeWarning: overflow encountered in power
exp_nf_delta = 2 ** nf_delta
/usr/local/lib/python2.7/site-packages/nltk/classify/maxent.py:1334: RuntimeWarning: invalid value encountered in multiply
sum1 = numpy.sum(exp_nf_delta * A, axis=0)
/usr/local/lib/python2.7/site-packages/nltk/classify/maxent.py:1335: RuntimeWarning: invalid value encountered in multiply
sum2 = numpy.sum(nf_exp_nf_delta * A, axis=0)
/usr/local/lib/python2.7/site-packages/nltk/classify/maxent.py:1341: RuntimeWarning: invalid value encountered in divide
deltas -= (ffreq_empirical - sum1) / -sum2
Final nan 0.502
Anscheinend gibt die Standardvariable in maxent.py einen Fehler aufgrund eines Überlaufs aus. Also habe ich verschiedene Brillen ausprobiert, aber japanische Informationen kamen nicht leicht heraus, also machte ich mir eine Notiz.
Es wurde unter Bezugnahme auf hier korrigiert.
Hello Dmitry,
will this change affect the performance? Based on my test, the improvement between iterations drops a lot, comparing to GIS algorithm with default set. the accuracy could reach to 70% after three iterations using GIS, but only 58% after using the modified IIS.
- Mai 2012 Star Period 1 UTC-4 18:05:38 Uhr, Dmitry Sergeev Shado: It seems that changing exp_nf_delta = 2 ** nf_delta (maxent.py line ~1350) to exp_nf_delta = 2 ** numpy.sqrt(nf_delta) do the trick.
Deshalb
sudo vi /usr/local/lib/python2.7/site-packages/nltk/classify/maxent.py
maxent.py
.
.
.
for rangenum in range(MAX_NEWTON):
nf_delta = numpy.outer(nfarray, deltas)
#exp_nf_delta = 2 ** nf_delt #von hier
exp_nf_delta = 2 ** numpy.sqrt(nf_delta) #Ändern Sie dies
nf_exp_nf_delta = nftranspose * exp_nf_delta
sum1 = numpy.sum(exp_nf_delta * A, axis=0)
sum2 = numpy.sum(nf_exp_nf_delta * A, axis=0)
.
.
.
Ich habe es erneut versucht und es ist gelungen. Es ist schwer zu lernen, weil es auf Japanisch nicht viele Informationen gibt, aber ich möchte die Verarbeitung natürlicher Sprache gut lernen!
Recommended Posts