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
- Was mache ich falsch?
- 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%
Nach In [22] - corpus = [[Tupel (l) für l im Satz] für Satz im Korpus] – RAVI
Danke, @RAVI) –