我正在使用sklearn和支持向量机来对文档进行分类。我希望将文档放入的类别是{课程,非课程},其中课程表示由大学专业提供的课程和非课程任何其他课程组成的网页文本。
我构造的这个类与这个类似:
import numpy as np
from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.grid_search import GridSearchCV
from sklearn import metrics
class TestSVG(object):
def __init__(self):
self.text_clf = Pipeline([('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', SGDClassifier(loss='hinge', alpha=1e-3, random_state=42)),
])
self.grid_params = {'vect__ngram_range' : [(1, 1), (1, 2), (1, 3)],
'tfidf__use_idf': (True, False),
'clf__alpha': (1e-2, 1e-3),
}
self.gs_clf = GridSearchCV(self.text_clf, self.grid_params, n_jobs=-1)
self.training_target = []
self.training_data = []
self.testing_data = []
self.testing_target = []
self.classifier = None
def train(self, training_data, training_target):
self.training_data = training_data
self.training_target = training_target
self.classifier = self.gs_clf.fit(self.training_data, self.training_target)
def predict(self, text):
if isinstance(text, basestring):
text = [text]
elif not isinstance(text, list):
raise ValueError("Input for prediction must be text of a list")
if self.classifier is None:
raise ValueError("Classifier must be trained to make predictions.")
return self.classifier.predict(text)
def test(self, testing_data, testing_target):
self.testing_data = testing_data
self.testing_target = testing_target
predicted = self.classifier.predict(self.testing_data)
return np.mean(predicted == testing_target)
为了收集课程的训练数据,我编写了一些抓取类来抓取一组网页的文本,这些网页的基本url是我硬编码的。
我在这一点上卡住了。我最初的策略是将课程描述页面作为非课程文档来引用。然而,因为我将文档分类为课程,然后基本上是"其他任何东西",我不确定我是应该使用相关内容还是完全不相关的内容,例如一组预定义的维基百科页面用于非课程文档。
我计划使用课程描述的原因是我的最终计划是使用scrapy创建一个网络链接图。然后我可以遍历图,抓取文本,并使用支持向量机找到未知的课程列表页面。我担心的是,如果不这样训练svm,我会得到假阳性。
最好让训练数据尽可能地与测试数据(或您将要预测的数据)相似。在我看来,非课程的数据应该包括稍微相关的文档(例如:期刊文档)和完全不相关的文档(例如:体育新闻)。