2016-07-31 5 views
1

Ich versuche, nltk.tag.hmm.HiddenMarkovModelTagger in eine Gurke zu serialisieren, um es bei Bedarf ohne Umschulung zu verwenden. Nach dem Laden von .pkl sieht mein HMM jedoch untrainiert aus. Meine zwei Fragen hier sind:HMM geladen von Gurke aussieht untrainiert

  1. Was mache ich falsch?
  2. Ist es eine gute Idee überhaupt HMM zu serialisieren, wenn man einen großen Datensatz hat?

Hier ist der Code:

In [1]: import nltk 

In [2]: from nltk.probability import * 

In [3]: from nltk.util import unique_list 

In [4]: import json 

In [5]: with open('data.json') as data_file: 
    ...:   corpus = json.load(data_file) 
    ...:  

In [6]: corpus = [[tuple(l) for l in sentence] for sentence in corpus] 

In [7]: tag_set = unique_list(tag for sent in corpus for (word,tag) in sent) 

In [8]: symbols = unique_list(word for sent in corpus for (word,tag) in sent) 

In [9]: trainer = nltk.tag.HiddenMarkovModelTrainer(tag_set, symbols) 

In [10]: train_corpus = corpus[:4] 

In [11]: test_corpus = [corpus[4]] 

In [12]: hmm = trainer.train_supervised(train_corpus, estimator=LaplaceProbDist) 

In [13]: print('%.2f%%' % (100 * hmm.evaluate(test_corpus))) 
100.00% 

Wie Sie HMM trainiert wird, sehen. Jetzt habe ich es Beize:

In [14]: import pickle 

In [16]: output = open('hmm.pkl', 'wb') 

In [17]: pickle.dump(hmm, output) 

In [18]: output.close() 

Nach Reset und laden das Modell sieht stummer als ein Kasten Felsen:

In [19]: %reset 
Once deleted, variables cannot be recovered. Proceed (y/[n])? y 

In [20]: import pickle 

In [21]: import json 

In [22]: with open('data.json') as data_file: 
    ....:  corpus = json.load(data_file) 
    ....:  

In [23]: test_corpus = [corpus[4]] 

In [24]: pkl_file = open('hmm.pkl', 'rb') 

In [25]: hmm = pickle.load(pkl_file) 

In [26]: pkl_file.close() 

In [27]: type(hmm) 
Out[27]: nltk.tag.hmm.HiddenMarkovModelTagger 

In [28]: print('%.2f%%' % (100 * hmm.evaluate(test_corpus))) 
0.00% 
+1

Nach In [22] - corpus = [[Tupel (l) für l im Satz] für Satz im Korpus] – RAVI

+0

Danke, @RAVI) –

Antwort

0

1) Nach dem in [22], müssen Sie hinzufügen -

corpus = [[tuple(l) for l in sentence] for sentence in corpus] 

2) Das Umschulungsmodell jedes Mal zu Testzwecken wird zeitaufwendig sein. Also, es ist gut zu pickle.dump Ihr ​​Modell und laden Sie es.