Sibur Challenge 2020 ou "comment nous avons proposé des fonctionnalités"

Bonjour à tous! Cette année, Sibur Digital a de nouveau accueilli un grand championnat d'analyse de données (par rapport à d'autres russes). Mon ami et moi y avons participé et aimerions partager avec les lecteurs de Habr notre décision et l'expérience acquise grâce à la participation. Bien sûr, il est peu probable que nous ouvrons l'Amérique avec cet article, mais certains débutants dans la compétition de pression artérielle pourront certainement apprendre quelque chose d'utile pour eux-mêmes.





Qui sommes nous?

Nous sommes des étudiants passionnés par DS et ML. Nous avons découvert ce domaine pour la première fois lors de la conférence AI Journey qui s'est tenue dans notre université. Depuis ce moment, nous avons passé plus d'un, pas deux, et pas trois cours (de l'Université technique d'État d'Omsk à Andrew NG) et maintenant nous participons constamment à des hackathons et des concours (dans certains nous avons même remporté des prix), en parallèle nous recherchons un stage.





À propos de la tâche

Nous avons relevé le deuxième défi du concours - «l'appariement de noms».





L'essence est la suivante: Sibur travaille avec un grand nombre de nouvelles entreprises, et afin d'optimiser le flux de travail, il leur serait utile de comprendre qu'elles travaillent avec une holding auparavant familière. Par exemple, Sibur Neftekhim et SIBUR IT appartiennent au même holding, et lorsque vous travaillez avec l'une de ces sociétés, il serait utile d'utiliser les informations accumulées précédemment sur le holding SIBUR.





Paraphrasons le problème en langage DS. Deux noms ont été donnés, par lesquels il faut déterminer si les sociétés appartiennent ou non au même holding.





nom_1





nom_2





is_duplicate





Japan Synthetic Rubber Co





Élastomère Jsr Bst





une





JSR Corporation





BST ELASTOMERS CO.





0





Voici à quoi ressemblait l'ensemble de données.





Prétraitement des données

Tout d'abord, nous avons converti les données en alphabet latin à l'aide du module magique unidecode. Ensuite, ils ont amené les minuscules, enlevé toutes les ordures sous la forme de signes de ponctuation inutiles, d'espaces doubles, etc.





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, . ( ). , -.





?





Il était possible de prendre en compte la sémantique des mots ou de donner du poids aux mots: si un mot à deux noms coïncidait et qu'il est utile (se réfère au nom de l'entreprise) - a du poids, on considère automatiquement qu'il est tout aussi néfaste dans la «différence» des mots; en utilisant autant de données externes avec les noms de sociétés que possible, etc. N'oubliez pas non plus d'analyser les observations sur lesquelles le modèle est erroné (faux positif, faux négatif), et sur cette base, construisez de nouvelles fonctionnalités.





PS

Tout le code se trouve ici





Si vous souhaitez nous contacter: matnik2001@gmail.com, domonion@list.ru








All Articles