Hallo, alle miteinander! In diesem Jahr veranstaltete Sibur Digital erneut eine große (im Vergleich zu anderen russischen) Datenanalyse-Meisterschaft. Mein Freund und ich haben daran teilgenommen und möchten den Lesern von Habr unsere Entscheidung und Erfahrung aus der Teilnahme mitteilen. Natürlich ist es unwahrscheinlich, dass wir Amerika mit diesem Artikel eröffnen, aber einige Anfänger in Blutdruckwettbewerben werden definitiv etwas Nützliches für sich selbst lernen können.
Wer sind wir?
Wir sind Studenten, die DS und ML sehr lieben. Wir haben dieses Gebiet zum ersten Mal auf der AI Journey-Konferenz an unserer Universität kennengelernt. Seit diesem Moment haben wir mehr als einen und nicht zwei und nicht drei Kurse (von der Omsk State Technical University bis Andrew NG) absolviert und nehmen nun ständig an Hackathons und Wettbewerben teil (bei einigen haben wir sogar Preise gewonnen). Parallel dazu suchen wir ein Praktikum.
Über die Aufgabe
Wir haben die zweite Herausforderung des Wettbewerbs angenommen - "Name Matching".
Das Wesentliche ist wie folgt: Sibur arbeitet mit einer großen Anzahl neuer Unternehmen zusammen. Um den Workflow zu optimieren, wäre es für sie hilfreich zu verstehen, dass sie mit einer bereits vertrauten Beteiligung zusammenarbeiten. Zum Beispiel stammen Sibur Neftekhim und SIBUR IT aus derselben Holding, und wenn Sie mit einem dieser Unternehmen zusammenarbeiten, wäre es nützlich, die zuvor gesammelten Informationen über die SIBUR-Holding zu verwenden.
Lassen Sie uns das Problem in die DS-Sprache umschreiben. Es wurden zwei Namen angegeben, anhand derer wir feststellen müssen, ob die Unternehmen zu einer Holding gehören oder nicht.
name_1 |
name_2 |
is_duplicate |
Japan Synthetic Rubber Co. |
Jsr Bst Elastomer |
einer |
JSR Corporation |
BST ELASTOMERS CO. |
0 |
So sah der Datensatz aus.
Datenvorverarbeitung
Zunächst haben wir die Daten mit dem magischen Unidecode-Modul in das lateinische Alphabet konvertiert. Dann brachten sie Kleinbuchstaben, entfernten jeglichen Müll in Form von unnötigen Satzzeichen, doppelten Leerzeichen usw.
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, . ( ). , -.
?
Es war möglich, die Semantik von Wörtern zu berücksichtigen oder Wörtern Gewichte zu geben: Wenn ein Wort in zwei Namen zusammenfällt und es nützlich ist (bezieht sich auf den Namen des Unternehmens) - Gewicht hat, betrachten wir automatisch, dass es im "Unterschied" von Wörtern genauso schädlich ist; Verwenden Sie so viele externe Daten wie möglich mit Firmennamen usw. Vergessen Sie auch nicht, die Beobachtungen zu analysieren, bei denen das Modell falsch ist (False Positive, False Negative), und auf dieser Grundlage neue Funktionen zu erstellen.
PS
Wenn Sie mit uns Kontakt aufnehmen möchten: matnik2001@gmail.com, domonion@list.ru