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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/6be5e97a-eefa-607f-2a9b-f03226578ee0.png)
## 画像2
![1_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/09238011-4736-b490-da1a-efc292a0b8db.png)
## 画像3
![2_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/e0133f3a-0290-e61e-590c-9baf27929ae5.png)
## 画像4
![3_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/71ea80e7-a0f0-47de-5617-b9891b98c512.png)
## 画像5
![4_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/95ecb3b0-b123-775b-d5ef-5b5e6664d79c.png)
## 画像6
![5_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/e80549f3-efec-3914-dcdc-e70c21b3b373.png)
## 画像7
![6_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/c248e099-2187-aac1-767c-e356374b0417.png)
## 画像8
![7_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/ccb7174c-5452-2ccd-a998-484cb7d25ee5.png)
## 画像9
![8_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/ef38b36f-e424-89ae-db92-1dd1ac4ee8bc.png)
## 画像10
![9_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/0a21ea90-0262-f44d-7802-80dfd5c3ef25.png)
## 画像11
![10_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/538c0d40-f1f3-4765-e6a9-0baeda4545bb.png)
## 画像12
![11_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/998f01b5-326a-726a-f049-f1de216ad5cd.png)
## 画像13
![12_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/3baa3f8f-6dd8-640c-501f-cf7b40045392.png)
## 画像14
![13_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/9dc852ab-4c45-778a-d291-d7be3215b9ad.png)
## 画像15
![14_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/36b3ef84-d19e-29dd-bae9-ef8c95ef7815.png)
## 画像16
![15_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/75c83122-3d9a-b998-9af3-2722a7420c42.png)
## 画像17
![16_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/b6f919b3-2047-e4ab-69ed-407209516637.png)
## 画像18
![17_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/bce1d319-6a67-d5cc-effe-430ae25ad2b5.png)
## 画像19
![18_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/873ca684-b256-4a24-e50b-28bd39fc24b7.png)
## 画像20
![19_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/26c1c610-1d30-8fd7-588c-ccc7aa8dcef5.png)
## 画像21
![20_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/74d4dfd7-7609-5991-372e-57e895462ae8.png)
## 画像22
![21_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/491f11c3-0f27-1adb-9d13-2c6801f1e3c4.png)
## 画像23
![22_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/e4961b8e-ec84-0317-8f6b-70185d6e254c.png)
## 画像24
![23_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/17e35d66-fe7c-018b-6b04-0402dc40a701.png)
## 画像25
![24_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/88e57b62-4686-8c3d-581e-14bece0dc34b.png)
## 画像26
![25_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/189d2be4-81f9-dd0d-83a3-a22deb272dc0.png)
## 画像27
![26_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/160b417d-855f-a0fc-6cab-5e90862fe44e.png)
## 画像28
![27_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/f2f4e2e0-0101-5a5f-4b20-6b3b195770e5.png)
## 画像29
![28_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/d9166132-c8a5-9bc1-ac09-24127db7864f.png)
## 画像30
![29_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/7e7ab575-28e4-aaa0-cadc-5aa1db10024f.png)
## 画像31
![30_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/05897625-79d4-9f8b-1078-7676a0948431.png)
## 画像32
![31_wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531228/25575021-7767-464f-ca50-566af0f341d9.png)


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

1. QiitaAPIをPythonから叩き記事のデータを取得

```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
```
2. これはアドベントカレンダーだ！と思わしき記事を取得対象にしてデータを取得する

```python: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で品詞を指定し単語に分割する

```python: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のエリアに随時描画していくように対応

```python: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その３|
|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|鈴鹿高専|