2016-03-09 5 views
2

J'essayais de sauver Tagger HMM de NLTK comme suit, avec Pickle. Mais il me donne l'erreur comme suit, S'il vous plaît me suggérer une solution.Erreur lors de l'enregistrement NLTK HMM

>>> import nltk 
>>> import pickle 
>>> brown_a = nltk.corpus.brown.tagged_sents()[:300] 
>>> hmm_tagger=nltk.HiddenMarkovModelTagger.train(brown_a) 
>>> sent = nltk.corpus.brown.sents()[400] 
>>> hmm_tagger.tag(sent) 
[(u'He', u'PPS'), (u'is', u'BEZ'), (u'not', u'*'), (u'interested', u'VBN'), (u'in', u'IN'), (u'being', u'NN'), (u'named', u'IN'), (u'a', u'AT'), (u'full-time', u'JJ'), (u'director', u'NN'), (u'.', u'.')] 
>>> f = open('my_tagger.pickle', 'wb') 
>>> pickle.dump(hmm_tagger, f) 

Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    pickle.dump(hmm_tagger, f) 
    File "C:\Python27\lib\pickle.py", line 1376, in dump 
    Pickler(file, protocol).dump(obj) 
    File "C:\Python27\lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "C:\Python27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python27\lib\pickle.py", line 425, in save_reduce 
    save(state) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python27\lib\pickle.py", line 669, in _batch_setitems 
    save(v) 
    File "C:\Python27\lib\pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "C:\Python27\lib\pickle.py", line 425, in save_reduce 
    save(state) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\pickle.py", line 655, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python27\lib\pickle.py", line 669, in _batch_setitems 
    save(v) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\pickle.py", line 754, in save_global 
    (obj, module, name)) 
PicklingError: Can't pickle <function estimator at 0x0575F6F0>: it's not found as nltk.tag.hmm.estimator 
>>> 

Je suis sur Python2.7.11 avec NLTK3.1 sur MS-Windows10.

Merci à l'avance.

Répondre

0

Pourquoi voulez-vous décaper le modèle? L'entraînement sur le corpus brun est extrêmement rapide. Et si vous voulez un meilleur tagger de partie du discours, pensez à regarder https://spacy.io/ qui est facile à utiliser en Python a un excellent support de décapage et produit des résultats de pointe. En effet, les tagueurs HMM sont vraiment mauvais de nos jours.

Quoi qu'il en soit, il s'agit d'un bogue NLTK. Trois options:

  1. rapport du bug à NLTK et/ou corriger en déplaçant la fonction estimateur en dehors de la fonction _train de mettre dans le module (de sorte que cornichon peut le trouver dans nltk.tag.hmm.estimator
  2. Fournir votre propre estimateur fonction de sorte que cornichon trouve dans votre propre module
  3. Utilisez une alternative de conserves au vinaigre, comme l'aneth ou cloudpickle: ils peuvent être en mesure de gérer cette fonction estimateur

Voici comment vider votre tagger en utilisant l'aneth.

import nltk 
import dill 

brown_a = nltk.corpus.brown.tagged_sents()[:300] 
hmm_tagger=nltk.HiddenMarkovModelTagger.train(brown_a) 
sent = nltk.corpus.brown.sents()[400] 
hmm_tagger.tag(sent) 
# [(u'He', u'PPS'), (u'is', u'BEZ'), (u'not', u'*'), (u'interested', u'VBN'), (u'in', u'IN'), (u'being', u'NN'), (u'named', u'IN'), (u'a', u'AT'), (u'full-time', u'JJ'), (u'director', u'NN'), (u'.', u'.')] 

with open('my_tagger.dill', 'wb') as f: 
    dill.dump(hmm_tagger, f) 

Maintenant, vous pouvez charger le tagger:

import dill 

with open('my_tagger.dill', 'rb') as f: 
    hmm_tagger = dill.load(f) 

hmm_tagger.tag(sent) 
# [(u'He', u'PPS'), (u'is', u'BEZ'), (u'not', u'*'), (u'interested', u'VBN'), (u'in', u'IN'), (u'being', u'NN'), (u'named', u'IN'), (u'a', u'AT'), (u'full-time', u'JJ'), (u'director', u'NN'), (u'.', u'.')]