jwata blog

勉強の記録や思ったことなど

ジョブマッチングの為のword2vec

Qiitaから移行しました。

概要

求職者が仕事を探す時に、完全にスキルや職種名がマッチすることは多くはありません。 さらに表記揺れが多いこともあって、従来のキーワードマッチングで適切な求人を探すのは難しいのが現状です。

そこで今回、word2vecを使って求人によく使われる単語の意味を学習させてみました。 学習済みモデルから得られる類似するスキル名や職種名を使うことで、Semantic job search が可能になります。

word2vec とは

word2vecは単語をベクトル空間で表現する(word embeddings)ことができ、 これによって似たような単語を見つけたりやクラスタリングをすることが可能になります。

Word2vecやword embeddingsの詳細については他の方が説明されていますのでそちらを参考にしてください。

求人データ

今回はWeb上に公開されている求人データを使いました ジャンルはIT・Web業界に絞り、合計12130件のデータを集めました。

職種名、サマリー、応募資格 の項目を学習に使いました。 image.png

データ前処理

まずは、サマリーと応募資格をTokenizeして名詞のみを抽出しました。 (修飾語や動詞などは仕事の内容をあまり示していないので今回の学習からは省きました。)

抽出された単語はこんな感じで、web, アプリ開発, java など仕事内容を示すキーワードが抽出出来ていますね。

['学歴', '不問', 'web', 'アプリケーション', '領域', '開発', '経験', '方', '実務', '経験', 'プログラミング', '好き', 'アプリ開発', '好き', '方', '応募', 'java', 'javascript', 'css', 'html', '開発', '経験', '方', '優遇', '方', '歓迎', '自社', '内', '腰', '医方', 'アプリ開発', '好き', '方', 'ワーク・ライフ・バランス', '医方', '自分', '裁量', '状態', '医方', '社会貢献', '性', '高位', '仕事', '医方', 'エンドユーザー', '評価', '自分', '医方', '活', '経験', 'スキル', 'システム', 'アプリケーション', '開発', '経験', '当社', '開発', 'エンジニア', '一員', '活躍', '実務', '経験', '趣味', 'プログラミング', '遊び', 'ゲーム開発', '開発', '好き', '方', '一緒に', '有名', 'もの', 'java', 'javascript', 'css', 'html', '開発', '経験', '成長', '環境', '歓迎', '経験', 'スキル', 'プラットフォーム', '開発', '経験', 'ios', 'android', 'アプリケーション', '開発', '経験', 'google maps api', 'アプリケーション', '開発', '経験', 'agile', '開発', '経験']

次に職種名ですが、 webエンジニア, フロントエンジニアをtokenizeせずに個別の単語として取扱いました。 理由としては、各々の職種名の意味を学習させたかったからです。 クリーニング・正規化して、ある程度の表記揺れを解消しました。

Webエンジニア
-> webエンジニア

【AIプロダクト】 Webエンジニア
-> webエンジニア

WEBエンジニア(リーダ候補)
-> webエンジニア

レーニン

今回はGensimのAPIを使って学習しました。

文章毎の単語の配列を与えるのですが、職種名の意味を学習させるために応募資格の最初の単語として追加しました。

['webエンジニア'] + ['必須', '条件', 'python', '開発', '経験', '機械学習', ...]

また、下記がトレーニングのパラメータになります

項目
ベクターサイズ 100
ウインドウサイズ 10
アルゴリズム CBOW

結果

類似単語

いくつかの職種の類似単語を調べてみます。

similar_words('Webエンジニア')
=> [('サーバーサイドエンジニア', 0.8966489434242249),
 ('webアプリケーションエンジニア', 0.8889687061309814),
 ('開発エンジニア', 0.8835119009017944),
 ('フルスタックエンジニア', 0.8723335266113281),
 ('rubyエンジニア', 0.8664447069168091),
 ('サーバサイドエンジニア', 0.8570215702056885),
 ('web開発エンジニア', 0.8520206212997437),
 ('アプリケーションエンジニア', 0.8453050255775452),
 ('バックエンドエンジニア', 0.8452906608581543),
 ('railsエンジニア', 0.8418977856636047)]
similar_words('UIデザイナー')
=> [('ui・uxデザイナー', 0.9382747411727905),
 ('ui/uxデザイナー', 0.9307737350463867),
 ('webデザイナー/コーダー', 0.9097369313240051),
 ('ux/uiデザイナー', 0.9043135046958923),
 ('2dデザイナー', 0.903240442276001),
 ('webデザイナー・htmlコーダー', 0.8986614942550659),
 ('webクリエイター', 0.8866125345230103),
 ('エフェクトデザイナー', 0.8825030326843262),
 ('cgデザイナー', 0.8771432638168335),
 ('モーションデザイナー', 0.8738027811050415)]
similar_words('aiエンジニア')
[('データエンジニア', 0.927179753780365),
 ('機械学習エンジニア', 0.9107803702354431),
 ('ai開発エンジニア', 0.9047583341598511),
 ('webシステム開発エンジニア', 0.90267014503479),
 ('webプログラマー', 0.891706109046936),
 ('製品開発エンジニア', 0.8902024626731873),
 ('webシステムエンジニア', 0.8894868493080139),
 ('se・pg', 0.8882736563682556),
 ('javaエンジニア', 0.8881719708442688),
 ('rd', 0.8856392502784729)]

ポピュラーなwebエンジニア, UIデザイナーの結果はとても納得感ありますね。 マイナーなAIエンジニアもそれなりに良い結果が返って来ています。

次に、スキル名の類似単語を見ていきます。

similar_words('Ruby')
=> [('php', 0.9285846948623657),
 ('perl', 0.8777764439582825),
 ('java', 0.8664125800132751),
 ('ruby on rails', 0.8557538986206055),
 ('python', 0.8433256149291992),
 ('elixir', 0.8411149978637695),
 ('symfony2', 0.8331097364425659),
 ('言語', 0.8303745985031128),
 ('web エンジニア', 0.8260266780853271),
 ('clojure', 0.8259769082069397)]

Rubyに対しては、同じくらいポピュラーなプログラミング言語フレームワークが表示されました。

similar_words('photoshop')
=> [('illustrator', 0.9775387048721313),
 ('fireworks', 0.8953925967216492),
 ('dreamweaver', 0.8600867986679077),
 ('adobe illustrator', 0.8445886373519897),
 ('adobe photoshop', 0.8391222953796387),
 ('ui・uxデザイナー', 0.8321688175201416),
 ('webデザイナー/コーダー', 0.8211061954498291),
 ('webデザイナー・htmlコーダー', 0.8204653263092041),
 ('uiデザイナー', 0.815212607383728),
 ('indesign', 0.8117254376411438)]

photoshopillustratorの類似度が他と比べてすごく高いですね。

Visualization

次にポピュラーな職種名のベクトルを2次元にマッピングしてみました。

Web系エンジニア

UIデザイナー、ディレクターなど

非エンジニア

結構いい感じにグループが出来ていますね。

まとめ

今回の結果から、求人に使われている職種名やスキルを学習できていることが確認できました。 次回は類似単語を使って、検索エンジンの結果を向上させてみたいと思います。 最後まで読んで頂き、ありがとうございました。

今回の検証に利用したコードやデータはGithubのレポジトリにありますので もし自分でも試して見たい方は参考にしてください。