0

TF-IDF 및 SVM을 사용하여 문서를 기만적으로 또는 사실적으로 분류하려고합니다. 나는 이것이 이전에 행해졌다는 것을 알고 있지만, 나는 그것을 올바르게 구현하고 있다고 확신하지 못한다. 나는 텍스트의 코퍼스를 가지고 같은TfidfVectorizer 및 Scikit-learn을 사용하여 SVM을 사용한 TF-IDF의 정확도가 낮음

vectorizer = TfidfVectorizer(min_df=1, binary=0, use_idf=1, smooth_idf=0, sublinear_tf=1) 
tf_idf_model = vectorizer.fit_transform(corpus) 
features = tf_idf_model.toarray() 

로 그리고 분류에 대한 TF-IDF 건물입니다 :

seed = random.random() 
random.seed(seed) 
random.shuffle(features) 
random.seed(seed) 
random.shuffle(labels) 

features_folds = np.array_split(features, folds) 
labels_folds = np.array_split(labels, folds) 

for C_power in C_powers: 
    scores = [] 
    start_time = time.time() 
    svc = svm.SVC(C=2**C_power, kernel='linear') 

    for k in range(folds):  
     features_train = list(features_folds) 
     features_test = features_train.pop(k) 
     features_train = np.concatenate(features_train) 
     labels_train = list(labels_folds) 
     labels_test = labels_train.pop(k) 
     labels_train = np.concatenate(labels_train) 
     scores.append(svc.fit(features_train, labels_train).score(features_test, labels_test)) 

    print(scores) 

하지만 50 % ~의 정확도를 수신하고 있습니다. 내 코퍼스는 1600 개의 텍스트입니다.

+0

정확도가 아닌 혼동 행렬 또는 여러 통계를 게시 할 수 있습니다. –

답변

0

SVM이 대형 스파 스 매트릭스를 잘 다루지 않기 때문에 TF-IDF 매트릭스를 SVM으로 보내기 전에 줄이는 것이 좋습니다. TF-IDF 행렬의 차원을 줄이기 위해 TruncatedSVD를 사용할 것을 제안합니다. 물론

vectorizer = TfidfVectorizer(min_df=1, binary=0, use_idf=1, smooth_idf=0, sublinear_tf=1) 
svd = TruncatedSVD(n_components=20) 

pipeline = Pipeline([ 
    ('tfidf', vectorizer), 
    ('svd', svd)]) 

features = pipeline.fit_transform(corpus) 

당신은 유지하는 구성 요소의 최적의 수를 찾기 위해 조정 n_components해야합니다.

+0

오류가 발생했습니다. TypeError : 언 바운드 메소드 fit_transform()이 첫 번째 인수로 파이프 라인 인스턴스와 함께 호출되어야합니다 (대신에 목록 인스턴스가 있음). – Knokkelgeddon

+0

@Knokkelgeddon, 메소드로 'fit_transform'을 호출 했습니까? '파이프 라인'? 이 오류가 발생한 스크립트 줄을 보여줄 수 있습니까? –