Я возился со 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 не будет обучен таким образом.
Мы будем очень признательны за любое понимание.