ジョブマッチングの為のword2vec
Qiitaから移行しました。
概要
求職者が仕事を探す時に、完全にスキルや職種名がマッチすることは多くはありません。 さらに表記揺れが多いこともあって、従来のキーワードマッチングで適切な求人を探すのは難しいのが現状です。
そこで今回、word2vecを使って求人によく使われる単語の意味を学習させてみました。 学習済みモデルから得られる類似するスキル名や職種名を使うことで、Semantic job search が可能になります。
word2vec とは
word2vecは単語をベクトル空間で表現する(word embeddings)ことができ、 これによって似たような単語を見つけたりやクラスタリングをすることが可能になります。
Word2vecやword embeddingsの詳細については他の方が説明されていますのでそちらを参考にしてください。
求人データ
今回はWeb上に公開されている求人データを使いました ジャンルはIT・Web業界に絞り、合計12130件のデータを集めました。
職種名、サマリー、応募資格 の項目を学習に使いました。
データ前処理
まずは、サマリーと応募資格を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)]
photoshop
とillustrator
の類似度が他と比べてすごく高いですね。
Visualization
次にポピュラーな職種名のベクトルを2次元にマッピングしてみました。
Web系エンジニア
UIデザイナー、ディレクターなど
非エンジニア
結構いい感じにグループが出来ていますね。
まとめ
今回の結果から、求人に使われている職種名やスキルを学習できていることが確認できました。 次回は類似単語を使って、検索エンジンの結果を向上させてみたいと思います。 最後まで読んで頂き、ありがとうございました。
今回の検証に利用したコードやデータはGithubのレポジトリにありますので もし自分でも試して見たい方は参考にしてください。