我正在使用textblob Python库,但性能不够理想。
我已经在循环之前将其序列化并加载(使用pickle)。
目前处理小型训练数据需要大约0.1秒,而处理33,000条测试数据需要大约0.3秒。我需要让它运行得更快,这是否可能?
部分代码:
# 在循环之前传递训练数据,以便大幅提升性能
trained_text_classifiers = load_serialized_classifier_trainings(config["ALL_CLASSIFICATORS"])
# 指定哪些分类器用于哪些类别
filter_classifiers = get_classifiers_by_resource_names(trained_text_classifiers, config["FILTER_CLASSIFICATORS"])
signal_classifiers = get_classifiers_by_resource_names(trained_text_classifiers, config["SIGNAL_CLASSIFICATORS"])
for (url, headers, body) in iter_warc_records(warc_file, **warc_filters):
start_time = time.time()
body_text = strip_html(body);
# 检查URL内容是否通过过滤器,如果通过则索引,否则忽略
if Filter.is_valid(body_text, filter_classifiers):
print "Indexing", url.url
resp = indexer.index_document(body, body_text, signal_classifiers, url=url, headers=headers, links=bool(args.save_linkgraph_domains))
else:
print "\n"
print "Filtered out", url.url
print "\n"
resp = 0
这个循环对WARC文件的每个主体和元数据进行检查。
这里有两个文本分类检查。
1) 在Filter(非常小的训练数据):
if trained_text_classifiers.classify(body_text) == "True":
return True
else:
return False
2) 在index_document(33,000条训练数据):
prob_dist = trained_text_classifier.prob_classify(body)
prob_dist.max()
# 返回垃圾邮件的概率
return round(prob_dist.prob("spam"), 2)
classify和prob_classify是影响性能的两个方法。
回答:
您可以对数据进行特征选择。良好的特征选择可以将特征减少高达90%,并保持分类性能。在特征选择中,您选择顶级特征(在词袋模型中,您选择最有影响力的词),并基于这些词(特征)训练模型。这可以降低数据的维度(同时也防止维度灾难)。这里有一篇很好的调查报告:特征选择调查
简而言之:
有两种特征选择方法:过滤和包装
过滤方法几乎基于信息理论。搜索“互信息”、“卡方”等以了解这种类型的特征选择
包装方法使用分类算法来估计库中最重要的特征。例如,您选择一些词并评估分类性能(召回率、精确度)。
其他一些方法也可能有用。LSA和LSI可以提高分类性能和时间:https://en.wikipedia.org/wiki/Latent_semantic_analysis
您可以使用scikit进行特征选择和LSA:
http://scikit-learn.org/stable/modules/feature_selection.html