キーワードの変遷を辿ってみたら何か見えるもんがあるんじゃないかということで、WEB+DB PRESSのVol.1からVol.121の特集の紹介文をもとにワードクラウドを作ってみました。
何か見えたかというと、うん、どうだろうね……。
CGI、J2EE、ActionScriptから、IoT、Swift、OpenStackみたいな世界になったってことですかね。
ZOZO TOWNがキーワードで拾われてるのも面白いけど(Vol.106~Vol.116)。
Kubernetesが意外と小さな文字にしかならなかったなー。もうちょい大きくなるかと思ったが(詳しくないから知らんけど)。
では、以下、画像を載せておきますね。
Vol.1~Vol.11
Vol.6~Vol.16
Vol.11~Vol.21
Vol.16~Vol.26
Vol.21~Vol.31
Vol.26~Vol.36
Vol.31~Vol.41
Vol.36~Vol.46
Vol.41~Vol.51
Vol.46~Vol.56
Vol.51~Vol.61
Vol.56~Vol.66
Vol.61~Vol.71
Vol.66~Vol.76
Vol.71~Vol.81
Vol.76~Vol.86
Vol.81~Vol.91
Vol.86~Vol.96
Vol.91~Vol.101
Vol.96~Vol.106
Vol.101~Vol.111
Vol.106~Vol.116
Vol.111~Vol.121
ちなみにやったこと。
どの言語でやろうかな~と軽く調べたらPythonでカンタンそうなライブラリがあったのでPythonでやることに。
手元のWindowsにPython入れるのめんどくさそうだなあと思ってたらMicrosoft StoreでUbuntuをインストールできることを知ったのでポチっと。
Windows Power ShellよりPuTTYの方が慣れてるのでそこからSSHで入ろうとしたけど公開鍵認証の設定がうまくいかなかったんでパスワード認証で。情けないね。
毎回スクレイピングでサイトにアクセスするのも悪いのでwgetであらかじめスクレイピング対象のページをダウンロード。一応"-N"を付けるくらいは気を遣ったけれども、多少無作法なこともやったり。
sprintf的なものはどうやって書くんだろうと調べたり、インデントのアレは慣れないとアレだな~と思ったりしながらPythonのスクリプトを書いていく。
とりあえずBeautifulSoupというのを使うとラクにスクレイピングができるらしいのでpip3でインストール。ダウンロードしたHTMLのソースを眺めながらどの部分を抜き出すか調べて特集の紹介文をゲット。
ワードクラウドを作るのに形態素分析をしたいのでMeCabをPythonで使えるように。どうやらmecab-ipadic-neologdというのを使うと新しい言葉もうまくキーワード化できるらしいことを知る。
WordCloudライブラリを使って抜き出したキーワードをワードクラウドに。画像を作っては、ワードクラウドに表示しないstopwordsを抜くようにしてたけど、だんだんめんどくさくなったので途中で諦め。
アルゴリズムとか実装とか「これでいいの?」と65,536回くらい思ったけど、まあいいや。
ソースも貼っておくので誰かご指導ください。
import requests import MeCab import re from bs4 import BeautifulSoup from wordcloud import WordCloud pattern = 'Vol.*DVD-ROMが付いているお得な総集編もあります!' stopwords = ['特集', '解説', '開発', '基礎', '紹介', 'よう', '方法', 'ため', 'これ', 'このほど','上','必須','必要','ここ', '情報', '満載', '以来', '章', '的', '機能', '可能', '構築', '活用', '利用', '重要', '特別企画', '者', '届け', '筆者', '基本', '現在', 'の', '提供', 'こと', 'さまざま', '向け', 'これら', '何', '最新', '技術', '方', 'システム', '自分', '今', '化', 'はず', '人', 'もの', 'それ', '登場', '適切', '徹底', '氏', 'なか', 'フ', '使用', '多く', '中', 'かた', 'みなさん', '身', 'VS', 'それら', 'わけ', '側', 'ていねい', '有益'] for i in range(1, 13): stopwords.append("{:d}月".format(i)) for i in range(1, 10): stopwords.append("{:d}章".format(i)) for i in range(1, 10): stopwords.append("第{:d}章".format(i)) for i in range(1, 10): stopwords.append("Part{:d}".format(i)) for i in range(1, 9): stopwords.append("{:d}つ".format(i)) for i in range(2000, 2022): stopwords.append("{:d}年".format(i)) MAG_SET_COUNT = 11 FIRST_VOLUME = 1 LAST_VOLUME = 121 VOLUUME_STEP = 5 for i in range(FIRST_VOLUME, LAST_VOLUME - MAG_SET_COUNT + 2, VOLUUME_STEP): vol_starts = i vol_ends = i + MAG_SET_COUNT - 1 print(str(vol_starts) + "..." + str(vol_ends)) catch_joined = '' for j in range(vol_starts, vol_ends + 1): print(str(j)) soup = BeautifulSoup(open('htmls/' + "{:03d}.html".format(j)), "html.parser") for summary in soup.find_all(id="summary"): for element in summary.find_all("p"): if re.match(pattern, element.text): continue catch_joined += element.text tagger = MeCab.Tagger('-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/') tagger.parse('') node = tagger.parseToNode(catch_joined) word_list = [] while node: word_type = node.feature.split(',')[0] if word_type == '名詞': word_list.append(node.surface) node = node.next word_chain = ' '.join(word_list) wordcloud = WordCloud(width=896, height=504, background_color='white', colormap='bone', font_path='/mnt/c/Windows/Fonts/yumin.ttf', stopwords=stopwords) wordcloud.generate(word_chain) wordcloud.to_file("./images/wordcloud_{:03d}_{:03d}.png".format(vol_starts, vol_ends))
いろんなページを参考にしたけどめんどくさいので書きません。でもありがとう。
おわり。
P.S.
応募したい職種のいろいろな企業の募集要項をもとに、同じような感じでワードクラウドを作ると、その仕事に就くためにどういうことが求められてるかを可視化できるそうです。キャリアコンサルタントからの豆知識でした。