Arti Lebih Dalam: Pemodelan Topik dengan Python

Diterbitkan: 2022-03-11

Komputer dan prosesor yang mendukungnya dibuat untuk bekerja dengan angka. Sebaliknya, bahasa sehari-hari email dan posting media sosial memiliki struktur longgar yang tidak cocok untuk perhitungan.

Di situlah pemrosesan bahasa alami (NLP) masuk. NLP adalah cabang ilmu komputer yang tumpang tindih dengan linguistik dengan menerapkan teknik komputasi (yaitu kecerdasan buatan) untuk menganalisis bahasa dan ucapan alami. Pemodelan topik berfokus pada pemahaman topik tentang teks tertentu. Pemodelan topik memungkinkan pengembang menerapkan fitur bermanfaat seperti mendeteksi berita terkini di media sosial, merekomendasikan pesan yang dipersonalisasi, mendeteksi pengguna palsu, dan mengkarakterisasi aliran informasi.

Bagaimana pengembang dapat membujuk komputer yang berfokus pada perhitungan untuk memahami komunikasi manusia pada tingkat kecanggihan tersebut?

Sekantong Kata-kata

Untuk menjawab pertanyaan tersebut, kita harus mampu mendeskripsikan sebuah teks secara matematis. Kami akan memulai tutorial Python pemodelan topik kami dengan metode paling sederhana: bag of words.

Metode ini merepresentasikan teks sebagai kumpulan kata. Misalnya, kalimat This is an example dapat digambarkan sebagai sekumpulan kata menggunakan frekuensi kemunculan kata-kata tersebut:

 {"an": 1, "example": 1, "is": 1, "this": 1}

Perhatikan bagaimana metode ini mengabaikan urutan kata. Ambil contoh ini:

  • "Saya suka Star Wars tapi saya tidak suka Harry Potter."
  • "Saya suka Harry Potter tapi saya tidak suka Star Wars."

Sentimen ini diwakili oleh kata-kata yang sama, tetapi mereka memiliki arti yang berlawanan. Namun, untuk tujuan menganalisis topik teks, perbedaan ini tidak menjadi masalah. Dalam kedua kasus, kita berbicara tentang selera untuk Harry Potter dan Star Wars, terlepas dari apa selera itu. Dengan demikian, urutan kata tidak penting.

Ketika kita memiliki banyak teks dan berusaha memahami perbedaan di antara mereka, kita memerlukan representasi matematis untuk seluruh korpus kita yang mempertimbangkan setiap teks secara terpisah. Untuk ini kita dapat menggunakan matriks, di mana setiap kolom mewakili kata atau istilah dan setiap baris mewakili teks. Kemungkinan representasi korpus terdiri dari mencatat di setiap sel frekuensi penggunaan kata (kolom) tertentu dalam teks (baris) tertentu.

Dalam contoh kita, corpus terdiri dari dua kalimat (baris matriks kita):

 ["I like Harry Potter", "I like Star Wars"]

Kami mencantumkan kata-kata dalam korpus ini dalam urutan di mana kami menemukannya: I , like , Harry , Potter , Star , Wars . Ini sesuai dengan kolom matriks kami.

Nilai dalam matriks mewakili berapa kali kata tertentu digunakan dalam setiap frasa:

 [[1,1,1,1,0,0], [1,1,0,0,1,1]] 

Gambar menampilkan dua baris teks di sebelah kiri: Saya suka Harry Potter dan saya suka Star Wars. Teks ini kemudian diubah menjadi sekantong kata di tengah, dengan setiap kata diikuti dengan berapa kali kata itu digunakan: "I like Harry Potter" menjadi "{I: 1, like: 1, Harry: 1, Potter" : 1, Bintang: 0, Wars: 0}" dan "Saya suka Star Wars" menjadi "{I: 1, like: 1, Harry: 0, Potter: 0, Star: 1, Wars: 1}" Di sebelah kanan , angka-angka ini kemudian disusun dalam representasi matriks: Yang pertama menjadi baris "1 1 1 1 0 0" dan yang terakhir menjadi "1 1 0 0 1 1."
Teks Diubah Menjadi Representasi Matriks

Perhatikan bahwa ukuran matriks ditentukan dengan mengalikan jumlah teks dengan jumlah kata berbeda yang muncul dalam setidaknya satu teks. Yang terakhir biasanya tidak perlu besar dan dapat dikurangi. Misalnya, matriks mungkin berisi dua kolom untuk kata kerja terkonjugasi, seperti "bermain" dan "dimainkan", terlepas dari fakta bahwa maknanya serupa.

Tapi kolom yang menjelaskan konsep baru bisa hilang. Misalnya, "klasik" dan "musik" masing-masing memiliki arti tersendiri tetapi ketika digabungkan—"musik klasik"—mereka memiliki arti lain.

Karena masalah ini, teks perlu diproses terlebih dahulu untuk mendapatkan hasil yang baik.

Model Pemrosesan Awal dan Pengelompokan Topik

Untuk hasil terbaik, perlu menggunakan beberapa teknik prapemrosesan. Berikut adalah beberapa yang paling sering digunakan:

  1. Huruf kecil. Jadikan semua kata menjadi huruf kecil. Jadikan semua kata menjadi huruf kecil. Arti sebuah kata tidak berubah terlepas dari posisinya dalam kalimat.
  2. n -gram. Anggap semua kelompok n kata dalam satu baris sebagai suku baru, yang disebut n-gram . Dengan cara ini, kasus seperti "rumah putih" akan diperhitungkan dan ditambahkan ke daftar kosakata.
  3. Berasal. Identifikasi awalan dan akhiran kata untuk mengisolasinya dari akarnya. Dengan cara ini, kata-kata seperti “bermain”, “dimainkan”, atau “pemain” diwakili oleh kata “bermain”. Stemming dapat berguna untuk mengurangi jumlah kata dalam daftar kosa kata sambil mempertahankan artinya , tetapi ini sangat memperlambat pemrosesan awal karena harus diterapkan pada setiap kata dalam korpus.
  4. Hentikan kata-kata. Jangan memperhitungkan kelompok kata yang kurang makna atau kegunaannya. Ini termasuk artikel dan preposisi tetapi mungkin juga termasuk kata-kata yang tidak berguna untuk studi kasus khusus kami, seperti kata kerja umum tertentu.
  5. Frekuensi term–frekuensi dokumen terbalik (tf–idf). Gunakan koefisien tf–idf daripada mencatat frekuensi setiap kata dalam setiap sel matriks. Ini terdiri dari dua angka, dikalikan:
    • tf—frekuensi istilah atau kata tertentu dalam teks, dan
    • idf—logaritma dari jumlah total dokumen dibagi dengan jumlah dokumen yang mengandung istilah tertentu.

    tf–idf adalah ukuran seberapa sering sebuah kata digunakan dalam korpus. Untuk dapat membagi kata ke dalam kelompok, penting untuk memahami tidak hanya kata mana yang muncul di setiap teks, tetapi juga kata mana yang sering muncul dalam satu teks tetapi tidak sama sekali di teks lain.

Gambar berikut menunjukkan beberapa contoh sederhana dari teknik pra-pemrosesan ini di mana teks asli korpus dimodifikasi untuk menghasilkan daftar kata yang relevan dan dapat dikelola.

Teknik "huruf kecil" mengubah kalimat "Gedung Putih." ke dalam daftar kata: "the", "white", "house". Teknik "n-gram" mengubahnya menjadi daftar yang lebih panjang: "the", "white", "house", "the white", "white house". Teknik "stemming" mengubah kalimat "Pemain sepak bola memainkan permainan yang bagus." ke dalam daftar ini: "the", "football", "play", "a", "good", "game". Teknik "stop words" mengubahnya menjadi daftar yang lebih pendek: "football", "play", "good", "game".
Contoh Teknik Text Preprocessing

Sekarang kita akan mendemonstrasikan bagaimana menerapkan beberapa teknik ini dengan Python. Setelah korpus kita terwakili secara matematis, kita perlu mengidentifikasi topik yang sedang dibahas dengan menerapkan algoritme pembelajaran mesin tanpa pengawasan. Dalam hal ini, "tanpa pengawasan" berarti bahwa algoritme tidak memiliki label topik yang telah ditentukan sebelumnya, seperti "fiksi ilmiah", untuk diterapkan pada keluarannya.

Untuk mengelompokkan korpus kita, kita dapat memilih dari beberapa algoritma, termasuk faktorisasi matriks non-negatif (NMF), analisis komponen utama sparse (PCA jarang), dan alokasi dirichlet laten (LDA). Kami akan fokus pada LDA karena banyak digunakan oleh komunitas ilmiah karena hasil yang baik di media sosial, ilmu kedokteran, ilmu politik, dan rekayasa perangkat lunak.

LDA adalah model untuk dekomposisi topik tanpa pengawasan: Ini mengelompokkan teks berdasarkan kata-kata yang dikandungnya dan kemungkinan kata yang termasuk dalam topik tertentu. Algoritma LDA mengeluarkan distribusi kata topik. Dengan informasi ini, kita dapat menentukan topik utama berdasarkan kata-kata yang kemungkinan besar terkait dengannya. Setelah kami mengidentifikasi topik utama dan kata-kata yang terkait, kami dapat mengetahui topik atau topik mana yang berlaku untuk setiap teks.

Pertimbangkan korpus berikut yang terdiri dari lima kalimat pendek (semua diambil dari berita utama New York Times ):

 corpus = [ "Rafael Nadal Joins Roger Federer in Missing US Open", "Rafael Nadal Is Out of the Australian Open", "Biden Announces Virus Measures", "Biden's Virus Plans Meet Reality", "Where Biden's Virus Plan Stands"]

Algoritme harus secara jelas mengidentifikasi satu topik terkait politik dan virus corona, dan topik kedua terkait Nadal dan tenis.

Menerapkan Strategi dengan Python

Untuk mendeteksi topik, kita harus mengimpor perpustakaan yang diperlukan. Python memiliki beberapa pustaka yang berguna untuk NLP dan pembelajaran mesin, termasuk NLTK dan Scikit-learn (sklearn).

 from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.decomposition import LatentDirichletAllocation as LDA from nltk.corpus import stopwords

Menggunakan CountVectorizer() , kita menghasilkan matriks yang menunjukkan frekuensi kata dari setiap teks menggunakan CountVectorizer() . Perhatikan bahwa CountVectorizer memungkinkan untuk prapemrosesan jika Anda menyertakan parameter seperti stop_words untuk menyertakan kata-kata berhenti, ngram_range untuk menyertakan n -gram, atau lowercase=True untuk mengonversi semua karakter menjadi huruf kecil.

 count_vect = CountVectorizer(stop_words=stopwords.words('english'), lowercase=True) x_counts = count_vect.fit_transform(corpus) x_counts.todense() matrix([[0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1]], dtype=int64)

Untuk mendefinisikan kosakata corpus kita, kita cukup menggunakan atribut .get_feature_names() :

 count_vect.get_feature_names() ['announces', 'australian', 'biden', 'federer', 'joins', 'measures', 'meet', 'missing', 'nadal', 'open', 'plan', 'plans', 'rafael', 'reality', 'roger', 'stands', 'virus']

Kemudian, kami melakukan perhitungan tf–idf dengan fungsi sklearn:

 tfidf_transformer = TfidfTransformer() x_tfidf = tfidf_transformer.fit_transform(x_counts)

Untuk melakukan dekomposisi LDA, kita harus menentukan jumlah topik. Dalam kasus sederhana ini, kita tahu ada dua topik atau "dimensi". Tetapi dalam kasus umum, ini adalah hyperparameter yang memerlukan beberapa penyetelan, yang dapat dilakukan dengan menggunakan algoritme seperti pencarian acak atau pencarian grid:

 dimension = 2 lda = LDA(n_components = dimension) lda_array = lda.fit_transform(x_tfidf) lda_array array([[0.8516198 , 0.1483802 ], [0.82359501, 0.17640499], [0.18072751, 0.81927249], [0.1695452 , 0.8304548 ], [0.18072805, 0.81927195]])

LDA adalah metode probabilistik. Di sini kita dapat melihat probabilitas masing-masing dari lima headline milik masing-masing dari dua topik. Kita dapat melihat bahwa dua teks pertama memiliki kemungkinan lebih tinggi untuk menjadi bagian dari topik pertama dan tiga teks berikutnya untuk topik kedua, seperti yang diharapkan.

Akhirnya, jika kita ingin memahami tentang apa kedua topik ini, kita dapat melihat kata-kata terpenting di setiap topik:

 components = [lda.components_[i] for i in range(len(lda.components_))] features = count_vect.get_feature_names() important_words = [sorted(features, key = lambda x: components[j][features.index(x)], reverse = True)[:3] for j in range(len(components))] important_words [['open', 'nadal', 'rafael'], ['virus', 'biden', 'measures']]

Seperti yang diharapkan, LDA dengan benar menetapkan kata-kata yang terkait dengan turnamen tenis dan Nadal ke topik pertama dan kata-kata yang terkait dengan Biden dan virus ke topik kedua.

Analisis Skala Besar dan Kasus Penggunaan di Dunia Nyata

Analisis pemodelan topik skala besar dapat dilihat dalam makalah ini; Saya mempelajari topik berita utama selama pemilihan presiden AS 2016 dan mengamati topik beberapa media massa—seperti New York Times dan Fox News—termasuk dalam liputan mereka, seperti korupsi dan imigrasi. Dalam tulisan ini, saya juga menganalisis korelasi dan sebab-akibat antara konten media massa dan hasil pemilu.

Pemodelan topik juga banyak digunakan di luar akademisi untuk menemukan pola topikal tersembunyi yang ada dalam kumpulan besar teks. Misalnya, ini dapat digunakan dalam sistem rekomendasi atau untuk menentukan apa yang dibicarakan pelanggan/pengguna dalam survei, dalam formulir umpan balik, atau di media sosial.

Blog Toptal Engineering mengucapkan terima kasih kepada Juan Manuel Ortiz de Zarate karena telah meninjau contoh kode yang disajikan dalam artikel ini.

Bacaan yang Direkomendasikan tentang Pemodelan Topik

Peningkatan Pemodelan Topik di Twitter
Albanese, Federico dan Esteban Feuerstein. “Peningkatan Pemodelan Topik di Twitter Melalui Pengumpulan Komunitas.” (20 Desember 2021): arXiv:2201.00690 [cs.IR]

Menganalisis Twitter untuk Kesehatan Masyarakat
Paul, Michael dan Mark Dredze. “Anda Adalah Apa yang Anda Tweet: Menganalisis Twitter untuk Kesehatan Masyarakat.” 3 Agustus 2021.

Klasifikasi Orientasi Politik di Twitter
Cohen, Raviv dan Derek Ruths. “Mengklasifikasikan Orientasi Politik di Twitter: Tidak Mudah!” 3 Agustus 2021.

Menggunakan Model Topik Relasional untuk Menangkap Kopling
Gethers, Malcolm dan Denis Poshyvanyk. “Menggunakan Model Topik Relasional untuk Menangkap Kopling Antar Kelas dalam Sistem Perangkat Lunak Berorientasi Objek.” 25 Oktober 2010.