1 import sys,os
2 sys.path.append(os.path.dirname(os.path.abspath(__file__))+"/..")
3 import subprocess
4 import copy
5 import tempfile
6 import types, copy
7 from ExternalClassifier import ExternalClassifier
8 import Utils.Settings as Settings
9 import Utils.Download as Download
10 import Tools.Tool
11
12 from Evaluators.AveragingMultiClassEvaluator import AveragingMultiClassEvaluator
13
14 -def install(destDir=None, downloadDir=None, redownload=False, compile=True, updateLocalSettings=False):
15 print >> sys.stderr, "Installing SVM-Multiclass"
16 if compile:
17 url = Settings.URL["SVM_MULTICLASS_SOURCE"]
18 else:
19 url = Settings.URL["SVM_MULTICLASS_LINUX"]
20 if downloadDir == None:
21 downloadDir = os.path.join(Settings.DATAPATH, "tools/download/")
22 if destDir == None:
23 destDir = Settings.DATAPATH
24 destDir += "/tools/SVMMultiClass"
25
26 Download.downloadAndExtract(url, destDir, downloadDir, redownload=redownload)
27 if compile:
28 print >> sys.stderr, "Compiling SVM-Multiclass"
29 Tools.Tool.testPrograms("SVM-Multiclass", ["make"])
30 subprocess.call("cd " + destDir + "; make", shell=True)
31
32 Tools.Tool.finalizeInstall(["svm_multiclass_learn", "svm_multiclass_classify"],
33 {"svm_multiclass_learn":"echo | ./svm_multiclass_learn -? > /dev/null",
34 "svm_multiclass_classify":"echo | ./svm_multiclass_classify -? > /dev/null"},
35 destDir, {"SVM_MULTICLASS_DIR":destDir}, updateLocalSettings)
36
38 """
39 A wrapper for the Joachims SVM Multiclass classifier.
40 """
41
43 ExternalClassifier.__init__(self, connection=connection)
44 self.defaultEvaluator = AveragingMultiClassEvaluator
45 self.parameterFormat = "-%k %v"
46 self.trainDirSetting = "SVM_MULTICLASS_DIR"
47 self.trainCommand = "svm_multiclass_learn %p %e %m"
48 self.classifyDirSetting = "SVM_MULTICLASS_DIR"
49 self.classifyCommand = "svm_multiclass_classify %e %m %c"
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 if __name__=="__main__":
92
93 try:
94 import psyco
95 psyco.full()
96 print >> sys.stderr, "Found Psyco, using"
97 except ImportError:
98 print >> sys.stderr, "Psyco not installed"
99
100 from optparse import OptionParser
101 import os
102 from Utils.Parameters import *
103 optparser = OptionParser(description="Joachims SVM Multiclass classifier wrapper")
104 optparser.add_option("-e", "--examples", default=None, dest="examples", help="Example File", metavar="FILE")
105 optparser.add_option("-a", "--action", default=None, dest="action", help="TRAIN, CLASSIFY or OPTIMIZE")
106 optparser.add_option("--optimizeStep", default="BOTH", dest="optimizeStep", help="BOTH, SUBMIT or RESULTS")
107 optparser.add_option("--classifyExamples", default=None, dest="classifyExamples", help="Example File", metavar="FILE")
108 optparser.add_option("--classIds", default=None, dest="classIds", help="Class ids", metavar="FILE")
109 optparser.add_option("-m", "--model", default=None, dest="model", help="path to model file")
110
111 optparser.add_option("-o", "--output", default=None, dest="output", help="Output directory or file")
112 optparser.add_option("-r", "--remote", default=None, dest="remote", help="Remote connection")
113
114 optparser.add_option("-p", "--parameters", default=None, dest="parameters", help="Parameters for the classifier")
115
116
117 optparser.add_option("--install", default=None, dest="install", help="Install directory (or DEFAULT)")
118 optparser.add_option("--installFromSource", default=False, action="store_true", dest="installFromSource", help="")
119 (options, args) = optparser.parse_args()
120
121 if options.install != None:
122 downloadDir = None
123 destDir = None
124 if options.install != "DEFAULT":
125 if "," in options.install:
126 destDir, downloadDir = options.install.split(",")
127 else:
128 destDir = options.install
129 install(destDir, downloadDir, False, options.installFromSource)
130 sys.exit()
131
132
133
134
135
136
137 else:
138 assert options.action in ["TRAIN", "CLASSIFY", "OPTIMIZE"]
139 classifier = SVMMultiClassClassifier(Connection.getConnection(options.remote))
140 if options.action == "TRAIN":
141 import time
142 trained = classifier.train(options.examples, options.output, options.parameters, options.classifyExamples)
143 status = trained.getStatus()
144 while status not in ["FINISHED", "FAILED"]:
145 print >> sys.stderr, "Training classifier, status =", status
146 time.sleep(10)
147 status = trained.getStatus()
148 print >> sys.stderr, "Training finished, status =", status
149 if trained.getStatus() == "FINISHED":
150 trained.downloadPredictions()
151 trained.downloadModel()
152 elif options.action == "CLASSIFY":
153 classified = classifier.classify(options.examples, options.output, options.model, True)
154 if classified.getStatus() == "FINISHED":
155 classified.downloadPredictions()
156 else:
157 options.parameters = splitParameters(options.parameters)
158 optimized = classifier.optimize(options.examples, options.output, options.parameters, options.classifyExamples, options.classIds, step=options.optimizeStep)
159