Jawaban:
Ada sejumlah cara berbeda untuk melakukan ini tergantung pada seberapa banyak informasi semantik yang ingin Anda simpan dan seberapa mudah dokumen Anda diberi tokenize (dokumen html mungkin akan cukup sulit untuk tokenize, tetapi Anda mungkin dapat melakukan sesuatu dengan tag dan konteks .)
Beberapa dari mereka telah disebutkan oleh teman, dan vektor paragraf oleh user1133029 adalah yang benar-benar solid, tapi saya baru saja berpikir saya akan masuk ke lebih dalam tentang plus dan minus dari pendekatan yang berbeda.
edit distance
, ini biasanya hanya digunakan pada level token individu (kata-kata, bigrams, dll ...). Secara umum saya tidak akan merekomendasikan metrik ini karena tidak hanya membuang informasi semantik, tetapi juga cenderung memperlakukan perubahan kata yang sangat berbeda dengan sangat mirip, tetapi ini adalah metrik yang sangat umum untuk hal semacam initopic modeling
. LSA telah keluar dari mode baru-baru ini, dan dalam pengalaman saya, itu bukan pendekatan pemodelan topik terkuat, tetapi relatif mudah untuk diimplementasikan dan memiliki beberapa implementasi open sourcetopic modeling
, tetapi berbeda dari LSA
yang sebenarnya mempelajari representasi internal yang cenderung lebih halus dan intuitif. Secara umum, hasil yang Anda peroleh LDA
lebih baik untuk memodelkan kemiripan dokumen daripada LSA
, tetapi tidak cukup baik untuk belajar bagaimana membedakan secara kuat antara topik.LDA
, dengan satu-satunya downside adalah bahwa dibutuhkan sedikit lebih lama untuk melatih dan implementasi open-source sedikit lebih sulit didapatCount Vectorizers
dan TF-IDF
. Word2vec sangat bagus karena memiliki sejumlah implementasi open source. Setelah Anda memiliki vektor, metrik kesamaan lainnya (seperti jarak kosinus) dapat digunakan di atasnya dengan kemanjuran yang jauh lebih besar.paragraph vectors
, ini adalah yang terbaru dan terbaik dalam serangkaian makalah oleh Google, melihat ke representasi vektor dokumen yang padat. The gensim
perpustakaan python memiliki implementasi word2vec
yang cukup sederhana bahwa hal itu dapat cukup cukup dimanfaatkan untuk membangun doc2vec
, tetapi pastikan untuk menjaga lisensi diingat jika Anda ingin pergi ke rute iniSemoga itu bisa membantu, beri tahu saya jika Anda memiliki pertanyaan.
Ada sejumlah langkah jarak semantik, masing-masing dengan pro dan kontra. Berikut ini beberapa di antaranya:
Mulailah dengan pendekatan yang paling sederhana dan kemudian bergerak lebih jauh berdasarkan masalah untuk kasus spesifik Anda.
Secara empiris saya telah menemukan LSA jauh lebih unggul daripada LDA setiap kali dan pada setiap dataset saya telah mencobanya. Saya telah berbicara dengan orang lain yang mengatakan hal yang sama. Ini juga telah digunakan untuk memenangkan sejumlah kompetisi SemEval untuk mengukur kesamaan semantik antara dokumen, sering kali dalam kombinasi dengan ukuran berbasis wordnet, jadi saya tidak akan mengatakan itu keluar dari mode, atau pasti lebih rendah daripada LDA, yang lebih baik untuk pemodelan topik dan bukan kesamaan semantik dalam pengalaman saya, bertentangan dengan apa yang beberapa responden nyatakan.
Jika Anda menggunakan gensim (pustaka python), ia memiliki LSA, LDA dan word2vec, sehingga Anda dapat dengan mudah membandingkan 3. doc2vec adalah ide yang keren, tetapi tidak skala dengan sangat baik dan Anda mungkin harus mengimplementasikannya sendiri seperti saya. tidak mengetahui adanya implementasi open source. Itu tidak skala dengan baik untuk setiap dokumen, model baru dan terpisah harus dibangun menggunakan SGD, algoritma pembelajaran mesin lambat. Tapi itu mungkin akan memberi Anda hasil yang paling akurat. LSA dan LDA juga tidak skala dengan baik (word2vec tidak), skala LDA lebih buruk secara umum. Namun implementasi Gensim sangat cepat, karena menggunakan SVD iteratif.
Satu catatan lain, jika Anda menggunakan word2vec, Anda masih harus menentukan cara untuk menyusun vektor dari dokumen, karena memberikan Anda vektor yang berbeda per kata. Cara paling sederhana untuk melakukan ini adalah dengan menormalkan setiap vektor dan mengambil rata-rata semua vektor kata dalam dokumen, atau mengambil rata-rata tertimbang dengan pembobotan idf setiap kata. Jadi tidak sesederhana 'use word2vec', Anda perlu melakukan sesuatu lebih jauh untuk menghitung kesamaan dokumen.
Saya pribadi akan pergi dengan LSA, karena saya telah melihatnya bekerja dengan baik secara empiris, dan perpustakaan gensim berskala sangat baik. Namun, tidak ada makan siang gratis, jadi sebaiknya coba setiap metode dan lihat mana yang lebih baik untuk data Anda.
Keadaan tampaknya "vektor paragraf" diperkenalkan dalam makalah baru-baru ini: http://cs.stanford.edu/~quocle/paragraph_vector.pdf . Jarak cosine / Euclidean antara vektor paragraf kemungkinan akan bekerja lebih baik daripada pendekatan lainnya. Ini mungkin belum layak karena kurangnya implementasi open source.
Hal terbaik berikutnya adalah jarak cosinus antara vektor LSA atau jarak cosinus antara vektor BOW mentah. Terkadang lebih baik untuk memilih skema pembobotan yang berbeda, seperti TF-IDF.
Sangat berguna untuk memiliki di dalam Anda alat alat keluarga algoritma hashing sensitif lokalitas . Keluarga ini tidak semantik sama sekali. Sebenarnya menganggap teks sebagai urutan bit. Saya merasa berguna dalam set data kotor ketika teks yang sama muncul berkali-kali dengan sedikit perbedaan.
Anda dapat menggunakan ssdeep (yang didasarkan pada hash Nilsimsa ) untuk mengidentifikasi dokumen tersebut. Ssdeep awalnya direncanakan untuk domain spam. Spammer sering melakukan perubahan kecil pada pesan (tambahkan spasi) untuk mencegah deteksi dengan tanda tangan yang tepat (misalnya, md5 ).
Karena banyak versi dokumen yang hampir sama dalam kumpulan data yang sama akan menyebabkan kerusakan pada metode statistik yang akan diterapkan di dalamnya, melakukan pembersihan seperti itu bisa sangat bermanfaat.