Saya punya matriks istilah-dokumen , dan sekarang saya ingin mengekstraksi kata kunci untuk setiap dokumen dengan metode pembelajaran yang dilindungi (SVM, Naif Bayes, ...). Dalam model ini, saya sudah menggunakan Tf-idf, tag Pos, ...
Tapi sekarang aku bertanya-tanya tentang selanjutnya. Saya punya matriks dengan persamaan cosinus antara istilah-istilah.
Apakah ada kemungkinan untuk menggunakan kesamaan ini sebagai fitur untuk model saya? Ide saya adalah istilah dalam dokumen d , untuk menggunakan rata-rata persamaan cosinus dari semua istilah dalam dokumen d dengan istilah i . Apakah ini berguna?
Jawaban:
Saya tidak tahu bagaimana mungkin melakukan ekstraksi kata kunci dengan pembelajaran terawasi, tetapi saya tahu bagaimana melakukannya dengan pembelajaran tanpa pengawasan.
Ada beberapa metode untuk melakukan ini, jadi inilah mereka:
Hierarkis
Anda dapat menerapkan metode pengelompokan hierarkis apa pun pada istilah kesamaan matriks (dengan fungsi kesamaan apa pun, bukan hanya cosinus)
Di scikit-belajar Anda akan melakukan sesuatu seperti ini:
Sumber: [1]
Tetapi karena ini adalah pengelompokan aglomeratif, ini mahal secara komputasional dan perlu waktu untuk dihitung.
K-Means
Kemungkinan lain adalah melakukan k-means pada baris-baris matriks dokumen-istilah, dan kemudian menemukan istilah yang paling umum untuk setiap centroid
Sebagai contoh, dalam scikit belajar ini adalah cara melakukannya:
Sumber: [2]
Tetapi k-means bergantung pada jarak Euclidean, yang buruk untuk data dimensi tinggi yang jarang. Ada teknik lain yang bekerja lebih baik untuk teks dan menggunakan kesamaan cosinus
Cosine K-Means and Scatter / Gather
Dimungkinkan untuk menggunakan Cosine dengan K-means (lihat misalnya [3] ): hitung centroid sebagai rata-rata semua dokumen dalam setiap klaster, dan kemudian gunakan cosinus untuk menghitung jarak ke centroid terdekat.
Pada akhirnya, Anda dapat mengekstraksi kata kunci dengan cara yang sama seperti untuk k-means yang biasa.
Menghitung rata-rata centroid sebagai rata-rata dari semua dokumen dalam cluster tidak selalu baik. Pendekatan lain disarankan dalam algoritma Scatter / Gather [4] : centroid dari sebuah cluster adalah gabungan dari semua dokumen dalam cluster ini.
Untuk pendekatan ini Anda hanya perlu mengambil istilah yang paling sering untuk setiap cluster centroid.
Tidak ada implementasi algoritma ini di scikit belajar, tetapi Anda dapat dengan mudah menerapkannya sendiri dengan memperluas
KMeans
.Perhatikan bahwa dalam kedua kasus, centroid menjadi cukup padat: lebih padat daripada dokumen lainnya di setiap cluster, jadi Anda mungkin ingin memotong istilah dalam centroid, yaitu menghapus yang "tidak penting". (lihat [8]).
Clustering Spektral
Cara lain adalah dengan menerapkan pengelompokan spektral. Anda harus menyediakan matriks kesamaan, yang sudah Anda miliki, dan ia akan menemukan cluster di atasnya.
Itu diterapkan di
SpectralClustering
kelas, lihat contoh di [5] . Perhatikan bahwa karena Anda sudah memiliki matriks pra-komputasi, Anda perlu menggunakanaffinity='precumputed'
atribut saat menginisialisasi.Spectral clustering terkait dengan Kernel KMeans: ada kertas (lihat [7]) yang menunjukkan bahwa mereka adalah hal yang sama. Baru-baru ini saya menemukan implementasi KMeans Kernel yang mungkin berguna: https://gist.github.com/mblondel/6230787
Factorisasi Matriks Non-Negatif
Akhirnya, Anda dapat mengelompokkan term-document matrix Anda dengan beberapa teknik dekomposisi dari Linear Algebra, seperti SVD (ini akan disebut "Latent Semantic Analysis") atau Factorization Matriks Non-Negatif. Yang terakhir dapat dilihat sebagai pengelompokan, dan dapat mengelompokkan kedua baris dan kolom matriks pada saat yang sama.
Misalnya, Anda dapat mengekstrak kata kunci dengan melakukan
Sumber kode: [6]
Meskipun di sini contohnya adalah dalam python scikit-belajar, saya pikir itu seharusnya tidak menjadi masalah besar untuk menemukan beberapa contoh untuk R
Sumber
sumber