Perkenalan

Melanjutkan postingan saya sebelumnya, pada bagian kedua ini saya akan fokus pada teknik ekstraksi fitur untuk data teks. Ekstraksi fitur adalah teknik yang menyandikan data teks menjadi data numerik sehingga model pembelajaran mesin dapat menafsirkannya.

Teknik yang dibahas:

  • Sekantong kata-kata (BoW);
  • Term Frekuensi Frekuensi Dokumen Terbalik (TF-IDF);
  • n-gram.

Jika Anda belum membaca bagian pertama, saya sangat menyarankan Anda membacanya terlebih dahulu karena saya akan menggunakan kode yang sudah selesai di sana.



Tautan ke buku catatan dengan kode untuk posting ini:



Kantong Kata (BoW)

Sekantong kata adalah salah satu teknik ekstraksi fitur yang paling populer. BoW adalah teknik yang merepresentasikan kata-kata sebagai kemunculannya dalam sebuah dokumen. Hal ini mirip dengan salah satu pengkodean panas di mana setiap kata dalam kosakata merupakan fitur dan ini menunjukkan apakah kata tersebut muncul dalam dokumen atau tidak (1 atau 0).

Setelah penjelasan singkat tentang BoW ini, saya akan menunjukkan cara membuatnya dengan contoh kode. Ada tiga langkah utama untuk membangun BoW:

  1. pilih data teks kita dari mana kita akan membangun kosa kata;
  2. menghasilkan kosa kata;
  3. memvektorisasikan dokumen sesuai dengan kosa kata.

OBS: Saya akan terus menggunakan kode bagian pertama karena data teks kita sudah diproses sebelumnya.

Untuk membuat Bag of Words, kita akan menggunakan CountVectorizer dari Sklearn. Kita dapat melakukan ketiga langkah yang disebutkan di atas di dalam fungsinya.

# Importing CountVectorizer from Sklearn
from sklearn.feature_extraction.text import CountVectorizer

# Getting only the reviews preprocessed with lemmatization
corpus_lem = df['review_pp_lem']

# Instantiate CountVectorizer object
vectorizer = CountVectorizer()

# Generate Bag of Words
bow = vectorizer.fit_transform(corpus_lem)

Kita dapat melihat bahwa ini menghasilkan matriks parse dengan 61.594 baris (jumlah ulasan dalam kumpulan data kami), dan 28.034 kolom, masing-masing mewakili satu kata dalam kosakata yang dibuat dan nilainya 0 atau 1 yang menunjukkan apakah kata tersebut muncul dalam ulasan atau tidak.

Agar lebih mudah memahaminya, mari kita lihat bagaimana kita menafsirkannya.

Cuplikan kode pertama dari gambar di atas, menunjukkan kepada kita bagaimana objek bow mewakili ulasan. Setiap kolom dirujuk ke sebuah kata dalam kosakata dan jika sebuah kata ada dalam ulasan maka akan memiliki nilai 1 jika tidak maka akan memiliki nilai 0. Dalam cuplikan kode kedua saya hanya memilih kata-kata yang ada di salah satu dari dua sampel ulasan. Dalam cuplikan kode ketiga saya mencetak teks dari kedua ulasan untuk memberikan contoh bagaimana sekumpulan kata menyandikan teks ke angka.

Satu hal yang perlu diingat tentang Bag of Words adalah ia tidak peduli dengan urutan kata atau konteksnya. Ini hanya memberitahukan apakah suatu kata ada dalam ulasan atau tidak. Hal lainnya adalah, seperti yang bisa kita lihat dari bentuk objek busur, hal ini menciptakan ketersebaran. Kami beralih dari 1 kolom berisi teks ulasan menjadi 28.034 kolom.

TF-IDF

Term Frekuensi-Invers Dokumen Frekuensi adalah ukuran statistik yang mengevaluasi seberapa relevan suatu kata terhadap suatu dokumen dalam kumpulan dokumen. Kita dapat menganggapnya sebagai bobot pentingnya sebuah kata dalam sebuah dokumen dibandingkan dengan keseluruhan korpus.

Rumus di baliknya adalah:

Untuk lebih memahami fungsinya, katakanlah kita memiliki tiga artikel berita dengan judul berikut:

  1. Apa yang dikatakan para kritikus tentang Guardians of the Galaxy Vol 3;
  2. Enam Rekor yang Bisa Dipecahkan di Oscar 2023;
  3. Bos Marvel mengungkapkan perbedaan Fantastic Four dari versi lama.

Mungkin kata “film”, “aktor/aktris”, “pertunjukan” akan sangat umum di antara ketiga artikel tersebut, sehingga tidak banyak bicara tentang masing-masing artikel, sedangkan “Torch” dan “Invisible” mungkin hanya akan sangat umum. pada artikel terakhir tentang Fantastic Four. Dalam contoh ini, kata “film”, “aktor/aktris”, “pertunjukan” akan memiliki nilai TF-IDF yang kecil, sedangkan “Torch” dan “Invisible” akan memiliki nilai yang tinggi.

Mari kita lihat cara mengimplementasikan TF-IDF.

# Importing TfidfVectorizer from Sklearn
from sklearn.feature_extraction.text import TfidfVectorizer

# Instantiating TfidfVectorizer object
tfidfvec = TfidfVectorizer()

# Generating TF-IDF with the first 100 reviews
tfidf = tfidfvec.fit_transform(corpus_lem[:100])

# Getting the first ten reviews decoded by the TF-IDF
example_tfidf = pd.DataFrame(tfidf[0:10].toarray(), columns=tfidfvec.get_feature_names_out())

example_tfidf

Kita dapat melihat bahwa TF-IDF memberi kita angka float, bukan hanya 0 dan 1 yang dihasilkan oleh Bag of Words. Angka yang lebih tinggi yang dihasilkan oleh TF-IDF menunjukkan bahwa kata tersebut sering muncul dalam satu dokumen dan jarang ditemukan pada dokumen lainnya. Dalam contoh kita, kata “aplikasi” muncul di lebih banyak dokumen daripada kata “audio”.

TF-IDF memiliki permasalahan yang sama dengan Bag of Words, yaitu karena konteks kata tidak diperhatikan, sehingga menimbulkan ketersebaran sesuai dengan ukuran kosakata. Namun, TF-IDF memberikan lebih banyak informasi pada model pembelajaran mesin karena memberikan pentingnya sebuah kata sebagai bobot, bukan hanya menunjukkan apakah sebuah kata muncul dalam dokumen atau tidak.

N-gram

Kita dapat menganggap N-gram sebagai rangkaian kata “n” yang muncul dalam sebuah dokumen. Misalnya, 1 gram (Unigram) adalah rangkaian kata saja (kantong kata adalah Unigram). 2 gram (Bigram) adalah rangkaian dua kata dan seterusnya.

Mari terapkan n-gram ke kalimat sederhana:

“Saya sangat menyukai es krim coklat.”

  • Unigram: [“Saya”, “sungguh”, “cinta”, “cokelat”, “es”, “krim”]
  • Bigram: [“Saya sangat”, “sangat suka”, “suka coklat”, “es coklat”, “es krim”]
  • Trigram: [“Saya sangat suka”, “sangat suka coklat”, “suka es coklat”, “es krim coklat”]

Salah satu keunggulan N-gram dibandingkan kumpulan kata dan TF-IDF adalah konteks kata dipertimbangkan. Namun, ini tidak mempertimbangkan bagian dari kata-kata. Karena N-gram tidak menyandikan kata-kata itu sendiri, ia hanya mengaturnya, kita dapat menggunakannya bersama dengan Bag of Words dan TF-IDF.

Pada fungsi yang kita gunakan sebelumnya (CountVectorizer dan TfidfVectorizer) kita dapat menggunakan parameter bernama ngram_range dan menentukan bagaimana kita ingin menggunakan n-gram dan membuat Bag of N-grams.

# Importing CountVectorizer from Sklearn
from sklearn.feature_extraction.text import CountVectorizer

# Getting only the reviews preprocessed with lemmatization
corpus_lem = df['review_pp_lem']

# Instantiate CountVectorizer object
vectorizer = CountVectorizer(ngram_range=(2, 2)) # Bigram

# Generate Bag of Words
bongram = vectorizer.fit_transform(corpus_lem)

Perhatikan bagaimana n-gram meledak dalam dimensi. Ini menciptakan 328.380 pasang kata. Ada cara untuk mengatasi masalah ini melalui penggunaan parameter max_df, min_dfdan max_featuresdari fungsi CountVectorizer. Kita dapat melihat bahwa representasi kata sama dengan Bag of Words, perbedaannya hanya pada Bag of N-grams fiturnya adalah sepasang kata, bukan satu kata.

Kesimpulan

Kami melihat tiga teknik untuk mengekstrak fitur dari teks dan setelah kami menerapkan salah satunya, kami siap memasukkan data ke dalam model pembelajaran mesin. Dari contoh review kita, kita masih perlu mengerjakan datanya karena kita telah membuat matriks sparce. Salah satu cara untuk mengatasinya adalah dengan menggunakan parameter tersebut dari fungsi CountVectorizer, seperti yang disebutkan sebelumnya.

Tujuan dari postingan ini adalah untuk menunjukkan cara menerapkan teknik ekstraksi fitur ini dan semoga memiliki lebih banyak pemahaman di balik fungsi masing-masing teknik.

Tentang saya

Saya seorang ahli geografi yang saat ini bekerja sebagai ilmuwan data. Oleh karena itu, saya tertarik pada ilmu data dan khususnya ilmu data spasial.

Ikuti saya untuk konten lainnya. Saya akan menulis postingan setiap bulan tentang konsep dan teknik ilmu data, ilmu data spasial dan GIS (Sistem Informasi Geografis).

Referensi