Klasifikasi dokumen: tf-idf sebelum atau setelah pemfilteran fitur?

8

Saya memiliki proyek klasifikasi dokumen di mana saya mendapatkan konten situs dan kemudian menugaskan salah satu dari banyak label ke situs web sesuai dengan konten.

Saya menemukan bahwa tf-idf bisa sangat berguna untuk ini. Namun, saya tidak yakin kapan tepatnya menggunakannya.

Dengan asumsi sebuah situs web yang berkaitan dengan topik tertentu menyebutkannya berulang kali, inilah proses saya saat ini:

  1. Ambil konten situs, parsing untuk teks biasa
  2. Menormalkan dan membendung konten
  3. Tokenisasi ke dalam unigram (mungkin juga bigrams)
  4. Ambil hitungan setiap unigram untuk dokumen yang diberikan, saring kata-kata dengan panjang rendah dan kemunculan rendah
  5. Latih classifier seperti NaiveBayes pada perangkat yang dihasilkan

Pertanyaan saya adalah sebagai berikut: Di mana tf-idf cocok di sini ? Sebelum menormalkan / membendung? Setelah normalisasi tetapi sebelum tokenizing? Setelah tokenizing?

Wawasan apa pun akan sangat dihargai.


Edit:

Setelah diperiksa lebih dekat, saya pikir saya mungkin mengalami kesalahpahaman tentang bagaimana TF-IDF beroperasi. Pada langkah 4 di atas yang saya jelaskan, apakah saya harus memasukkan seluruh data saya ke TF-IDF sekaligus? Misalnya, jika data saya adalah sebagai berikut:

[({tokenized_content_site1}, category_string_site1), 
 ({tokenized_content_site2}, category_string_site2), 
...
 ({tokenized_content_siten}, category_string_siten)}]

Di sini, struktur terluar adalah daftar, berisi tupel, berisi kamus (atau hashmap) dan string.

Apakah saya harus memasukkan keseluruhan data ke dalam kalkulator TF-IDF sekaligus untuk mencapai efek yang diinginkan? Secara khusus, saya telah melihat TfidfVectorizer scikit-belajar untuk melakukan ini, tapi saya agak tidak yakin untuk penggunaannya sebagai contoh sangat jarang.

pengguna991710
sumber

Jawaban:

8

Seperti yang sudah Anda jelaskan, Langkah 4 adalah tempat Anda ingin menggunakan TF-IDF. Pada dasarnya, TD-IDF akan menghitung setiap istilah dalam setiap dokumen, dan menetapkan skor mengingat frekuensi relatif di seluruh kumpulan dokumen.

Namun, ada satu langkah besar yang hilang dari proses Anda: menjelaskan satu set pelatihan. Sebelum Anda melatih pengklasifikasi, Anda perlu membuat anotasi sampel data Anda secara manual dengan label yang ingin Anda terapkan secara otomatis menggunakan pengklasifikasi.

Untuk mempermudah semua ini, Anda mungkin ingin mempertimbangkan untuk menggunakan Stanford Classifier . Ini akan melakukan ekstraksi fitur dan membangun model classifier (mendukung beberapa algoritma pembelajaran mesin yang berbeda), tetapi Anda masih perlu membuat anotasi data pelatihan dengan tangan.

Charlie Greenbacker
sumber
Sebelum melatih classifier, saya memformat data dalam tupel ({tokenized content}, category). Karena saya memiliki pelatihan yang mengatur situs web dalam database dan sudah dikategorikan, itu bukan masalah. Label yang dapat diterapkan oleh pengklasifikasi hanya label yang telah dilihat dari set pelatihan beranotasi, benar?
user991710
Re: "Label yang dapat diterapkan oleh pengklasifikasi hanya label yang telah dilihat dari set pelatihan beranotasi, benar?" Benar. Dalam pembelajaran yang diawasi, penggolong tidak akan dapat membuat kategori baru / tidak terlihat. Jika Anda ingin melakukan itu, Anda harus melihat sesuatu seperti pengelompokan atau pemodelan topik.
Charlie Greenbacker
Terima kasih banyak untuk informasinya! Saat Anda menjawab pertanyaan saya juga, saya akan menerima ini sebagai jawabannya.
user991710
Permintaan maaf saya karena mengembalikan ini setelah menerima jawaban di atas, tetapi saya rasa saya akan memiliki peluang lebih baik untuk mendapatkan jawaban atas pembaruan saya jika saya bertanya langsung kepada Anda. Jadi untuk menghindari komentar panjang, saya akan sangat menghargainya jika Anda dapat melihat edit saya di posting asli.
user991710
1
RE: "apakah saya harus memasukkan keseluruhan data saya ke TF-IDF sekaligus?" Ya, begitulah cara kerjanya. RE: "Saya sudah mencari di scikit-learn TfidfVectorizer untuk melakukan ini, tapi saya agak tidak yakin untuk penggunaannya karena contohnya sangat jarang." Berikut ini contoh yang saya tulis: github.com/charlieg/… - mungkin lebih baik jika Anda menggunakan kumpulan dokumen sebagai input, daripada beberapa dict + string tuple yang Anda buat.
Charlie Greenbacker