0

テキストを分類するために、私はSVMを使いたいと思います。私はPythonのscikitライブラリを使用していますSVMを使用した分類

私はラベルの1つに、テストデータを分類したい(健康/アダルト) トレーニング&テストデータはテキストファイルです。 私はtxtファイルにテキストを保存していましたが、utf-8 でコード化しています。そのため、スニペットでそれらをデコードしています。 がここにこれは私がエラーで検索すると、私は

File "/Users/guru/python_projects/implement_LDA/lda/apply.py", line 107, in <module> 
    clf.fit(X_train, y) 
    File "/Users/guru/python_projects/implement_LDA/lda/lib/python2.7/site-packages/sklearn/svm/base.py", line 150, in fit 
    X = check_array(X, accept_sparse='csr', dtype=np.float64, order='C') 
    File "/Users/guru/python_projects/implement_LDA/lda/lib/python2.7/site-packages/sklearn/utils/validation.py", line 373, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: setting an array element with a sequence. 

を取得しています誤りである私の未遂コード

String = String.decode('utf-8') 
String2 = String2.decode('utf-8') 
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), 
            token_pattern=r'\b\w+\b', min_df=1) 

X_2 = bigram_vectorizer.fit_transform(String2).toarray() 
X_1 = bigram_vectorizer.fit_transform(String).toarray() 
X_train = np.array([X_1,X_2]) 
print type(X_train) 
y = np.array([1, 2]) 
clf = SVC() 
clf.fit(X_train, y) 

#prepare test data 
print(clf.predict(X)) 

だ、私はいくつかの結果が見つかりましたが、彼らにも助けにはなりませんでした。私はSVMモデルを適用する際にここで論理的に間違っていると思う。誰かが私にこれに関するヒントを与えることができますか?

参考:[1][2]

答えて

2

あなたは、あなたのサンプルを組み合わせ、それらをベクトル化して、分類器を合わせて持っています。このように:

String = String.decode('utf-8') 
String2 = String2.decode('utf-8') 
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), 
            token_pattern=r'\b\w+\b', min_df=1) 

X_train = bigram_vectorizer.fit_transform(np.array([String, String2])) 
print type(X_train) 
y = np.array([1, 2]) 
clf = SVC() 
clf.fit(X_train, y) 

#prepare test data 
print(clf.predict(bigram_vectorizer.transform(np.array([X1, X2, ...])))) 

しかし、2サンプルは非常に少ないデータ量ですので、予測が正確ではない可能性があります。

EDITEDは:

また、あなたは、パイプラインを使用して1つのステップで変換し、分類を組み合わせることができます。

from sklearn.pipeline import Pipeline 

print type(X_train) # Should be a list of texts length 100 in your case 
y_train = ... # Should be also a list of length 100 
clf = Pipeline([ 
    ('transformer', CountVectorizer(...)), 
    ('estimator', SVC()), 
]) 
clf.fit(X_train, y_train) 

X_test = np.array(["sometext"]) # array of test texts length = 1 
print(clf.predict(X_test)) 
+0

さて、どうもありがとうございましたが、私は2つの疑問を持っ 私はこのclf.predictのように(()clf.predictに)あなたのコードの最後の行で唯一の1つのテスト文字列を渡すと(bigram_vectorizer.transform(コーパス)))私は[1,1,1 .... 1,1,1]として出力を得ています。なぜですか? – Guru

+0

これは、ベクタライザがシーケンスを受け入れるためであり、その文字列もシーケンスです。 '... transform(np.array([コーパス]))' – frist

+0

大丈夫私の悪い大変ありがとう:) – Guru

関連する問題