Musim panas berakhir, Agustus sangat dingin. Kelas 11 saya dimulai dan saya menyadari bahwa sekarang adalah kesempatan terakhir (spoiler: tidak) untuk meningkatkan kompetensi profesional saya. Selama beberapa tahun saya rajin melakukan berbagai proyek TI, beberapa sendirian, beberapa di tim. Tapi sekarang semua
putra pacar ibuku sudah melakukan sesuatu yang indah. Mungkin tidak berguna, tetapi cantik dalam penampilan. Seseorang membuat simulasi lengket partikel dalam bentuk gif, seseorang terjun ke dalam pembelajaran mesin dan melakukan segala macam transfer gaya. Dan apa yang lebih buruk dari saya? Saya juga mau!
Contoh simulasi juga di bawah kucing.Contoh simulasi partikel dari teman sayaDengan pemikiran inilah studi saya tentang topik pembelajaran mesin dimulai. Dan dalam hal pelatihan bagi saya tidak ada yang baru, seperti di bidang TI lainnya, latihan diperlukan di sini. Tetapi bagaimana jika saya tidak tertarik pada penganalisa nada suara apa pun? Kita harus menciptakan sesuatu milik kita sendiri.
Sekali lagi membalik-balik news feed VKontakte, saya menyadari bahwa komunitas jejaring sosial ini adalah harta nyata bagi ilmu data. Jika Anda memproses teks, meme dalam bentuk gambar atau musik dari koleksi, Anda bisa mendapatkan sepotong besar informasi yang relevan tentang orang-orang modern: genre musik populer, kosa kata, atau waktu hari dari sebagian besar aktivitas orang. Ini adalah bidang untuk banyak penemuan.
Tetapi berapa banyak statistik yang dibutuhkan untuk orang biasa? Seolah-olah saya kehilangan musik saya, atau saya tidak dapat mengakses bagian "Populer"? Jadi, Anda perlu memikirkan sesuatu yang praktis, sesuatu yang dapat menarik setidaknya sebagian besar pengguna.
Perlu dicatat bahwa beberapa bulan sebelumnya saya membaca artikel keren tentang
membuat mesin pencari rumah saya , yang benar-benar mengejutkan saya. Seperti penulisnya, saya merasakan keinginan besar untuk proyek besar yang memproses ribuan gigabyte informasi siang dan malam.

Dan sekarang, kita kembali ke Agustus, yang menjadi sedikit lebih hangat daripada di awal artikel. Ketika saya menyadari bahwa sekarang saya memiliki sumber informasi yang sangat besar, saya menyadari bahwa sudah waktunya. Waktunya telah tiba untuk sistem mengerikan kita sendiri. Tetapi pertanyaan utama tetap beberapa hari kemudian - apa yang harus saya lakukan dengan semua ini? Apa yang ditawarkan kepada pengguna? Saya tidak akan menyiksa pembaca, saya hanya akan memberitahu Anda bahwa itu, seperti beberapa teman saya, sangat sulit bagi saya untuk mencari grup VKontakte baru yang mungkin saya sukai. Sekarang setiap publik pertama memiliki nama - sekumpulan kata acak. Admin mencoba menjadikannya yang paling absurd, mungkin ini semacam perlombaan, hanya bisa dimengerti oleh mereka.
Dan kemudian saya memutuskan untuk menulis layanan yang akan membantu pengguna dengan pilihan komunitas, rekomendasikan apa yang dapat Anda berlangganan. Jadi ide saya muncul.
Pengantar itu lama bukan kebetulan, itu seharusnya menyampaikan emosi saya dan menunjukkan bahwa ide itu tidak muncul tiba-tiba. Sebenarnya, seperti ide lain tentang HabrΓ©.
Layanan saya masih beroperasi, telah berlangsung selama lebih dari empat bulan (jika Anda menghitung sejak saat percobaan pertama yang berhasil). Tetapi saya sudah memiliki pengalaman yang ingin saya bagikan dengan Anda. Sekarang akan ada deskripsi proyek yang singkat dan paling ringkas. Selanjutnya, saya akan menguraikan beberapa poin utama. Dan jika artikel tersebut secara khusus akan menarik bagi habrayuzers, maka kelanjutannya akan keluar, di mana akan ada informasi dan kode teknis yang lebih murni.
Semuanya terdiri dari tiga bagian:
- bot pencarian (jika Anda bisa menyebutnya begitu)
- mesin pengolah data
- situs untuk pengguna (dengan panel kontrol dan pemantauan untuk admin)
Fungsi bot termasuk mencari grup baru dan teks "stripping" dan informasi lainnya ke dalam basis data. Mesin terlibat dalam pemrosesan lebih lanjut dari data ini, yang akan saya tulis di bawah ini. Dan situs ini hanya memungkinkan pengguna untuk menggunakan semua ini.
Cari bot
Tidak ada yang baru di sini. Saya hanya mengambil profil seseorang di VK dan mendapatkan daftar grup dan teman-temannya darinya. Semua ini terjadi dengan VK API. Dan jika IPA ini berhasil mendapatkan daftar grup pengguna dan teman-temannya, maka ia tidak berhasil mendapatkan konten grup ... Saya hanya mengalami batasan dan hanya itu. Kemudian saya ingat bahwa beberapa waktu yang lalu, VKontakte mempromosikan sistem keren mereka hanya untuk hal-hal seperti itu. Dan nama sistem ini adalah Streaming API.
Streaming API - alat untuk mendapatkan seleksi acak catatan dari VK. Pada halaman deskripsi tertulis bahwa Anda hanya bisa mendapatkan hingga 1% dari semua informasi, untuk mendapatkan hingga seratus Anda perlu menulis untuk Mendukung dan menjelaskan niat Anda kepada mereka.
Tampaknya semuanya indah. Tapi tidak. Saya, seperti mungkin banyak, telah melewatkan kata terpenting dalam uraian di atas. Dan ini adalah preposisi "sebelum". Tidak ada yang akan memberi Anda semua 100% dari data. Ini hanya bar bagian atas yang indah dan hanya itu. Faktanya, kita menjadi seperti ini:
Agen Harapan # 365 tidak akan membenci saya selama 365 hari setahun untuk tangkapan layar iniArtinya, saya hanya bisa mendapatkan 30 ribu acara per hari. Dan jumlah ini termasuk komentar dan hanya repost. Juga diperlukan untuk menunjukkan beberapa kata tag, hanya pesan yang akan datang. Beberapa posting yang tersisa tidak menarik bagi saya, karena ada di dinding pengguna. Masih sedikit. Sebagai referensi, dalam implementasi saya saat ini saya bisa mendapatkan catatan 8,5 juta dalam beberapa hari uptime tidak lengkap (total - sekitar 10 jam, tetapi tidak ada pengukuran yang tepat).
Di sini saya harus mengatakan tentang satu aturan yang saya identifikasi dari seluruh percobaan ini. Jangan pernah menilai grup dengan satu pos. Terutama jika Anda seorang kecerdasan buatan yang rentan terhadap kebisingan tersebut. Jadi, Anda memerlukan setidaknya beberapa posting untuk membuat deskripsi obyektif dari publik. Sekarang mari kita perkirakan bahwa beberapa grup dengan konten berkualitas tinggi merilisnya sekali setiap beberapa minggu. Dan bahkan kemudian saya bisa melewati itu karena API Streaming tidak sempurna. Dan jika saya mendapatkannya, berapa lama saya harus mengumpulkan konten sedikit demi sedikit?
Saya memutuskan itu terlalu lama dan pergi ke arah lain. Karena saya tidak bisa mendapatkan jawaban yang rapi dari VKontakte dalam format JSON, saya akan menguraikan dinding komunitas. Ya, tugasnya sedikit rumit, dan solusinya melambat, tapi saya tidak punya alternatif. Begitulah cara saya mulai menulis blok pertama dari sistem saya. Ngomong-ngomong, saya menulisnya di Jawa menggunakan Jsoup, perpustakaan yang membuatnya sangat nyaman untuk mengekstrak konten dari teks HTML. Saya tidak lupa memproses tanggal publikasi dari posting terakhir, saya tidak butuh komunitas yang mati, saya hanya tidak mengindeksnya. Posting yang ditandai dengan iklan juga dibuang. Tidak semua administrator membuat catatan seperti itu, tetapi masalah ini tidak begitu mudah dipecahkan, saya tidak dapat membuat filter iklan yang memadai dan karena itu, untuk saat ini, saya menolak filter ini.
Mesin
Ini mungkin bagian yang paling menarik dari proyek ini, tetapi saya tidak akan menjelaskan semuanya secara terperinci dalam publikasi ini. Jika seseorang tertarik pada detailnya, maka tanyakan dari saya dengan semua cara yang mungkin.
Yang paling sederhana dari semua cara untuk menyajikan teks dalam format yang dapat dimengerti oleh jaringan saraf adalah bag-of-words.

Proses vektorisasi dan lainnya tentang BOWSaya menyiapkan kamus dari semua kata-kata umum sebelumnya (tanpa lupa untuk mengecualikan kata-kata yang sering langsung, seperti "a", "apa", "yang" dan lainnya; mereka tidak membedakan teks mereka dari latar belakang orang lain), setiap kata memiliki nomor sendiri di dalamnya. Kemudian, ketika saya perlu memproses teks dengan jaringan saraf, saya mendapatkan nomor setiap kata dari kamus (jika ada) dan mendapatkan vektor (alias array dalam pemrograman). Ini adalah seperangkat angka yang diurutkan, di mana ada unit di tempat masing-masing nomor kata dari teks (lihat gambar di atas). Ternyata tipe data yang cukup dimengerti untuk jaringan. Saya memiliki panjang masing-masing vektor adalah 30.000, tentang begitu banyak kata yang saya kumpulkan pada tahap pertama pengembangan.
Penting juga untuk tidak melupakan bahwa, misalnya, kata "habr" dan "(c) habr" hampir sama untuk dipahami. Tetapi untuk algoritma yang dijelaskan di atas, ini adalah kata-kata yang sangat berbeda. Untuk memperbaikinya, saya menggunakan penganalisa morfologi
JMorphy2 . Ini adalah port dari PyMorphy2 asli untuk Java. Ia dapat melakukan banyak hal keren, misalnya mengubah bentuk kata (huruf, jenis kelamin, angka, dll.). Saya membutuhkannya untuk mendapatkan bentuk awal kata. Seperti yang Anda ketahui, bentuk awal kata "identik" adalah sama. Dan ini menyelesaikan masalah di atas.
6929 21903 25126 11441 7374 1925 1626 23128 6241 25584
Contoh daftar kata dalam kamus dan jumlahnya (dipisahkan oleh spasi)Daftar di atas menunjukkan bahwa kata "naga" tidak berubah menjadi "naga." Ini agak salah, tetapi bahkan preprocessing teks seperti itu sudah cukup. Secara umum, pustaka ini memiliki banyak kesalahan, tetapi kebanyakan dari mereka tidak mempengaruhi operasi sistem.
Layanan ini ditujukan untuk pemirsa berbahasa Rusia. Dan untuk kesederhanaan, hanya Rusia yang sedang diproses. Semua karakter (huruf di antara mereka) dari huruf lain dilempar keluar, seperti tanda baca, angka, emoji ... Sekali lagi, penyederhanaan. Juga, jangan lupa untuk menyaring kata-kata dari bahasa yang sebagian menggunakan alfabet Rusia, tetapi tambahkan huruf mereka sendiri (Ukraina, misalnya).
Tapi saya akan melanjutkan dari saat tulisan apa pun dari VKontakte telah berubah menjadi vektor (saya menyebutnya vektorisasi). Di sini tautan berikut terhubung: jaringan saraf. Saya memutuskan untuk menggunakannya karena itu menarik bagi saya dan berhasil menemukan arsitektur yang cocok untuk tugas saya.
Artikel pertama dari seri "Auto Encoders in Keras" membantu saya dengan ini. Dan ya, saya memutuskan untuk menggunakan auto encoder yang paling umum, karena bermanfaat dalam hal kecepatan dan pelatihan. Tapi mari kita bicara tentang semuanya secara berurutan.
Sedangkan untuk semua autoencoder lainnya, Anda perlu membuat dua jaringan saraf (encoder dan decoder) dan menggabungkannya menjadi satu. Saya melakukannya sebagai berikut:
from keras.layers import Input, Dense, Flatten, Reshape from keras.models import Model
Tetapi mengapa kita membutuhkan dua jaringan? Ngomong-ngomong, penulis, Anda tidak menjelaskan mengapa ini
semua !
Tenang, sekarang semuanya akan terjadi. Untuk melatih, misalnya, hanya pembuat enkoder yang tidak mungkin - tidak akan jelas seberapa benar prediksi yang ia buat. Dan untuk ini, kami melatih jaringan kedua, yang akan segera mendekode keluaran dari yang pertama (decoder). Input dan output data yang sama juga digunakan. Sekelompok dua jaringan (disebut autoencoder) belajar untuk mendapatkan hal yang sama dari input data. Tetapi semua data melewati βbottleneckβ yang sempit dalam bentuk 64 neuron. Ini membuang informasi yang paling tidak perlu. Dengan demikian, jaringan saraf belajar untuk mengirimkan informasi penting tentang teks dengan kualitas maksimum dan membuang semua kebisingan. Lalu saya hanya menghapus decoder dan hanya itu. Anda bisa mendapatkan hasil yang lebih baik, tetapi kemudian Anda perlu meningkatkan dimensi lapisan output dari encoder / input decoder. Maka akan perlu untuk menyimpan lebih banyak nilai dalam database, itu akan menimbang lebih banyak + semua operasi pada vektor panjang akan lebih lama (lebih banyak tentang itu nanti). Atau Anda dapat menambahkan lapisan / neuron, tetapi kemudian pelatihan dan vektorisasi akan lebih lama.
Encoder itu sendiri memungkinkan Anda untuk "memampatkan dimensi vektor." Ingat vektor nol dan satu itu? Jadi, pembuat enkode memungkinkan Anda mengubah ukurannya dari 30K menjadi 64 tanpa banyak kehilangan informasi penting. Setelah langkah ini, Anda biasanya dapat membandingkan dua vektor untuk menentukan kesamaan mereka ...
Tetapi kami melihat pekerjaan layanan berdasarkan rekomendasi komunitas VK, dan bukan catatan individual. Ini berarti bahwa kita perlu entah bagaimana mendapatkan vektor dari seluruh publik. Ini dilakukan dengan sangat mudah, matematika di tingkat kelas lima. Ini adalah metode yang agak kasar, tetapi berhasil. Saya hanya mengambil dan menambahkan semua vektor rekaman dari satu komunitas (misalnya, ambil tiga vektor kecil {1, 2, 3}, {2, 3, 4}, {0, 4, 2}, kita dapatkan vektornya {3, 9, 9 }). Dan saya membagi setiap elemennya dengan jumlah vektor (kita mendapatkan vektor {1, 3, 3}). Itu saja, kami menggabungkan semua catatan grup menjadi satu. Di masa depan, Anda perlu membuat sesuatu yang lebih rumit, sehingga Anda dapat mengeluarkan suara dalam bentuk posting dengan iklan, misalnya. Tapi sekarang ini sudah cukup.
Kami beralih ke bagian matematika itu sendiri, tetapi karena semua orang takut akan hal itu, saya akan menandatanganinya sebanyak mungkin. Mari kita mulai dengan vektor dalam pengertian matematika. Vektor adalah segmen terarah. Ini adalah hal yang memiliki koordinat awal (paling mudah untuk mengambilnya dengan nol) dan koordinat akhir. Yang terakhir dicatat dalam kurung kurawal. Sebagai contoh, koordinat akhir vektor {1, 0, 1}
youtube adalah titik dengan koordinat (1, 0, 1). Tapi kami akan mempertimbangkan dua vektor dua dimensi,
{5, 2} dan
{5, 0}. Mari kita bangun mereka dalam satu sistem koordinat:

Biarkan vektor
merah muda
- kuning. Kemudian, dengan fakta matematika dari kelas sembilan, kosinus sudut antara mereka sama dengan rasio produk skalar mereka terhadap produk modul mereka.
Produk Skalar <
,
> sama dengan jumlah produk dari elemen yang sesuai, yang kita miliki
.
Modul vektor ditemukan dengan rumus berikut:
Dimana
dan
ini adalah nilai pertama dan kedua dari vektor a. Jadi:
Menggabungkan semuanya sesuai dengan rumus, kita mendapatkan:
Ketepatan perhitungan dapat diperiksa melalui fungsi trigonometrik dari segitiga siku-siku yang dibentuk. Dalam proyek ini, semua perhitungan dilakukan sesuai dengan formula seperti itu, tetapi hanya koordinat ujung vektor bukan dua, tetapi enam puluh empat.
Apa yang diberikan informasi ini? Ternyata, semakin besar nilai kosinus (semakin kecil sudutnya), semakin mirip teks yang sesuai dengan vektor. Dengan demikian, tugas untuk menemukan grup yang paling mirip dengan grup A datang untuk menemukan cosinus sudut antara vektor grup ini dan yang lainnya. Kemudian mesin meninggalkan semua grup yang nilai kosinusnya bersama dengan A akan lebih besar daripada, katakanlah, 0,99. Pada tahap ini, Anda cukup menampilkan hasilnya, seperti yang saya lakukan sebelumnya. Tetapi proses ini sudah sangat lama di komunitas 100K, dan apa yang akan terjadi, katakanlah, pada 1M?
Untuk mengatasi masalah ini, saya menggunakan grafik. Semua kelompok direpresentasikan sebagai simpulnya, dan dua titik terhubung jika kosinus sudut antara vektor yang bersesuaian dengan mereka lebih besar dari 0,99. Tetapi jika Anda tidak memahami struktur dengan nama grafik, maka Anda dapat membayangkan bahwa saya melakukan pre-compute pasangan komunitas yang paling mirip dalam basis data dan menyimpannya. Dan saya tidak lupa memperbarui grafik karena grup baru ditambahkan ke database. Ya, ini adalah waktu yang sangat lama, tetapi masih lebih mudah bagi pengguna daripada sebelumnya.
Situs
Saya tidak akan melukis segala sesuatu tentang situs ini, karena ini adalah bagian yang paling mudah dan paling membosankan. Saya tidak pernah menulis situs dari awal, saya selalu menggunakan berbagai mesin yang sudah jadi. Tetapi dalam proyek ini, saya menyadari bahwa akan lebih mudah untuk membuat samopis. Jadi, mesin situs ditulis dalam Python 3 menggunakan Flask. Dan mesin template Ninja2 digunakan, yang membuatnya lebih nyaman untuk mengganti nilai dinamis dalam kode HTML (dan js) statis. Saya tidak melupakan otorisasi melalui VKontakte, karena ini adalah opsi yang paling optimal. Perancang, seperti perancang tata letak, hanya buruk pada saya, jika seseorang ingin bergabung dengan proyek - selamat datang.
Baris pertama hasil dari situsMasalahnya
Saya menemukan beberapa situasi tidak menyenangkan yang berhasil saya pecahkan. Masalah dengan VK API ditulis di atas dan solusinya sangat tidak menyenangkan untuk layanan ini, karena kecepatan turun sangat banyak. Jika sebelum saya menerima seratus posting dalam satu permintaan, sekarang saya perlu membuat beberapa unduhan kode HTML besar, menguraikannya, dan hanya setelah proses itu. Sekarang ada masalah dengan pembatasan mendapatkan pengguna, teman dan grup mereka, tetapi batas ini tidak benar-benar mengganggu pada tahap ini. Maka Anda harus menyelesaikannya dengan cara yang sama seperti yang pertama.
Teks di Internet modern menjadi kurang signifikan setiap hari. Selama bertahun-tahun, VKontakte memiliki banyak grup dengan video, gambar, dan musik. Dan untuk mendapatkan rekomendasi yang bagus, Anda perlu memprosesnya.

Tapi ini bukan teks, dan kekuatan komputasi yang sangat serius diperlukan. Misalnya, ini adalah kartu video kelas atas, tetapi sekarang saya tidak memilikinya, dan saya tidak ingin mengambil server untuk semua ini (terlalu dini). Tetapi secara umum, saya sudah memiliki praktik terbaik untuk arsitektur jaringan saraf untuk tugas ini. Saya akan menggunakan beberapa neuron untuk mengklasifikasikan gambar, "memotong" bagian atas darinya, yang bertanggung jawab atas klasifikasi objek. Yang tersisa hanyalah yang akan memetakan tanda-tanda gambar. Saya dapat memeras kartu ini dengan encoder lain dan itu saja, semua operasi selanjutnya mirip dengan yang "teks".
Masih ada pertanyaan lain yang belum terselesaikan mengenai berapa banyak permintaan ke situs VKontakte yang dapat saya buat per unit waktu. Atau dalam sehari. Sekarang saya belum mengalami pembatasan ini, tetapi itu bisa terjadi pada saat yang paling tidak tepat.
Rencana masa depan
Saya sangat membutuhkan panel kontrol dan statistik yang indah. Ini sudah dalam kondisi awal, tetapi perlu diselesaikan. Dari sini saya ingin mengontrol start / stop dari layanan microser (yaitu, mesin terdiri dari mereka), ukuran antrian, kecepatan pemrosesan dan semua itu. Nah, statistik, siapa yang tidak mau melihat jumlah mereka? Tentu saja, saya perlu mengoptimalkan semuanya dan membuatnya cocok untuk pengguna, khususnya, saya perlu mengulang bagian eksternal situs, karena tidak memenuhi standar kenyamanan saya.
Kesimpulan
Saya berhasil memulai jalur menciptakan layanan dengan struktur yang menarik (setidaknya untuk saya) yang akan saya gunakan untuk salah satu kontes yang akan memungkinkan saya untuk masuk ke universitas Rusia terbaik (saya tidak akan mengatakan seperti apa yang non-klasik pertama itu). Saya pikir jika Anda masih bekerja, Anda dapat memeras sesuatu yang lebih menarik darinya, misalnya, penganalisa kualitas publikasi, membuat layanan analitik untuk administrasi komunitas atau yang lainnya.
Saya menemukan banyak hal dari teks di atas untuk pertama kalinya. Ini artinya saya bisa melakukan kesalahan. Jika pembaca saya tahu apa yang bisa diperbaiki / diperbaiki, di mana saya mungkin memiliki masalah lain dan seterusnya - silakan tulis tentang ini di komentar. Dan saya meminta Anda untuk memberikan kritik tentang kualitas artikel tersebut, sehingga saya dapat memperbaikinya lain kali. Terima kasih