Help us understand the problem. What is going on with this article?

Qiita Advent Calender 2019 の可視化をインスタントにするよ

Qiita Advent Calender 2019 の可視化をインスタントにするよ

この記事は、All About Group(株式会社オールアバウト) Advent Calendar 2019 20日目の記事です。
もういくつ寝るとクリスマスですね。
大人になった今サンタクロースが本当に来てくれると信じています。

初めての方は初めまして、Akidukin14 です。
普段は AllAbout の広告配信システムの機械学習周りや、分析結果の可視化等を担当しています。

今回初めて Advent Calendar 書くので、思いついたことをやってみようと思います。

やった事(概要)

Qiita Advent Calender の各カレンダー内部の記事データを可視化をしてみる
(Qiitaに投稿されている記事のみを対象...)

記載の内容(Topics)

  • 背景
  • やった事(箇条書き)
  • 結果
  • やった事(詳細)
    • アドベントカレンダーの記事本文を抽出
    • 記事本文を自然言語処理する(分かち書き)
    • WordCloudで可視化
  • 参考
  • AdventCalender索引

背景

(2019/12/n 時点)
カレンダー数 : 770
参加者数 : 13,414

初めてAdvent Calender参加するんですが、真っ先に思ったこと。

ぱねぇ。カレンダー数ぱねぇ。参加者ぱねぇ。

ピンポイントで自分の興味のあるカレンダーってどこだ...??
って思ったのが動機です。

やった事(箇条書き)

  1. アドベントカレンダーの記事本文を抽出
  2. 記事本文を自然言語処理する(分かち書き)
  3. WordCloudで可視化

結果

先に結果を載せます。
結果だけで十分という方はこちらをご確認ください。
(凄くライトにやったので、結果に偏りがあると思います、すみません...)

画像1

0_wordcloud.png

画像2

1_wordcloud.png

画像3

2_wordcloud.png

画像4

3_wordcloud.png

画像5

4_wordcloud.png

画像6

5_wordcloud.png

画像7

6_wordcloud.png

画像8

7_wordcloud.png

画像9

8_wordcloud.png

画像10

9_wordcloud.png

画像11

10_wordcloud.png

画像12

11_wordcloud.png

画像13

12_wordcloud.png

画像14

13_wordcloud.png

画像15

14_wordcloud.png

画像16

15_wordcloud.png

画像17

16_wordcloud.png

画像18

17_wordcloud.png

画像19

18_wordcloud.png

画像20

19_wordcloud.png

画像21

20_wordcloud.png

画像22

21_wordcloud.png

画像23

22_wordcloud.png

画像24

23_wordcloud.png

画像25

24_wordcloud.png

画像26

25_wordcloud.png

画像27

26_wordcloud.png

画像28

27_wordcloud.png

画像29

28_wordcloud.png

画像30

29_wordcloud.png

画像31

30_wordcloud.png

画像32

31_wordcloud.png

1. アドベントカレンダーの記事本文を抽出

  1. QiitaAPIをPythonから叩き記事のデータを取得
call_qiita_api
def call_qiita_api(header, per_page = None, query = None, page = None):
    ## api指定
    get_items_api = 'https://qiita.com/api/v2/items'
    params = {'per_page' : per_page
        , 'query' : query
        , 'page' : page}
    datas = requests.get(get_items_api, params = params, headers = header)
    return datas
  1. これはアドベントカレンダーだ!と思わしき記事を取得対象にしてデータを取得する
regs_body_text
### コードがめっちゃ汚い...
def regs_body_text(text):
    ## 正規化パターン
    reg_pattern = re.compile('(\n|\t| | |-|~|-|`|:|;|_|\*|\!|\?|!|?|\+|\$|#|\[|\])')
    tmp = re.sub(reg_pattern, '', text.lower())
    target_type = re.compile('(アドベントカレンダー|adventcalendar)')
    if not re.search(target_type, tmp):
        return None, None
    calender_type = re.compile('(この記事は)\w+?(adventcalendar2019)')
    if not re.search(calender_type, tmp):
        return None, None,
    url_strings = re.search(calender_type, tmp).group()
    get_calender_type = re.sub('(この記事は|adventcalendar2019)', '', url_strings)
    return get_calender_type, tmp

2. 記事本文を自然言語処理する(分かち書き)

  1. MeCabで品詞を指定し単語に分割する
parse_text
mecab = MeCab.Tagger('-Owakati')
mecab.parse('')

def parse_text(text, parser = mecab):
    part = ['名詞','動名詞']
    parsed_text = []
    t = parser.parseToNode(text)
    while t:
        parts = t.feature.split(',')
        if parts[0] in part:
            parsed_text.append(t.surface)
        t = t.next
    return parsed_text

3. WordCloudで可視化

  1. 9x9のエリアに随時描画していくように対応
make_wordcloud
## WordCloudで可視化
keys_len = len(dataset.keys())
plot_picture = int(keys_len / 9) + 1
plot_area = np.arange(0,9,1).reshape(3,3)
keys = sorted(dataset.keys())
fp = FontProperties(fname = fonts)
k = 0
for pp in range(plot_picture):
    fig,axes = plt.subplots(nrows = 3, ncols = 3, figsize = (10,10))
    for i in range(9):
        sys.stdout.write('\r {}/{}'.format(k, keys_len))
        target_key = keys[k]
        wc = wordcloud.WordCloud(
                font_path = fonts
                , prefer_horizontal = 1
                , max_words = 300
                , background_color = 'white'
                , colormap = 'RdYlBu'
                , contour_color='pink'
                , width = 750
                , height = 750)
        n,m = [x.item() for x in np.where(plot_area == i)]
        plot_data = ' '.join([y for x in dataset[target_key]['parsed_text'] for y in x if not check_word(y)])
        wc_gen = wc.generate(plot_data)
        axes[n,m].imshow(wc_gen, interpolation = 'bilinear')
        axes[n,m].set_title('AdventCalendar : {}'.format(target_key), FontProperties = fp, color = 'gray', fontsize = 10)
        axes[n,m].axis('off')
        k += 1
    plt.subplots_adjust(left=0.1, right=0.95, bottom=0.1, top=0.95)
    plt.savefig('{}_wordcloud.png'.format(pp))
    plt.close()

参考URL

QiitaAPIの利用 :
https://qiita.com/arai-qiita/items/94902fc0e686e59cb8c5

AdventCalender 索引

今回利用させて頂きましたカレンダーの種類です。
索引として用意させていただきました。

画像No AdventCalenderNo AdventCalender名
1 0 1on1
1 1 2019新卒エンジニア
1 2 3dsensor
1 3 access
1 4 airccar
1 5 aizu
1 6 akerun
1 7 alh
1 8 alibabacloud
2 9 amazoneks
2 10 amazoneks2
2 11 android
2 12 android2
2 13 android初心者向け
2 14 angular
2 15 angular2
2 16 ansible
2 17 ansible2
3 18 appsscript
3 19 arduino
3 20 asoview
3 21 aws
3 22 awsamplify
3 23 awslambdaとserverless1
3 24 aws初心者
3 25 azure
3 26 bitrise
4 27 blockchain
4 28 bosyu
4 29 brainpad
4 30 c
4 31 cakephp
4 32 calendargmoアドマーケティング
4 33 camphor
4 34 cbcloud
4 35 circleci
5 36 classi
5 37 clojure
5 38 codebaseokinawa
5 39 conoha
5 40 css
5 41 cyberagent20新卒
5 42 cyberagentdevelopers
5 43 dart
5 44 datadog
6 45 dena
6 46 dena20卒内定者エンジニアによるアドベントカレンダーdena20新卒
6 47 dena20新卒
6 48 deno
6 49 discord
6 50 diverse
6 51 django
6 52 dmmグループ
6 53 dotfiles
7 54 dsl
7 55 dtp
7 56 eccube
7 57 elasticstack
7 58 elixir
7 59 elm
7 60 elm2
7 61 emacs
7 62 enebular
8 63 engineeringmanager
8 64 ethercatについて語る
8 65 filemaker
8 66 firebase
8 67 flutter
8 68 flutter2
8 69 fork
8 70 foss4g
8 71 freeeデータに関わる人たち
9 72 fun
9 73 fusic
9 74 fusicその2
9 75 git
9 76 globis
9 77 gmoペパボ
9 78 go
9 79 go3
9 80 go4
10 81 go5
10 82 go6
10 83 go7
10 84 goodpatch
10 85 hamee
10 86 haskell
10 87 heroku
10 88 houdiniapprentice
10 89 hrtech
11 90 ios2
11 91 iotlt
11 92 iplug
11 93 ipv6
11 94 iq1の2枚目っ
11 95 iridge
11 96 jamstack
11 97 java
11 98 javascript
12 99 javascript2
12 100 kaggle
12 101 kayac
12 102 kintone
12 103 kintone2
12 104 klab
12 105 klabengineer
12 106 kubernetes
12 107 kubernetes2
13 108 kubernetes3
13 109 kyash
13 110 kyotouniversity
13 111 laravel
13 112 laravel2
13 113 libreoffice
13 114 lifull
13 115 lifullその3
13 116 makeit
14 117 maya
14 118 microad
14 119 microsoftazuretech
14 120 microsoftpowerbi
14 121 misoca弥生
14 122 mohikanz
14 123 mysql
14 124 ncc
14 125 nem
15 126 nervesjp
15 127 nestjs
15 128 newspicks
15 129 nijibox
15 130 nodered
15 131 northdetail
15 132 nttコミュニケーションズ
15 133 nttテクノクロス
15 134 n高等学校
16 135 obniz
16 136 office365
16 137 oicitcreateclub
16 138 openandreproduciblescience
16 139 opensaasstudio
16 140 opttechnologies
16 141 oraclecloudinfrastructure
16 142 othlotech
16 143 pandoc
17 144 pathee
17 145 perl
17 146 php
17 147 plaid
17 148 ponos
17 149 pwa
17 150 pyladiesjapan
17 151 python
17 152 pythonその3
18 153 qiitagithubactions
18 154 qt
18 155 qualiarts
18 156 r
18 157 react
18 158 react2
18 159 reactnative
18 160 retty
18 161 rpa
19 162 ruby
19 163 runteq
19 164 rust
19 165 rustその2
19 166 rustその3
19 167 salesforceplatform
19 168 sansan
19 169 sap
19 170 satysfi
20 171 sbai
20 172 scala
20 173 sensy
20 174 sfc
20 175 sfcrg
20 176 siv3d
20 177 slack
20 178 smarthr
20 179 snowrobin
21 180 soracom
21 181 speee
21 182 splunk
21 183 sra
21 184 sre
21 185 studioztech
21 186 swift
21 187 terraform
21 188 tjbot
22 189 tokyocityuniversity
22 190 tomowarkarひとり
22 191 typescript
22 192 unity
22 193 unity2
22 194 unity3
22 195 valu
22 196 vexperts
22 197 vim
23 198 vim2
23 199 visualstudiocode
23 200 vrchat
23 201 vtubertech1
23 202 vue2
23 203 wanogroup
23 204 wanoグループ
23 205 webgl
23 206 workflow
24 207 xamarin
24 208 yamapエンジニア
24 209 zeals
24 210 zlab
24 211 zozoテクノロジーズ
24 212 zozoテクノロジーズ1
24 213 zozoテクノロジーズ2
24 214 zozoテクノロジーズ3
24 215 zozoテクノロジーズ4
25 216 zozoテクノロジーズ5
25 217 うるる
25 218 くふうカンパニー
25 219 さくらインターネット
25 220 ただの集団
25 221 とりあえずなんでも
25 222 なんか布教したいエンジニア
25 223 ふりかえり
25 224 ぷりぷりあぷりけーしょんず
26 225 アイリッジ
26 226 アソビュー
26 227 インセプションデッキ
26 228 ウィルゲート
26 229 ウェブクルー
26 230 エムスリーキャリア
26 231 エーピーコミュニケーションズ
26 232 キーボード1
26 233 ギフティ
27 234 クソアプリ
27 235 クソアプリ2
27 236 クラウドワークス
27 237 シェーダーアドベントカレンダー
27 238 シスコの有志によるciscosystemsjapan
27 239 ジャパンシステム
27 240 ジーズアカデミー
27 241 スマートスピーカー
27 242 ソフトウェアテスト
28 243 ソフトウェアテストの小ネタ
28 244 ディップ
28 245 データサイエンスに関してbyデータミックスコミュニティ
28 246 データ構造とアルゴリズム
28 247 トレタ
28 248 ドメイン駆動設計1
28 249 ドワンゴ
28 250 ニフティグループ
28 251 ノンプロ研
29 252 ハンズラボ
29 253 フェンリルデザインとテクノロジー
29 254 フォトクリエイト
29 255 フューチャー
29 256 フューチャー2
29 257 フラー
29 258 マイナビ
29 259 ミクシィ20新卒
29 260 ミクシィグループ
30 261 モチベーションクラウドシリーズ
30 262 ユアマイスター
30 263 ユニークビジョン株式会社
30 264 ラクス
30 265 レイトレ
30 266 個人開発
30 267
30 268 呉高専
30 269 品川
31 270 室蘭工業大学データサイエンス研究室のdsl
31 271 宮崎it関連勉強会
31 272 富士通クラウドテクノロジーズ
31 273 弁護士ドットコム
31 274 株式会社access
31 275 株式会社ナレッジコミュニケーションが運営するamazonaibyナレコム
31 276 機械学習をどう学んだかby日経xtechビジネスai②
31 277 機械学習ツールを掘り下げるby日経xtechビジネスai③
31 278 湧源クラブ
32 279 福岡若手sierbc
32 280 第二のドワンゴ
32 281 自作os
32 282 自然言語処理
32 283 自然言語処理2
32 284 茨大
32 285 認証認可技術
32 286 近畿大学
32 287 鈴鹿高専
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした