Saya mencoba menggunakan BoW sebelum ML pada dataset berbasis teks saya. Namun, saya tidak ingin set pelatihan saya memengaruhi set pengujian saya (yaitu, kebocoran data). Saya ingin menggunakan BoW di set kereta sebelum set tes. Tapi, kemudian set pengujian saya memiliki fitur yang berbeda (yaitu, kata-kata) dari set kereta saya sehingga matriksnya tidak berukuran sama. Saya mencoba menyimpan kolom di set pengujian yang juga muncul di set kereta tetapi 1) Kode saya tidak benar dan 2) Saya tidak berpikir ini adalah prosedur yang paling efisien. Saya pikir saya juga perlu kode untuk menambahkan kolom pengisi? Inilah yang saya miliki:

from sklearn.feature_extraction.text import CountVectorizer

def bow (tokens, data):
    tokens = tokens.apply(nltk.word_tokenize)
    cvec = CountVectorizer(min_df = .01, max_df = .99, ngram_range=(1,2), tokenizer=lambda doc:doc, lowercase=False)
    cvec.fit(tokens)
    cvec_counts = cvec.transform(tokens)
    cvec_counts_bow = cvec_counts.toarray()
    vocab = cvec.get_feature_names()
    bow_model = pd.DataFrame(cvec_counts_bow, columns=vocab)
    return bow_model

X_train = bow(train['text'], train)
X_test = bow(test['text'], test)

vocab = list(X_train.columns)
X_test = test.filter.columns([w for w in X_test if w in vocab])

0
Kim S. 12 Mei 2021, 16:14

1 menjawab

Jawaban Terbaik

Anda akan secara normal memasukkan CountVectorizer hanya pada set kereta dan menggunakan Vectorizer yang sama pada set pengujian, mis:

from sklearn.feature_extraction.text import CountVectorizer

def bow (tokens, data, cvec=None):
    tokens = tokens.apply(nltk.word_tokenize)
    if cvec==None:
        cvec = CountVectorizer(min_df = .01, max_df = .99, ngram_range=(1,2), tokenizer=lambda doc:doc, lowercase=False)
        cvec.fit(tokens)
    cvec_counts = cvec.transform(tokens)
    cvec_counts_bow = cvec_counts.toarray()
    vocab = cvec.get_feature_names()
    bow_model = pd.DataFrame(cvec_counts_bow, columns=vocab)
    return bow_model, cvec

X_train, cvec = bow(train['text'], train)
X_test, cvec = bow(test['text'], test, cvec=cvec)

vocab = list(X_train.columns)
X_test = test.filter.columns([w for w in X_test if w in vocab])

Ini tentu saja akan mengabaikan kata-kata yang tidak terlihat di rangkaian kereta, tetapi ini seharusnya tidak menjadi masalah karena kereta dan tes seharusnya memiliki distribusi yang kurang lebih sama dan oleh karena itu kata-kata yang tidak dikenal seharusnya menjadi langka .

Catatan: Kode tidak diuji

1
chefhose 13 Mei 2021, 14:59