取储存您的classifier
对象在相同状态下将重新创建它,这是当你腌它,这样你就可以继续使用您的数据集的新数据进行更新。在程序运行结束时,您再次腌制classifier
并再次将其保存到文件中。不要覆盖同一个文件,而是要保留备份(甚至更好,一系列备份),以防万一你搞砸了。这样,您可以轻松地返回已知状态classifier
。
你应该尝试酸洗,使用一个简单的程序和一个简单的对象来腌泡和取下,直到你对这一切如何工作完全自信。
下面是如何更新腌渍classifier
数据的粗略草图。
import pickle
import os
from os.path import exists
# other imports required for nltk ...
picklename = "naivebayes.pickle"
# stuff to set up featuresets ...
featuresets = [(find_features(rev), category) for (rev, category) in documents]
numtrain = int(len(documents) * 90/100)
training_set = featuresets[:numtrain]
testing_set = featuresets[numtrain:]
# Load or create a classifier and apply training set to it
if exists(picklename):
# Update existing classifier
with open(picklename, "rb") as f:
classifier = pickle.load(f)
classifier.train(training_set)
else:
# Create a brand new classifier
classifier = nltk.NaiveBayesClassifier.train(training_set)
# Create backup
if exists(picklename):
backupname = picklename + '.bak'
if exists(backupname):
os.remove(backupname)
os.rename(picklename, backupname)
# Save
with open(picklename, "wb") as f:
pickle.dump(classifier, f)
你第一次运行这个程序,它会创建一个新的classifier
,在training_set
与数据训练它,然后腌制classifier
为“naivebayes.pickle”。随后每次运行此程序时,它都会加载旧的classifier
并向其应用更多的训练数据。
顺便说一句,如果你是在Python 2这样做,你应该使用更快cPickle
模块;你可以做到这一点通过
import cPickle as pickle
没有更换
自动发生。程序的下一次运行需要打开文件,将pickle加载到一个普通的Python对象中,修改该对象,然后像上面那样保存它。 –
@KirkStrauser这就是我所说的。我应该像这样离开我的代码才对吗?为下一次运行。已创建的naivebayes.pickle会更新正确吗? – Arqam
分类器是否适合RAM而不会影响其余的计算? – sobek