Bagaimana kami mulai membuat kartu produk secara otomatis

gambar

Dalam artikel terakhir saya , saya berbicara tentang bagaimana kami belajar untuk secara otomatis mencocokkan produk dengan nama produk, yaitu, untuk memahami, misalnya, bahwa
Headset A4Tech Bloody G501 hitam
dan
A4 G501, hitam (merah) {Headphone dengan mikrofon, 2.2m}

- Sama. Ini memungkinkan untuk mengotomatiskan semua yang terkait dengan harga dan ketersediaan. Pada artikel ini saya akan memberi tahu Anda bagaimana kami melangkah lebih jauh dan mengotomatiskan pekerjaan dengan karakteristik dan gambar barang.

Ini adalah kelanjutan logis dari pengembangan produk, mengingat operasi yang dapat diandalkan pencocokan otomatis barang dengan nama. Kami mengalokasikan proyek otomasi ke perusahaan terpisah, dan saya berbicara tentang proyek menggunakan contoh dari salah satu klien kami, dan berbagi beberapa data klien dengan izinnya. Berikutnya adalah pengantar kecil, dan kemudian kita akan berbicara tentang algoritma yang kami gunakan.

Di mana kita mulai


Keadaan awal setahun yang lalu adalah sebagai berikut: katalog 120 ribu barang, di mana 70 ribu di antaranya tersedia. Setelah perbandingan otomatis dan pembuatan barang diluncurkan (seperti artikel terakhir tentang), katalog dengan cepat tumbuh menjadi satu juta dengan beberapa barang, yang persediaannya 600-650 ribu. Tetapi hanya 350 ribu posisi yang tersedia untuk pembelian eceran, karena sisanya tidak memiliki karakteristik. Bergantung pada kategorinya, agar suatu produk muncul untuk dijual, persentase karakteristik tertentu harus dipenuhi. Dalam beberapa kategori, harus ada foto. Dari 350 ribu barang yang dijual, 120 ribu tidak memiliki gambar. Saya akan menjelaskan bahwa barang-barang yang ada stok tetapi tidak dijual secara eceran dapat dijual secara grosir, itu adalah kebiasaan untuk mengirim file excel dengan nama dan harga di sana. Tapi portal b2b dengan kartu tidak diragukan lagi merupakan nilai tambah.Mereka juga dapat ditempatkan pada agregator, di mana sudah ada informasi lebih rinci tentang produk.

Gambar dan spesifikasi diisi dalam mode semi-otomatis. Selama tahun ini, pelanggan lain muncul, dan sekarang saya tahu bagaimana proses itu dibangun di selusin atau dua toko yang relatif besar, itu lebih atau kurang standar. Programmer yang mengelola situs dari waktu ke waktu menulis parser situs tentang masalah toko. Selanjutnya, departemen konten di panel admin membandingkan barang dan produk yang dikonsumsi dari katalog, serta kategori dalam sumber dan kategori dalam katalog. Kemudian, di setiap kategori, untuk setiap properti, korespondensi, penggantian, konversi unit dikonfigurasikan. Kartu beberapa barang diisi sepenuhnya secara manual. Sebagian kecil barang diberikan kepada kontraktor eksternal. Begitu juga dengan klien kami.

Sekitar 6% dari katalog menjadi usang per bulan, yaitu, untuk menjual 500 ribu produk di situs, Anda perlu membuat 30 ribu kartu per bulan hanya untuk mempertahankan kuantitas pada tingkat yang sama.

Kami memutuskan untuk mendekati masalah ini secara sistematis mungkin dan mengotomatiskan proses pembuatan kartu produk sebanyak mungkin.

Di mana kita mendapatkan data


Pertanyaan pertama yang muncul adalah dari mana mendapatkan sumber data, dan berapa banyak yang bisa kita dapatkan. Kami memiliki dua sumber utama:

  • file vendor dan API
  • data yang kami temukan di Internet

Poin kedua melibatkan situs parsing. Kami telah menciptakan infrastruktur untuk membuat parser, yang memungkinkan Anda mengonfigurasi parsing situs dalam waktu sekitar setengah jam. Kemudian, sekitar seratus parser dibuat pada infrastruktur ini, saat ini mereka telah mengumpulkan informasi tentang 16 juta produk dan mengunduh serta mengunggah 35 juta gambar dan dokumen (instruksi, lembar data) ke CDN. Sebagai CDN kami menggunakan Bunny CDN. Saat menyimpan gambar, kami mempertimbangkan hash perseptualnya sehingga kami dapat dengan cepat menemukan duplikat nanti, kami akan membicarakan lebih lanjut tentang ini di bawah ini. Idealnya, jika parser itu sendiri tanpa petunjuk dan pengaturan akan dapat mengumpulkan informasi tentang produk di situs mana pun, tetapi ini adalah rencana yang jauh.

Bagaimana kita mengisi kartu produk dengan gambar


Ini adalah bagian yang paling sederhana dan paling jelas. Kami sudah memiliki mekanisme untuk mencocokkan produk dengan nama, ia bekerja dengan cepat dan akurat Dalam hal ini, kami tertarik pada tanggapan positif palsu, yaitu sekitar 0,1%. Salah negatif praktis tidak mempengaruhi hasil, karena tidak ada banyak perbedaan, kami bekerja pada akhirnya dengan 10 atau 11 sumber. Perbandingan berfungsi dengan kecepatan 5-6 ribu produk per detik, dan semua 15 juta produk kami cocok dengan katalog apa pun dalam waktu kurang dari satu jam. Mungkin untuk mengakhiri ini, karena setelah perbandingan kita tahu semua gambar barang. Tetapi dalam praktiknya, mereka diduplikasi pada situs yang berbeda dalam kombinasi yang berbeda, dan itu akan benar untuk memilih yang terbaik dalam kualitas dari serangkaian gambar yang serupa, dan meninggalkan sisanya sebagai opsi dalam kasus pengeditan manual selanjutnya dari kartu produk.

Identifikasi gambar serupa terjadi dalam dua tahap. Pada tahap pertama, saat mengunduh file, untuk masing-masing gambar kami, kami mempertimbangkan hash perseptual. Pertama, hapus latar belakang yang solid, potong bidang. Kemudian menerapkan hashing DCT ke gambar yang dihasilkan. Tentang algoritma ini pernah ada artikel tentang Habré .

Setelah membandingkan untuk setiap produk, kami memiliki satu set gambar dengan hash yang sudah dihitung, dan kami perlu membaginya menjadi kelompok, dan kemudian memilih gambar dengan kualitas terbaik dari masing-masing kelompok. Ukuran set seperti itu dapat bervariasi dari beberapa unit hingga beberapa ratus unit, nilai tipikal adalah 10 - 40. Pada ukuran ini, Anda dapat menerapkan algoritma kompleksitas kuadrat, operasi utama - menghitung jarak Hamming - sangat cepat.

Kami membagi gambar menjadi beberapa kelompok sebagai berikut:

  1. gambar pertama dari himpunan membentuk cluster pertama
  2. setiap gambar selanjutnya dibandingkan dengan gambar pertama dari masing-masing cluster
  3. jika koefisien kesamaan tertinggi lebih besar dari nilai ambang, tambahkan gambar ke cluster yang ada
  4. kalau tidak, kami membuat cluster baru dari satu gambar

Setelah itu, kami mengambil gambar dengan kualitas terbaik dari setiap cluster. Dalam perkiraan pertama, kualitas ditentukan oleh ukuran dan resolusi gambar. Semakin besar ukuran dan resolusi, semakin baik, tetapi rasio ukuran terhadap resolusi harus dalam batas yang wajar. Analisis semacam itu sudah cukup dalam praktiknya.

Selanjutnya ada satu lagi nuansa. Kami menemukan gambar untuk barang secara otomatis, tetapi, bagaimanapun, sejauh ini orang tersebut lebih penting. Dan jika seseorang memutuskan untuk mengubah urutan gambar, dia harus memiliki kesempatan seperti itu. Tetapi pada saat yang sama, kami tidak menyukai gagasan "membekukan" kartu setelah pengeditan manual, kami ingin meningkatkan algoritme, menemukan gambar baru dan secara otomatis meningkatkan kartu di masa mendatang.

Dengan mengingat hal ini, pendekatan berikut ternyata menjadi opsi yang berfungsi: semua gambar yang telah diubah secara manual (dan perubahan di sini berarti serangkaian tindakan seluas mungkin: konfirmasi, pengecualian, mengubah urutan) akan selalu tetap di tempatnya. Semua gambar lain yang dapat kita ubah di masa depan dalam mode otomatis.

Bagaimana kita mengisi kartu produk dengan properti


Dengan properti, hal-hal sedikit lebih rumit daripada dengan gambar. Dalam sumber yang berbeda, properti yang sama dapat disebut secara berbeda, dapat dinyatakan dalam unit yang berbeda, mungkin tidak memiliki korespondensi eksplisit (misalnya, HDMI: ya dan Antarmuka: HDMI, USB).

Kami mulai dengan mendefinisikan properti dan menghasilkan jenis-jenis berikut:

  • baik tidak
  • angka + satuan
  • pilihan tunggal
  • pilihan ganda
  • baris

Selanjutnya saya akan menggunakan istilah " dimensi " dan " satuan pengukuran ", mereka memiliki arti yang berbeda.

Kemudian mereka menggambarkan satuan pengukuran dan cara mengubahnya. Saat ini, sudah ada lebih dari seratus, dari meter ke desibel. Semua dari mereka dibagi menjadi kelompok tergantung pada dimensi, dan di dalam kelompok dapat dibawa satu sama lain. Misalnya, tenaga kuda dapat dikonversi ke watt, dan lumen ke meter newton - tidak mungkin.

Selanjutnya, kami mencoba memecah proses mengisi properti menjadi langkah-langkah independen sehingga setiap langkah dapat ditingkatkan dan diuji secara terpisah dari yang lain. Untuk setiap produk dari katalog, kami melakukan operasi berikut:

  1. kami membandingkan barang dengan barang dari sumber dengan nama (kami memiliki proses yang kompleks, dijelaskan secara rinci dalam artikel sebelumnya )
  2. membentuk daftar definisi properti yang harus diisi
  3. kami membentuk daftar properti dari semua produk terkait
  4. kami mengasosiasikan dengan setiap definisi dari klausa 2 daftar nilai dari klausa 3
  5. ubah daftar menjadi satu nilai

Mari kita perhatikan dua poin terakhir lebih terinci sebagai contoh. Misalkan kita memiliki definisi properti seperti ini:
Nama: "Power"
Jenis: Nomor (6, 0)
Unit: Watt
dan daftar nilai seperti itu (sebenarnya, jauh lebih besar):
Panjang (mm): 220
Panjang: 0,22 m
Daya (kW): 1,8
Daya: 1,8 kW
Nilai Daya: 1800 W
Daya: 2 kW
Daya: 1800
Untuk memulainya, kita perlu memahami nilai-nilai apa yang layak dipertimbangkan secara prinsip. Versi yang berfungsi tetapi tidak final terlihat seperti ini:

  • ( )
  • ( )
  • .

Kami memiliki poin-poin ini diimplementasikan sebagai algoritma independen untuk setiap kasus, sehingga masing-masing dapat ditingkatkan secara terpisah dari yang lain. Dalam paragraf dengan sinonim, kami secara manual memasukkan beberapa pasangan yang paling jelas dan ditunda hingga waktu yang lebih baik. Selanjutnya, mungkin, kami akan mencoba untuk memilih sinonim secara otomatis, menggunakan data dari properti yang diisi. Selain itu, kita hanya dapat mengambil satu nilai dari satu sumber, sehingga masing-masing algoritma memiliki prioritas, menentukan urutan eksekusi algoritma.

Setelah operasi ini, kita akan memiliki serangkaian nilai berikut:
Daya (kW): 1,8
Daya: 1,8 kW
Nilai Daya: 1800 W
Daya: 2 kW
Daya: 1800
Kita tahu bahwa himpunan ini harus direduksi menjadi sejumlah dimensi tertentu. Untuk setiap jenis, kami memiliki algoritma independen. Dalam hal jumlah dan satuan ukuran, kami melakukan hal berikut:

untuk setiap nilai, kami mencoba menentukan satuan pengukuran. Jika ini gagal, atau dimensinya tidak sesuai dengan dimensi properti, abaikan nilai ini di masa mendatang. Kami akan memiliki serangkaian nilai berikut:
Daya (kW): 1,8
Daya: 1,8 kW
Nilai Daya: 1800 W
Daya: 2 kW
Kami mencoba mengubah setiap nilai menjadi angka dan membawa ke unit pengukuran yang diinginkan. Di sini kami mencoba untuk memperhitungkan semua format yang mungkin: dengan koma dan titik untuk memisahkan bagian bilangan bulat dan pecahan, dengan koma dan spasi untuk memisahkan ribuan, singkatan seperti ribuan dan seterusnya. Ternyata yang berikut ini:
1800 W
1800 W
1800 W
2000 W
Set ini harus dikurangi menjadi satu nilai. Dalam hal nilai tunggal di set, gunakan itu. Jika nilainya lebih dari satu dan mereka bertepatan, maka lebih baik lagi. Jika nilainya lebih dari satu dan tidak bertepatan, kami mengambil yang paling umum. Jika ini bukan masalahnya, jangan mengisi properti secara otomatis.

Ini adalah contoh untuk properti tipe numerik, untuk tipe lainnya langkah terakhir berbeda dan memperhitungkan fitur-fiturnya.

Untuk pengeditan manual, kami menangani properti dengan cara yang persis sama dengan gambar. Apa pun yang telah diubah atau dikonfirmasi secara manual tidak dapat secara otomatis berubah lagi. Yang lainnya bisa.

Bagaimana kami menguji suatu proyek


Proyek ini memiliki fitur luar biasa: intinya adalah teknologi yang seluruhnya terdiri dari tugas-tugas optimasi. Selain itu, sebagian besar dari tugas-tugas ini tidak memiliki solusi yang tepat, dan bagi mereka kami datang dengan kriteria kami sendiri yang memperhitungkan kecepatan dan akurasi akun. Di sinilah tes benar-benar diperlukan.

Arsitektur proyek dirancang sedemikian rupa sehingga algoritma yang kompleks, sejauh mungkin, dibagi menjadi langkah-langkah sederhana. Untuk setiap langkah ada kriteria optimasi dan serangkaian tes. Penekanan pada akurasi, tetapi juga kecepatan. Paling tidak, kami mencari setiap perubahan. Setiap langkah tersebut menyerupai tugas pemrograman olahraga, dan kami memiliki kesempatan untuk membandingkan hasil setelah setiap perubahan.

hasil


Adalah mungkin untuk mengevaluasi hasil secara lebih akurat setelah beberapa bulan bekerja dalam produksi. Kurang dari seminggu telah berlalu sekarang. Selama waktu ini, kami dapat menambahkan ke situs sekitar 110 ribu produk yang sebelumnya tidak dijual karena kurangnya properti atau gambar.
Tujuan untuk masa depan adalah sepenuhnya meninggalkan pekerjaan manual untuk mengisi katalog. Pada tahap pertama, hasil yang baik adalah mengurangi volumenya sebesar 70%. Saya pikir dengan hasil beberapa bulan kita akan mencapai ini.

All Articles