みなさん、こんにちは!今年、Sibur Digitalは再び大規模な(他のロシアと比較して)データ分析選手権を主催しました。私の友人と私はそれに参加し、Habrの読者と参加から得られた私たちの決定と経験を共有したいと思います。もちろん、この記事でアメリカを開く可能性は低いですが、血圧競技の初心者の中には、間違いなく自分に役立つことを学ぶことができる人もいます。
私たちは誰ですか?
私たちはDSとMLに非常に情熱を持っている学生です。この分野については、本学で開催されたAIジャーニーカンファレンスで初めて知りました。その時以来、私たちは(オムスク州立工科大学からアンドリューNGまで)1つ以上、2つ、3つではないコースを通過し、現在は常にハッカソンやコンペティションに参加しています(賞を受賞したものもあります)。並行してインターンシップを探しています。
タスクについて
コンテストの2番目の課題である「名前のマッチング」に取り組みました。
本質は次のとおりです。Siburは膨大な数の新しい会社と協力しており、ワークフローを最適化するために、彼らがすでに慣れ親しんだ持ち株で働いていることを理解するのに役立ちます。たとえば、SiburNeftekhimとSIBURITは同じ保有物であり、これらの企業の1つと協力する場合は、SIBUR保有物で以前に蓄積された情報を使用すると便利です。
問題をDS言語に言い換えてみましょう。2つの名前が付けられており、それによって、会社が同じ持ち株に属しているかどうかを判断する必要があります。
name_1 |
name_2 |
is_duplicate |
日本合成ゴム株式会社 |
Jsr Bst Elastomer |
1 |
JSR株式会社 |
BST ELASTOMERSCO。 |
0 |
これは、データセットがどのように見えたかです。
データの前処理
まず、magic unidecodeモジュールを使用して、データをラテンアルファベットに変換しました。次に、小文字にし、不要な句読点や二重スペースなどの形でゴミを取り除きました。
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, . ( ). , -.
?
単語のセマンティクスを考慮したり、単語に重みを付けたりすることができました。2つの名前の単語が一致し、有用である場合(会社の名前を参照)、重みがある場合、単語の「違い」においても同様に有害であると自動的に見なされます。また、モデルが間違っている観察結果(False Positive、False Negative)を分析し、これに基づいて新しい機能を構築することを忘れないでください。
PS
すべてのコードはここにあります
お問い合わせをご希望の場合:matnik2001 @ gmail.com、domonion @ list.ru