0

Ich versuche Dokumente mit TF-IDF und SVM als trügerisch oder wahrheitsgemäß zu klassifizieren. Ich weiß, dass dies schon einmal gemacht wurde, aber ich bin mir nicht ganz sicher, ob ich es richtig umgesetzt habe. Ich habe einen Korpus von Texten und am Aufbau der TF-IDF wieNiedrige Genauigkeit für TF-IDF mit SVM mit TfidfVectorizer und Scikit-learn

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() 

Und für die Klassifizierung:

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) 

Aber ich bin eine Genauigkeit von ~ 50% erhalten. Mein Korpus ist 1600 Texte.

+0

Sie könnten eine Verwirrungsmatrix oder mehr Metriken als nur die Genauigkeit veröffentlichen. –

Antwort

0

Ich denke, Sie möchten vielleicht die TF-IDF-Matrix reduzieren, bevor Sie sie in SVM einspeisen, weil SVM nicht gut im Umgang mit Large Sparse Matrix ist. Ich würde vorschlagen, TruncatedSVD zu verwenden, um die Dimensionalität der TF-IDF-Matrix zu reduzieren.

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) 

Natürlich müssen Sie stimmen zu der n_components die optimale Anzahl von Komponenten zu finden, zu halten.

+0

Ich kann es nicht zum Laufen bringen, Fehler 'TypeError: ungebundene Methode fit_transform() muss mit Pipeline-Instanz als erstes Argument aufgerufen werden (hat List-Instanz stattdessen)' – Knokkelgeddon

+0

@Knokkelgeddon, hast du 'fit_transform' als eine Methode von aufgerufen 'Pipeline'? Können Sie mir die Zeile Ihres Skripts anzeigen, in der dieser Fehler aufgetreten ist? –