
Pengarang: Shambhavi
Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda sedang membangun produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan untuk menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.
Posting blog ini adalah tentang apa yang kami cari saat berteman! Terlepas dari lelucon, dalam proyek ini, kita akan belajar bagaimana menghitung kesamaan antara permintaan pencarian dan database teks. Kami juga akan memberi peringkat semua data menurut skor kesamaannya dan mengambil teks yang paling mirip dengan indeksnya.
Latar belakang
Sebelum kita masuk ke cara kerja proyek, sangat penting untuk memahami aplikasi dan kegunaannya. Praktis, sepanjang hari kita mengalami algoritma kesamaan, beberapa canggih dan beberapa sangat mendasar dan berguna, seperti kesamaan kosinus. Data domain techno-legal, seperti paten, banyak bekerja dengan pernyataan tugas ini untuk melakukan pencarian teknologi atau penemuan yang tumpang tindih.
Sementara metode pencarian dapat berbasis korpus, metode yang mengandalkan kumpulan informasi yang lebih besar untuk menarik semantik antara konsep, atau, berbasis pembelajaran mendalam, di mana jaringan saraf digunakan untuk menghitung embeddings serta jarak. [1]
Di blog ini, kita akan membahas satu contoh dari kedua metode ini karena kita memahami bagaimana kesamaan kosinus membantu kita dalam memanfaatkan informasi jarak antara dua pendekatan embedding yang berbeda ini.
Kumpulan Data & Prapemrosesan
Dalam eksperimen kami, kami melihat ke dalam Kumpulan Data Stack Overflow Questions tempat kami mencoba menemukan pertanyaan serupa dengan kueri kami. Dataset berisi 60.000 pertanyaan Stack Overflow dari 2016–2020.
Kami menggunakan fungsi read_sc untuk membaca kriteria pencarian kami yang dapat dimasukkan sebagai string atau sebagai jalur ke file teks yang berisi itu, dan fungsinya bersih untuk memuat file input ke dalam kerangka data.
https://medium.com/media/222c615a001581404e1154958e386ff3/href
Prapemrosesan teks memainkan peran kunci untuk penyematan berbasis korpus seperti Word2Vec dan fastText. Sementara teknik pemrosesan khusus domain seperti memperkenalkan kontraksi teks atau perluasan singkatan meningkatkan algoritme, data kami relatif bersih, dan dengan demikian kami memilih teknik prapemrosesan NLP standar.
Fungsi di bawah ini mengambil string sebagai input, menghapus tanda baca dan stopword, dan mengembalikan daftar token.
https://medium.com/media/c159d68fe975cb1bdc1057c01551a9a0/href
Sekarang setelah kita memahami cara mengambil input dan memprosesnya sebelumnya, sekarang mari kita bahas cara melindungi data ini di ruang fitur, yaitu membuat embeddings!
Menjelajahi Embeddings
Kalimat-BERT
Algoritme menggunakan parafrase-MiniLM-L6-v2 oleh HuggingFace untuk menghasilkan embeddings, yang digunakan untuk tugas-tugas seperti pengelompokan atau pencarian semantik karena memetakan frasa dan paragraf ke ruang vektor padat 384 dimensi. Alih-alih menggunakan trafo kalimat yang menambah ukuran slug saat menerapkan model, kami meneruskan input kami ke model trafo dan kemudian menerapkan operasi penyatuan yang tepat di atas penyisipan kata yang dikontekstualisasikan. Model transformator ini juga diversi dengan DVC.
pengubah kalimat/parafrase-MiniLM-L6-v2 · Memeluk Wajah
Teks Cepat
Tapi mengapa menggunakan fastText ketika kita sudah memiliki semua embeddings berbasis BERT yang unggul, Anda bertanya? Ketika datang ke dokumen bentuk panjang, tidak ada yang mengalahkan fastText lama yang bagus!
Penyematan kalimat-Bert memiliki nilai batasan umum 512 kata, dan panjang ini tidak dapat ditingkatkan. Tetapi ketika kami menggunakan embeddings berbasis corpus seperti Word2Vec atau FastText, kami tidak memiliki batasan seperti itu. FastText beroperasi pada tingkat yang lebih baik menggunakan karakter n-gram, di mana kata-kata diwakili oleh jumlah vektor karakter n-gram, berbeda dengan Word2Vec, yang secara internal menggunakan kata-kata untuk memprediksi kata. Dan dengan demikian, kami tidak pernah mengalami kesalahan klasik ‘kehabisan kosakata’ dengan FastText, dan ini berfungsi dengan baik untuk beberapa bahasa yang kata-katanya tidak ada dalam kosakatanya.
Menghitung Kesamaan Dengan Kesamaan Cosinus
Memahami Kesamaan Cosinus (Sumber)
Seperti digambarkan dalam ilustrasi di atas, dalam kasus kesamaan cosinus, kami mengukur sudut antara dua vektor (atau embeddings).
Ada banyak ukuran kesamaan lainnya, seperti jarak Euclidean dan kesamaan Jaccard. Namun, jarak kosinus berkinerja lebih baik daripada ini karena ini bukan hanya ukuran kata-kata umum atau besarnya tumpang tindih konsep, tetapi mempertimbangkan orientasi vektor dalam ruang penyisipan dan dengan demikian bahkan jika dokumen memiliki ukuran yang tidak dapat dibandingkan, ia dapat menghitung secara akurat kesamaan mereka.
https://medium.com/media/9d3f5cfd145623ec8501524700226cc0/href
Di atas adalah fungsi dasar untuk menghitung kesamaan kosinus antara dua vektor a dan b untuk referensi Anda. Kami menjelajahi fungsi kesamaan kosinus berbasis Pytorch dan Scipy dalam kode kami.
Kami menghitung embeddings dari teks pencarian serta kalimat dalam dataset kami, dan untuk kalimat-bert, kami menggunakan fungsi util.pytorch_cos_sim dan untuk fastText, kami menggunakan scipy.spatial.distance.cosine untuk menghitung kesamaan di antara mereka.
Menyusun Kode
Kami memiliki file main.py yang mengambil argumen seperti nama model, kriteria pencarian, file yang berisi semua data, nama kolom dari mana Anda ingin mencari teks serupa. Fungsi utama memanggil salah satu dari dua kelas yang ditentukan untuk penyematan berbasis BERT dan penyematan fastText sesuai dengan argumen yang Anda pilih.
https://medium.com/media/f1a1b4270f540b8524f02972b1e88e5e/href
Kita juga dapat memahami struktur dari pipa data di bawah ini, di mana data dan model sedang dilacak oleh DVC. File perhitungan kesamaan mengambil input dari direktori data dan menggunakan fungsi pembantu dari direktori src.
Pipa Data
Menganalisis Algoritma
Karena kami tidak berurusan dengan masalah pembelajaran terawasi tradisional di mana kami melatih model kami untuk mencatat akurasi dan hyperparameter, tantangannya adalah memutuskan bagaimana mencatat dan mengevaluasi kinerja. Sementara model mengembalikan file keluaran peringkat dalam urutan kesamaannya dengan teks pencarian, saya juga memutuskan untuk mencatat kalimat yang paling mirip yang dicetak oleh kedua model secara individual dan indeksnya untuk memahami apakah model menangkap semantik dengan cara yang sama. Parameter perbandingan yang menarik bisa jadi adalah waktu komputasi juga.
Mari kita ambil frasa dan periksa hasilnya!
Frasa: Mengapa Opsi Java tidak dapat diubah?
Kedua algoritma mengembalikan nilai yang sama di mana kecocokan yang dipilih memiliki skor yang hampir sama.
Log untuk Sent-BERT dan FastText
Sekarang Aplikasi Streamlit!
Untuk mencoba proyek Anda sendiri, klon repositori dan luncurkan aplikasi:
pip install -r requirements.txt
streamlit menjalankan app.py
Aplikasi Streamlit untuk Perhitungan Kesamaan
Cukup masukkan string teks yang ingin Anda cari dan file ‘.csv’ yang ingin Anda lihat. Anda harus memasukkan nama kolom dan membuat pilihan di antara dua model! Berikut tampilan outputnya:
Hasil kesamaan : Streamlit WebApp
Streamlit mudah digunakan, misalnya untuk memasukkan data dan menjalankan fungsi perhitungan, kami menggunakan:
https://medium.com/media/eb54a2c225985381d838eb88d882a249/href
Anda dapat mencari melalui komponen untuk tipe data yang Anda butuhkan sebagai input dan output.
Menerapkan Aplikasi Web Pada Instans AWS EC2
Kami memutuskan untuk menerapkan aplikasi kami dalam instance AWS EC2, dan blog ini adalah cawan sucinya. Ada 5 langkah untuk meluncurkan instans EC2 Anda:
Pilih AMI (Amazon Machine Image), kami memilih yang memenuhi syarat tingkat gratis!
2. Selanjutnya, Anda harus memilih jenis instans.
3. Buat dan unduh keypair tipe RSA.
4. Sekarang, kita perlu mengubah Pengaturan Jaringan dan membuat grup keamanan baru. Anda perlu memberi nama grup keamanan Anda dan kemudian menambahkan dua aturan baru dengan jenis ‘TCP Kustom’ dan menetapkan rentang port sebagai 8501 untuk satu aturan dan 8502 untuk aturan lainnya.
5. Sekarang pilih penyimpanan yang Anda butuhkan dan luncurkan instans!
Sekarang instance Anda sedang berjalan!
Saya mengikuti cara termudah untuk terhubung ke instance ini, dan Anda dapat mengikutinya.
Cukup pilih contoh di atas dan klik untuk menghubungkan, dan di sana Anda memiliki terminal tepat di depan Anda!
Jika Anda telah mengikuti sejauh ini, Anda sudah memiliki model dan data yang didorong ke DVC (dan repositori dagshub), dan yang perlu kita lakukan sekarang adalah menarik model menggunakan skrip sederhana yang menyiapkan instans EC2 dan meluncurkan aplikasi kita. Script yang saya ikuti sama dengan blog yang disebutkan di atas:
https://medium.com/media/211cdaa680495899dc4889c38f889697/href
Anda juga memerlukan file .yaml dengan semua detail ini:
https://medium.com/media/36899d5ce3d5e175b1590e36eefc3fb3/href
Anda sudah menyiapkan semuanya, dan kedua perintah ini akan meluncurkan aplikasi Anda:
python prepare_ec2.py
streamlit menjalankan app.py
Dan voila! Anda menjalankan proyek ujung ke ujung. Jangan lupa untuk bermain-main dengan aplikasi.
Lihat aplikasi di EC2 di sini!
Untuk kode lengkapnya, lihat proyek ini:
ShambhaviCodes/Semantic_Similarity
Jangan lupa untuk memeriksa masalah dan berkontribusi, jangan ragu untuk menghubungi saya untuk pertanyaan dan saran apa pun di LinkedIn atau Twitter.
Referensi :
https://arxiv.org/pdf/2004.13820.pdf https://towardsdatascience.com/nlp-mlops-project-with-dagshub-deploy-your-streamlit-app-on-aws-ec2-instance-part-2 -eb7dcb17b8ba
Mencari Kesamaan Semantik! awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.
Diterbitkan melalui Menuju AI