🎅
QiitaのタグとWord2Vecで楽しくなる冬
こちらはFringe81 Advent Calendar19日目の記事です。
18日目を担当したtrapiの記事からのバトンをつなぎます!
概要
- 「機械学習」という言葉に対して関連するワードを返すようなものを作りたいというモチベーションです
- 情報源としてQiitaのタグの情報を使わせてもらいました
- 記事タイトルが迷走してしまったことをこの場を借りてお詫び申し上げます
できたもの
- 「機械学習」というワードに関連するものとして得られたものが以下の図です
- フムフム、なんとなく良さそうな肌感を得られますね
サンプルコードはこちらにアップロードしてありますので理解の助けにお使いください
手法
大枠としては
- Qiitaからタグ情報の取得
- 無向グラフの作成
- ランダムウォークさせることによるシーケンスの生成
- Word2Vecの学習
1. Qiitaからタグ情報の取得
タグと言ってるのはQiitaのこの部分のことです。
- このタグ情報をQiita APIを用いて取得します
- 今回は最新の記事(2020年12月某日時点)1万記事分のタグ情報を用いました
2. 無向グラフの作成
- 同一記事につけられているタグは関連しているとして、タグ同士を無向グラフとして結びつけます
- 上の画像のタグだと「Python - VSCode」「Python - PyConJP」「VSCode - PyConJP」のように結びつけられます
3. ランダムウォークさせることによるシーケンスの生成
- 出来上がったグラフ上でランダムウォークさせます
- 上記の記事以外に「Python - 機械学習」という結びつきを持つ記事が他にあったら「Python」を通じて「機械学習」と「PyConJP」に関連性が見えてくることになります
- DeepWalkに関してはこちらの記事が分かりやすくまとまっていると思います
4. Word2Vecの学習
- 出来上がったシーケンスをWord2Vecに与えて学習させます
- Word2Vecの雑なイメージとしては
- 「VSCode」という言葉の周りによく「Python」という言葉がある、同様に「VSCode」という言葉のまわりに「R」という言葉もよく出てくるな、「Python」と「R」は似たような意味があるのでは?というような学習です
- そんな感じでタグの意味的な情報を学習させたいというモチベーションです
出来上がったもので遊んでみる
意味的に近いものを眺める
-
弊社
elm
好きに向けてelm
に近いワードを取得してみる -
いかがですかね?
-
IEとかはつらみが発生してるとかなんですかね?
-
弊社
scala
好きに向けてscala
に近いワードも取得してみます -
いかがですかね?
-
それっぽいライブラリの名前がある気がします
Word2Vecならではの遊びで遊んで見る
- Word2Vecといえば「王様」 - 「男」 + 「女」 = 「女王」というような演算ができるということで有名ですのでそれをやってみます
まずはelm
が出ることを想定して「frontend」 + 「functionalprogramming」を試してみます。
オッ!一番上ではないもののelmが確認されますね!
次は「python」 + 「機械学習」を試してみます
機械学習に強く引っ張られている気がしますが、sklearn
が出ているのは個人的に嬉しいです。
この演算は「何が出るかなー」と遊んでみるのは楽しいですが、どんな場面で使えるかわ現状浮かんでいません...
(おまけ)最後に最後に中心性を確認してみる
せっかくなので最後に固有ベクトル中心性を確認してみます。なんのワードがタグとしては中心に位置しているかとざっくり理解してください。
- ほぼQiitaのタグ・ランキングと一致します
- 差分はタグ・ランキングでは
swift
が入っていましたが、中心性ではnode.js
がランクインしていて、node.js
のほうがネットワーク的な重要性が高い(他のいろんなタグと結びつくなど)と考えられます
まとめ・考察
- 関連するワードを得るモデルとしてはそこそこ肌感のあるものがえられました
- ランダムウォークする際に同じ確率でランダムウォークさせましたが、ここにここに重みをつけると結果が変わりそうだと思います
- それよりもQiitaのタグにはtypoも結構含まれているのでデータクレンジングも効きそうだなと感じました
- いろんな問題をネットワークに落とし込むという手は今後も使えそうだなと感じました
- 作っていて楽しかったので満足です
よし、バトンはつないだ!
明日は期待の新星ガルです!楽しみ!
Discussion