我想对每个输入消息进行分类。我使用波斯文字。我已经使用朴素贝叶斯实现了文本分类器。我没有使用Tf-idf
,因为每个功能对我都很重要。但是我做了一些技巧来删除stop-words
和pouncs
,以提高准确性。
我想用SVM实现文本分类器,但是我搜索了很多内容。我发现所有与使用Tf-idf
一起使用管道功能有关。如下所示:
model = Pipeline([(‘vectorizer’, CountVectorizer()),
(‘tfidf’, TfidfTransformer()),
(‘clf’, OneVsRestClassifier(LinearSVC(class_weight=”balanced”)))])
现在,没有Tf-idf的情况下如何使用SVM?
谢谢
答案 0 :(得分:1)
有关SVM的sklearn page,请参见此处,那里有一个使用SVM进行多类分类的部分。首先,您必须将文本转换为特征向量(数字,如果您希望使用SVM)。如果您想使用成袋的单词,则可以使用sklearn的this SO问题和this手册页
您可以使用预先编写的python代码从文本中执行以下操作来创建BOW-介意您,我收集了OP的相关信息-尚不清楚且与SO链式工具不兼容,因此您可能需要处理对其进行一些编码以适合您的实际使用情况。
>>> from sklearn.feature_extraction.text import CountVectorizer
>>> vectorizer = CountVectorizer()
>>> vectorizer
CountVectorizer(analyzer=...'word', binary=False, decode_error=...'strict',
dtype=<... 'numpy.int64'>, encoding=...'utf-8', input=...'content',
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), preprocessor=None, stop_words=None,
strip_accents=None, token_pattern=...'(?u)\\b\\w\\w+\\b',
tokenizer=None, vocabulary=None)
>>> corpus = [
... 'This is the first document.',
... 'This is the second second document.',
... 'And the third one.',
... 'Is this the first document?',
... ]
>>> X = vectorizer.fit_transform(corpus)
>>> X
<4x9 sparse matrix of type '<... 'numpy.int64'>'
with 19 stored elements in Compressed Sparse ... format>
然后,您可能需要将x转换为密集矩阵(取决于sklearn版本) 然后,您可以将x输入到您可以像这样创建的SVM模型中
>>>>from sklearn import svm
>>> X = [[0], [1], [2], [3]]
>>> Y = [0, 1, 2, 3]
>>> clf = svm.SVC(gamma='scale', decision_function_shape='ovo')
>>> clf.fit(X, Y)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovo', degree=3, gamma='scale', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes: 4*3/2 = 6
6
>>> clf.decision_function_shape = "ovr"
>>> dec = clf.decision_function([[1]])
>>> dec.shape[1] # 4 classes