Halo semuanya! Tahun ini, Sibur Digital kembali menyelenggarakan kejuaraan analisis data yang besar (dibandingkan dengan Rusia lainnya). Teman saya dan saya berpartisipasi di dalamnya dan ingin berbagi dengan pembaca Habr keputusan dan pengalaman kami yang diperoleh dari partisipasi. Tentu saja, kecil kemungkinan kita akan membuka Amerika dengan artikel ini, tetapi beberapa pemula dalam kompetisi tekanan darah pasti akan dapat mempelajari sesuatu yang berguna untuk dirinya sendiri.
Siapa kita?
Kami adalah siswa yang sangat bersemangat tentang DS dan ML. Kami pertama kali mengetahui tentang area ini pada konferensi AI Journey yang diadakan di universitas kami. Sejak saat itu, kami telah lulus lebih dari satu, dan bukan dua, dan bukan tiga kursus (dari Omsk State Technical University hingga Andrew NG) dan sekarang kami terus berpartisipasi dalam hackathon dan kompetisi (di beberapa bahkan kami memenangkan hadiah), secara paralel kami sedang mencari magang.
Tentang tugas
Kami mengambil tantangan kedua kompetisi - "pencocokan nama".
Intinya adalah sebagai berikut: Sibur bekerja dengan sejumlah besar perusahaan baru, dan untuk mengoptimalkan alur kerja, akan berguna bagi mereka untuk memahami bahwa mereka bekerja dengan holding yang sudah dikenal sebelumnya. Misalnya, Sibur Neftekhim dan SIBUR IT berasal dari holding yang sama, dan ketika bekerja dengan salah satu perusahaan ini, akan berguna untuk menggunakan informasi yang dikumpulkan sebelumnya pada holding SIBUR.
Mari parafrase masalahnya ke dalam bahasa DS. Dua nama telah diberikan, yang dengannya kami harus menentukan apakah perusahaan tersebut milik satu holding atau tidak.
name_1 |
name_2 |
is_duplicate |
Japan Synthetic Rubber Co. |
Jsr Bst Elastomer |
satu |
JSR Corporation |
BST ELASTOMERS CO. |
0 |
Seperti inilah kumpulan data itu.
Pemrosesan awal data
Pertama-tama, kami mengonversi data ke alfabet Latin menggunakan modul unidecode ajaib. Kemudian mereka dibawa ke huruf kecil, membuang sampah apa pun dalam bentuk tanda baca yang tidak perlu, spasi ganda, dll.
from unidecode import unidecode
import re
def preprocess(text: str):
text = unidecode(text)
text = text.lower()
text = re.sub(r'[\.,]+', '', text)
text = re.sub(r"\(.*\)", ' ', text)
text = re.sub(r"[^\w\s]", ' ', text)
text = re.sub(r'\b\w\b', ' ', text)
text = ' '.join(text.split())
return text
. , pycountry( ) , .
. , , , . " " "shanghai", , , . .
, , - ( , ).
, : "" , .
" ". 0.3 . , .
. . .
, , . .
, , :
,
()
: , ,
tfidf - ( )
ngram
( )
,
,
, , XGBoost, . ~ 0.59 .
, - . (, , !), , 0.69 . , , .
- , , , .
, . , fit_predict, . ( ). , -.
?
Dimungkinkan untuk memperhitungkan semantik kata-kata atau memberi bobot pada kata-kata: jika sebuah kata dalam dua nama bertepatan dan berguna (mengacu pada nama perusahaan) - berbobot, kami secara otomatis menganggap bahwa itu sama berbahayanya dalam "perbedaan" kata; menggunakan sebanyak mungkin data eksternal dengan nama perusahaan, dll. Juga, jangan lupa untuk menganalisis pengamatan yang modelnya salah (False Positive, False Negative), dan berdasarkan ini, buat fitur baru.
PS
Jika Anda ingin menghubungi kami: matnik2001@gmail.com, domonion@list.ru