Python 基于sklearn的两类文档分类

Python 基于sklearn的两类文档分类,python,scikit-learn,svm,document-classification,Python,Scikit Learn,Svm,Document Classification,我正在用sklearn和支持向量机对文档进行分类。我希望将文档放在{课程,非课程}类别中,其中课程表示由大学专业课程和非课程任何其他课程组成的网页文本 我构造的这个类与这个类类似: import numpy as np from sklearn.linear_model import SGDClassifier from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import TfidfTransf

我正在用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)
为了收集课程的培训数据,我编写了一些webscraping类,这些类将文本刮取为一组网页,这些网页的基本URL是我硬编码的

我被困在这一点上。我最初的策略是将课程描述页面作为非课程文档引用。但是,由于我将文档分类为课程,然后基本上分类为其他内容,因此我不确定是否应该使用相关内容或完全不相关的内容,例如一组预定义的wikipedia页面,用于非课程文档

我计划使用课程描述的原因是,我的最终计划是使用scrapy创建web链接图。然后,我可以遍历图形,刮取文本,并使用支持向量机查找未知的课程列表页面。我担心的是,如果svm不是这样训练的,我会得到误报


任何洞察都将不胜感激。

最好让培训数据与测试数据或您将尽可能多地预测的数据相似。IMHO非课程的数据应包括轻微相关的文档,例如:期刊文档和完全无关的文档体育新闻。

假设我使用了一组更强大的类别,包括相关文档,如学术期刊和无关文本,如新闻。如果我忽略了对非课程类别使用课程描述页面,而选择仅使用大学页面作为课程类别的课程列表,我是否有足够的策略来对这些文档进行分类,即使我正在遍历和检查给定大学web域中的所有文本以获取课程列表?是的,这似乎是一个不错的策略。您将训练您的模型将大学域中的所有页面分类为课程和非课程