Apa sajakah cara standar untuk menghitung jarak antar dokumen?

34

Ketika saya mengatakan "dokumen", saya memikirkan halaman web seperti artikel Wikipedia dan cerita berita. Saya lebih suka jawaban yang memberikan metrik jarak vanila atau metrik jarak semantik canggih, dengan preferensi yang lebih kuat untuk yang terakhir.

Mat
sumber

Jawaban:

48

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.

  • Cosine Distance - Mencoba benar, jarak cosine mungkin adalah metrik jarak paling umum yang digunakan secara umum di beberapa domain. Dengan itu, ada sangat sedikit informasi dalam jarak kosinus yang benar-benar dapat dipetakan kembali ke semantik apa pun, yang tampaknya tidak ideal untuk situasi ini.
  • Levenshtein Distance - Juga dikenal sebagai 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 ini
  • LSA - Adalah bagian dari gudang besar teknik ketika datang untuk mengevaluasi kesamaan dokumen yang disebut topic 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 source
  • LDA - Juga merupakan teknik yang digunakan topic modeling, tetapi berbeda dari LSAyang sebenarnya mempelajari representasi internal yang cenderung lebih halus dan intuitif. Secara umum, hasil yang Anda peroleh LDAlebih baik untuk memodelkan kemiripan dokumen daripada LSA, tetapi tidak cukup baik untuk belajar bagaimana membedakan secara kuat antara topik.
  • Alokasi Pachinko - Merupakan ekstensi yang sangat rapi di atas LDA. Secara umum, ini hanya versi perbaikan yang signifikan LDA, dengan satu-satunya downside adalah bahwa dibutuhkan sedikit lebih lama untuk melatih dan implementasi open-source sedikit lebih sulit didapat
  • word2vec - Google telah mengerjakan serangkaian teknik untuk secara cerdas mengurangi kata dan dokumen menjadi vektor yang lebih masuk akal daripada vektor jarang yang dihasilkan oleh teknik seperti Count Vectorizersdan 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.
  • doc2vec - Juga dikenal sebagai paragraph vectors, ini adalah yang terbaru dan terbaik dalam serangkaian makalah oleh Google, melihat ke representasi vektor dokumen yang padat. The gensimperpustakaan python memiliki implementasi word2vecyang cukup sederhana bahwa hal itu dapat cukup cukup dimanfaatkan untuk membangun doc2vec, tetapi pastikan untuk menjaga lisensi diingat jika Anda ingin pergi ke rute ini

Semoga itu bisa membantu, beri tahu saya jika Anda memiliki pertanyaan.

indico
sumber
6

Ada sejumlah langkah jarak semantik, masing-masing dengan pro dan kontra. Berikut ini beberapa di antaranya:

  • jarak cosine , produk dalam antara vektor fitur dokumen;
  • LSA , model berbasis vektor lain, tetapi memanfaatkan SVD untuk menghilangkan matriks istilah-dokumen asli;
  • Berbasiskan WordNet , manusia terverifikasi, meskipun sulit diperluas.

Mulailah dengan pendekatan yang paling sederhana dan kemudian bergerak lebih jauh berdasarkan masalah untuk kasus spesifik Anda.

teman
sumber
1
Perhatikan bahwa ketika melakukan LSA, biasanya Anda menggunakan jarak cosinus pada proyeksi LSA dari dataset asli. Hanya untuk mengklarifikasi.
Simon
6

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.

Simon
sumber
Bagaimana tepatnya Anda menggunakan LSA? Perlu dicatat bahwa LDA sebenarnya adalah pembungkus yang cukup tipis di sekitar LSA (itu adalah pLSA dengan balon sebelumnya) yang secara empiris terbukti sangat meningkatkan generalisasi. Anda hampir pasti akan melihat akurasi yang lebih baik dengan LSA, tetapi itu umumnya merupakan hasil dari overfitting, yang merupakan masalah yang sangat menonjol dengan LSA. Juga, apa sebenarnya yang Anda maksud dengan penskalaan di sini? doc2vec sebenarnya tidak memerlukan model baru untuk setiap dokumen, dan untuk perhitungan tidak ada perbedaan penting antara LSA dan LDA, keduanya sangat terukur.
Slater Victoroff
Saya belum mengamati tentang cocok dengan LSA, dan seperti saya katakan, saya telah bertemu banyak orang lain yang telah melihat kinerja yang lebih baik daripada LDA. Juga, saya telah melihat LSA digunakan dalam banyak entri yang menang dalam kompetisi semeval, saya belum pernah melihat LDA digunakan dalam entri yang menang. Itu adalah konferensi akademik untuk membandingkan kesamaan semantik antara dokumen, jadi saya berasumsi mereka tahu apa yang mereka lakukan. Doc2vec, jika Anda mengacu pada implementasi vektor paragraf Mikolov, apakah SGD pada setiap dokumen secara terpisah. Jadi sangat lambat.
Simon
@ SlaterVictoroff Saya pikir itu lebih dari menyatakan hal-hal untuk mengatakan itu cocok. LDA dikenal buruk untuk pencarian / pencarian informasi dan rekomendasi kasus, secara empiris LSA telah terbukti bekerja jauh lebih baik dan itu cocok dengan pengalaman saya sendiri karena saya ingin memvalidasi temuan ini terhadap data kami sendiri. Versi Doc2Vec melakukan penurunan gradien per dokumen, itu tergantung pada algoritma yang digunakan dalam Doc2Vec, karena yang umumnya merujuk pada banyak algoritma yang berbeda.
Simon
3

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.

pengguna1133029
sumber
Perhatikan komentar saya di bawah ini tentang skalabilitas vektor paragraf. Teknik ini terlihat sangat menjanjikan, tetapi sulit untuk diterapkan, dan tidak skala sama sekali, karena Anda melakukan SGD terpisah untuk setiap dokumen, yang sangat mahal, jika saya ingat makalahnya dengan benar
Simon
1

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.

Dl
sumber