¡Hola a todos! Este año, Sibur Digital volvió a organizar un gran campeonato de análisis de datos (en comparación con otros rusos). Mi amigo y yo participamos en él y nos gustaría compartir con los lectores de Habr nuestra decisión y experiencia obtenida de la participación. Por supuesto, es poco probable que abramos América con este artículo, pero algún principiante en la competencia de presión arterial definitivamente podrá aprender algo útil para sí mismo.
¿Quienes somos?
Somos estudiantes apasionados por DS y ML. Aprendimos sobre esta área por primera vez en la conferencia AI Journey celebrada en nuestra universidad. Desde ese momento, hemos aprobado más de uno, no dos, ni tres cursos (desde la Universidad Técnica Estatal de Omsk hasta Andrew NG) y ahora participamos constantemente en hackatones y concursos (en algunos incluso ganamos premios), en paralelo estamos buscando una pasantía.
Sobre la tarea
Asumimos el segundo desafío de la competencia: "coincidencia de nombres".
La esencia es la siguiente: Sibur trabaja con una gran cantidad de nuevas empresas y, para optimizar el flujo de trabajo, sería útil que entendieran que están trabajando con un holding familiar previamente. Por ejemplo, Sibur Neftekhim y SIBUR IT pertenecen al mismo holding y, cuando se trabaja con una de estas empresas, sería útil utilizar la información acumulada anteriormente en el holding SIBUR.
Parafraseemos el problema en lenguaje DS. Se han dado dos nombres, mediante los cuales tenemos que determinar si las empresas pertenecen a un holding o no.
nombre_1 |
nombre_2 |
is_duplicate |
Japón caucho sintético Co |
Elastómero Jsr Bst |
uno |
JSR Corporation |
BST ELASTOMERS CO. |
0 |
Así es como se veía el conjunto de datos.
Preprocesamiento de datos
En primer lugar, convertimos los datos al alfabeto latino utilizando el módulo mágico unidecode. Luego lo llevaron a la minúscula, eliminaron cualquier basura en forma de signos de puntuación innecesarios, espacios dobles, 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, . ( ). , -.
?
Se podía tener en cuenta la semántica de las palabras o dar peso a las palabras: si una palabra en dos nombres coincidía y es útil (se refiere al nombre de la empresa) - tiene peso, automáticamente consideramos que es igual de dañino en la "diferencia" de palabras; utilizar la mayor cantidad de datos externos con nombres de empresas, etc. Además, no olvide analizar las observaciones en las que el modelo está equivocado (Falso Positivo, Falso Negativo), y en base a esto, construir nuevas características.
PD
Si desea contactarnos: matnik2001@gmail.com, domonion@list.ru