萩萩日記

世界に5人くらい存在するかもしれない僕のファンとドッペルゲンガーに送る日記

ふくしゅう その11(新旧のキーワードをワードクラウドで)

キーワードの変遷を辿ってみたら何か見えるもんがあるんじゃないかということで、WEB+DB PRESSのVol.1からVol.121の特集の紹介文をもとにワードクラウドを作ってみました。

何か見えたかというと、うん、どうだろうね……。

CGIJ2EEActionScriptから、IoT、Swift、OpenStackみたいな世界になったってことですかね。

ZOZO TOWNがキーワードで拾われてるのも面白いけど(Vol.106~Vol.116)。

Kubernetesが意外と小さな文字にしかならなかったなー。もうちょい大きくなるかと思ったが(詳しくないから知らんけど)。

では、以下、画像を載せておきますね。

Vol.1~Vol.11

f:id:hagihara:20210330210806p:plain

Vol.6~Vol.16

f:id:hagihara:20210330210821p:plain

Vol.11~Vol.21

f:id:hagihara:20210330210636p:plain

Vol.16~Vol.26

f:id:hagihara:20210330210711p:plain

Vol.21~Vol.31

f:id:hagihara:20210330210612p:plain

Vol.26~Vol.36

f:id:hagihara:20210330210727p:plain

Vol.31~Vol.41

f:id:hagihara:20210330210703p:plain

Vol.36~Vol.46

f:id:hagihara:20210330210815p:plain

Vol.41~Vol.51

f:id:hagihara:20210330210829p:plain

Vol.46~Vol.56

f:id:hagihara:20210330210619p:plain

Vol.51~Vol.61

f:id:hagihara:20210330210750p:plain

Vol.56~Vol.66

f:id:hagihara:20210330210555p:plain

Vol.61~Vol.71

f:id:hagihara:20210330210655p:plain

Vol.66~Vol.76

f:id:hagihara:20210330210547p:plain

Vol.71~Vol.81

f:id:hagihara:20210330210736p:plain

Vol.76~Vol.86

f:id:hagihara:20210330210527p:plain

Vol.81~Vol.91

f:id:hagihara:20210330210602p:plain

Vol.86~Vol.96

f:id:hagihara:20210330210743p:plain

Vol.91~Vol.101

f:id:hagihara:20210330210758p:plain

Vol.96~Vol.106

f:id:hagihara:20210330210627p:plain

Vol.101~Vol.111

f:id:hagihara:20210330210536p:plain

Vol.106~Vol.116

f:id:hagihara:20210330210720p:plain

Vol.111~Vol.121

f:id:hagihara:20210330210643p:plain

ちなみにやったこと。

どの言語でやろうかな~と軽く調べたらPythonでカンタンそうなライブラリがあったのでPythonでやることに。

手元のWindowsPython入れるのめんどくさそうだなあと思ってたらMicrosoft StoreでUbuntuをインストールできることを知ったのでポチっと。

Windows Power ShellよりPuTTYの方が慣れてるのでそこからSSHで入ろうとしたけど公開鍵認証の設定がうまくいかなかったんでパスワード認証で。情けないね。

毎回スクレイピングでサイトにアクセスするのも悪いのでwgetであらかじめスクレイピング対象のページをダウンロード。一応"-N"を付けるくらいは気を遣ったけれども、多少無作法なこともやったり。

sprintf的なものはどうやって書くんだろうと調べたり、インデントのアレは慣れないとアレだな~と思ったりしながらPythonスクリプトを書いていく。

とりあえずBeautifulSoupというのを使うとラクスクレイピングができるらしいのでpip3でインストール。ダウンロードしたHTMLのソースを眺めながらどの部分を抜き出すか調べて特集の紹介文をゲット。

ワードクラウドを作るのに形態素分析をしたいのでMeCabPythonで使えるように。どうやらmecab-ipadic-neologdというのを使うと新しい言葉もうまくキーワード化できるらしいことを知る。

WordCloudライブラリを使って抜き出したキーワードをワードクラウドに。画像を作っては、ワードクラウドに表示しないstopwordsを抜くようにしてたけど、だんだんめんどくさくなったので途中で諦め。

アルゴリズムとか実装とか「これでいいの?」と65,536回くらい思ったけど、まあいいや。

ソースも貼っておくので誰かご指導ください。

Taggerは最初にインスタンス化しとけば良かったのかな。

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.

応募したい職種のいろいろな企業の募集要項をもとに、同じような感じでワードクラウドを作ると、その仕事に就くためにどういうことが求められてるかを可視化できるそうです。キャリアコンサルタントからの豆知識でした。