Introduction Alors que je lisais correctement le traitement du langage naturel, je me suis retrouvé dans le chapitre 6, exercice 5. Lorsque j'ai essayé de classer des documents en utilisant la classification d'entropie maximale, cela a craché des erreurs et n'a pas bougé.
# -*- coding: utf-8 -*-
#from __future__ import division
import nltk,re
import random
import numpy
#Catégoriser les critiques de films comme positives ou négatives
#Les données
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)
#Extracteur d'identité
all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words())
word_features = all_words.keys()[:2000]#Mot fréquent 2000
def document_features(document):
document_words = set(document)
features = {}
for w in word_features:
features['contains(%s)' % w] = (w in document) #Si les 2000 premiers caractères sont dans le document
return features
#Formation et test des classificateurs
featuresets = [(document_features(d),c) for (d,c) in documents]
train_set,test_set = featuresets[100:],featuresets[:100]
#Classification d'entropie maximale
maxentclassifier = nltk.MaxentClassifier.train(train_set)
#test
print "MaxentClassifier"
print nltk.classify.accuracy(maxentclassifier,test_set)
print maxentclassifier.show_most_informative_features(5)
L'erreur ressemble à ceci
==> 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
Apparemment, la variable par défaut dans maxent.py génère une erreur en raison d'un débordement. J'ai donc essayé différents googles, mais les informations japonaises ne sont pas sorties facilement, alors j'ai pris une note.
Il a été corrigé en faisant référence à ici.
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.
7 mai 2012 Période stellaire 1 UTC-4 18:05:38, Dmitri 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.
Voilà pourquoi
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 #d'ici
exp_nf_delta = 2 ** numpy.sqrt(nf_delta) #Changer pour cela
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)
.
.
.
J'ai essayé à nouveau et cela a réussi. C'est difficile à apprendre car il n'y a pas beaucoup d'informations en japonais, mais je veux bien apprendre le traitement du langage naturel!
Recommended Posts