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参加するんですが、真っ先に思ったこと。
ぱねぇ。カレンダー数ぱねぇ。参加者ぱねぇ。
ピンポイントで自分の興味のあるカレンダーってどこだ...??
って思ったのが動機です。
やった事(箇条書き)
- アドベントカレンダーの記事本文を抽出
- 記事本文を自然言語処理する(分かち書き)
- WordCloudで可視化
結果
先に結果を載せます。
結果だけで十分という方はこちらをご確認ください。
(凄くライトにやったので、結果に偏りがあると思います、すみません...)
画像1
画像2
画像3
画像4
画像5
画像6
画像7
画像8
画像9
画像10
画像11
画像12
画像13
画像14
画像15
画像16
画像17
画像18
画像19
画像20
画像21
画像22
画像23
画像24
画像25
画像26
画像27
画像28
画像29
画像30
画像31
画像32
1. アドベントカレンダーの記事本文を抽出
- QiitaAPIをPythonから叩き記事のデータを取得
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
- これはアドベントカレンダーだ!と思わしき記事を取得対象にしてデータを取得する
### コードがめっちゃ汚い...
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. 記事本文を自然言語処理する(分かち書き)
- MeCabで品詞を指定し単語に分割する
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で可視化
- 9x9のエリアに随時描画していくように対応
## 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 | 鈴鹿高専 |