Классификация документов по двум категориям с использованием sklearn

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

Мы будем очень признательны за любое понимание.


person jonnywalkerr    schedule 26.08.2015    source источник


Ответы (1)


Лучше всего, чтобы обучающие данные максимально напоминали данные тестирования (или данные, на основе которых вы будете делать прогнозы). ИМХО, данные для некурса должны состоять как из слегка связанных документов (например, журнальных документов, так и из совершенно не связанных документов (спортивные новости).

person shanmuga    schedule 26.08.2015
comment
Допустим, я должен был использовать более надежный набор категорий, включая связанные документы, такие как академические журналы, и несвязанный текст, например новости. Если бы я проигнорировал использование страниц описания курса для категории, не относящейся к курсу, вместо того, чтобы просто использовать страницы университета для списков курсов для категории курса, была бы у меня достаточная стратегия для классификации этих документов, даже если я просматриваю и проверяю весь текст в данный веб-домен университета для списков курсов? - person jonnywalkerr; 26.08.2015
comment
Да, это кажется хорошей стратегией. Вы научите свою модель классифицировать все страницы в университетском домене как курсовые и некурсовые. - person shanmuga; 26.08.2015