夢がいっぱい

楽しみを求めてハマりだす

【Python】Twitter Streaming APIを利用してカラフルな鳥さんを作る


はじめに

今回は、 Twitterから大量のツイートを集めてどんな言葉がよくつぶやかれているのか調べてみよう! という試みです。




言語はPythonを使います。
というか、Pythonしか使えません 笑

pypytestes.hatenablog.com

 

前記事↑と本質的にやっていることは一緒なのですが、今回は少し丁寧に手順を書いていこうかなと思います。使用環境はmacOS Sierraです。ちなみに、Pythonのバージョンは3.6.3でした。

 

 

 

STEP 1 Twitter APIを使えるようにする

まず、Twitter Application Management で登録してConsumer Key、Consumer Secret、Access Token、Access Token Secret の4つのキーを取得します。 

 

次にPythonからTwitter APIを使うためのライブラリであるTweepyを入れます。

ターミナルで

pip install tweepy

してtweepyを入れます。

生のツイートを記録していってもいいのですが、 正規表現を使って、いらない情報をある程度削ぎ落としたりして使いやすい形で保存しておきましょう。

#stream.py
import os
import tweepy
import re

#認証情報を取得
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']

#認証情報を設定
auth = tweepy.OAuthHandler(CONSUMER_KEY,CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN,ACCESS_TOKEN_SECRET)


class MyStreamListener(tweepy.StreamListener):
    """APIで取得したツイートを処理するクラス"""
    def on_status(self,status):
        """ツイートを受信したときに呼び出されるメソッド。"""
        f = open('kiroku.txt','a')
        tw = re.sub("\n"," ",status.text) +'\n' #1行1tweetにするために改行をスペースに
        tw = re.sub(r"@[\w,_]+","",tw) #正規表現でアカウント名を吹っ飛ばす
        if re.search("RT :",tw) == None: #RTは無視
            f.writelines(tw)
            print(tw)
        f.close()

#認証情報とStreamListenerを指定してStreamオブジェクトを取得
stream = tweepy.Stream(auth,MyStreamListener())
#公開されているツイートをサンプリングしたストリームを受信
#キーワード引数languagesで、日本語以外をフィルタリングする
stream.sample(languages=['ja'])
  • 今回はツイート数を特に定めずに取得しているので、あまり意味はないのですが1行1ツイートのほうが後々便利な気がします
  • アカウント名は今回あまり価値のない情報なので正規表現で吹っ飛ばしておきます。
  • RTで同じツイートがたくさん取れてしまうと結果に偏りが出ちゃうので、今回はスルーするようにします。
  • キーについてはブログ掲載用に、.envファイルを作ってforegoコマンドで取得するようにしています。



さて、上のコードを走らせると下の画像のようにだーっとツイートを取得し続けます。 f:id:pypytestes:20180221225017p:plain


が、私の環境では何故か時々止まっちゃうことがあるので、時々止まる場合は

while :
do
  forego run python stream.py
  sleep 60
done

みたいなかんじで仕込んでおくといい感じに走り続けます。







STEP 2 Mecab形態素解析する

ある程度ツイートが取得できたら、

MeCab: Yet Another Part-of-Speech and Morphological Analyzer を使って形態素解析(ツイートを品詞単位に分解)していきます。
HomebrewとかでMecab本体とmecab-ipadic(IPA辞書)を手に入れておきます。
整ったら、

pip install mecab-python3

PythonからMecabを使えるようにします。
ちなみに、公式のPythonバインディングPython2系にしか対応していないらしいです。

オリジナルのMecabだと弱いので、

github.com
でシステム辞書を強化します。
比較してみると・・・

急性   名詞,一般,*,*,*,*,急性,キュウセイ,キューセイ
心不全   名詞,一般,*,*,*,*,心不全,シンフゼン,シンフゼン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
ため  名詞,非自立,副詞可能,*,*,*,ため,タメ,タメ
66  名詞,数,*,*,*,*,*
歳 名詞,接尾,助数詞,*,*,*,歳,サイ,サイ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
急死  名詞,サ変接続,*,*,*,*,急死,キュウシ,キューシ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
俳優  名詞,一般,*,*,*,*,俳優,ハイユウ,ハイユー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
大杉  名詞,固有名詞,人名,姓,*,*,大杉,オオスギ,オースギ
漣 名詞,一般,*,*,*,*,漣,サザナミ,サザナミ
さん  名詞,接尾,人名,*,*,*,さん,サン,サン
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
、 記号,読点,*,*,*,*,、,、,、
生前  名詞,副詞可能,*,*,*,*,生前,セイゼン,セイゼン
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
収録  名詞,サ変接続,*,*,*,*,収録,シュウロク,シューロク
参加  名詞,サ変接続,*,*,*,*,参加,サンカ,サンカ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
日本テレビ 名詞,固有名詞,組織,*,*,*,日本テレビ,ニホンテレビ,ニホンテレビ
系 名詞,接尾,一般,*,*,*,系,ケイ,ケイ
ぐるぐる    副詞,一般,*,*,*,*,ぐるぐる,グルグル,グルグル
ナインティナイン    名詞,一般,*,*,*,*,*
の 助詞,連体化,*,*,*,*,の,ノ,ノ
名物  名詞,一般,*,*,*,*,名物,メイブツ,メイブツ
コーナーグルメチキンレース・ゴチ    名詞,一般,*,*,*,*,*
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
なり  動詞,自立,*,*,五段・ラ行,連用形,なる,ナリ,ナリ
ます  助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
! 記号,一般,*,*,*,*,!,!,!
2   名詞,数,*,*,*,*,*
時間  名詞,接尾,助数詞,*,*,*,時間,ジカン,ジカン
スペシャル 名詞,一般,*,*,*,*,スペシャル,スペシャル,スペシャル




急性心不全 名詞,固有名詞,一般,*,*,*,急性心不全,キュウセイシンフゼン,キューセイシンフゼン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
ため 名詞,非自立,副詞可能,*,*,*,ため,タメ,タメ
66歳 名詞,固有名詞,一般,*,*,*,66歳,ロクジュウロッサイ,ロクジュウロッサイ
で 助詞,格助詞,一般,*,*,*,で,デ,デ
急死 名詞,サ変接続,*,*,*,*,急死,キュウシ,キューシ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
俳優 名詞,一般,*,*,*,*,俳優,ハイユウ,ハイユー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
大杉漣 名詞,固有名詞,人名,一般,*,*,大杉漣,オオスギレン,オースギレン
さん 名詞,接尾,人名,*,*,*,さん,サン,サン
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
、 記号,読点,*,*,*,*,、,、,、
生前 名詞,副詞可能,*,*,*,*,生前,セイゼン,セイゼン
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
収録 名詞,サ変接続,*,*,*,*,収録,シュウロク,シューロク
参加 名詞,サ変接続,*,*,*,*,参加,サンカ,サンカ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
日本テレビ 名詞,固有名詞,組織,*,*,*,日本テレビ,ニホンテレビ,ニホンテレビ
系 名詞,接尾,一般,*,*,*,系,ケイ,ケイ
ぐるぐるナインティナイン 名詞,固有名詞,一般,*,*,*,ぐるぐるナインティナイン,グルグルナインティナイン,グルグルナインティナイン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
名物 名詞,一般,*,*,*,*,名物,メイブツ,メイブツ
コーナー 名詞,一般,*,*,*,*,コーナー,コーナー,コーナー
グルメ 名詞,一般,*,*,*,*,グルメ,グルメ,グルメ
チキンレース 名詞,固有名詞,一般,*,*,*,チキンレース,チキンレース,チキンレース
・ 記号,一般,*,*,*,*,・,・,・
ゴチになります 名詞,固有名詞,一般,*,*,*,ゴチになります,ゴチニナリマス,ゴチニナリマス
! 記号,一般,*,*,*,*,!,!,!
2時間 名詞,固有名詞,一般,*,*,*,2時間,ニジカン,ニジカン
スペシャル 名詞,一般,*,*,*,*,スペシャル,スペシャル,スペシャル


ただのMecabと違い、neologdの方は急性心不全大杉漣ゴチになります
きちんと取れていることが分かると思います。


Mecabの準備が出来たので、先ほど取得したツイートから単語を取り出していきます。

import MeCab
import re

#neologd辞書を使う
tagger = MeCab.Tagger(' -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
tagger.parse('')

f = open('kiroku.txt', 'r')
lines = f.readlines() #realdlines()はリスト型を返す
f.close()

for line in lines:
    line = re.sub(r"[^ぁ-んァ-ン一-龥ー]","",line) #正規表現でひらがな・カタカナ・漢字・伸ばし棒以外を飛ばす
    node = tagger.parseToNode(line)
    while node:
        grammar = node.feature.split(",")[0]
        if grammar == "名詞":
            if not (re.search(r"[ぁ-んァ-ンー]",node.surface) and len(node.surface) <=3): #意味のないひらがな・カタカナ・伸ばし棒3文字以下 を飛ばす
                if not (re.search(r"[一-龥]",node.surface) and len(node.surface) <=2): #思い切って漢字2文字以下も吹っ飛ばす
                    f = open('m-kiroku.txt','a')
                    f.write(node.surface + " ")
                    f.close()
        node = node.next



こいつを走らせると、以下のようなスペース区切りのテキストが取得出来ます。


ヒナナミ 参加者募集 ボンボンポニー 北小金駅 駐車場 おすすめ りょうかい 
アメリカ 餓狼伝説スペシャル 発売日 年月日 ジャンル アーケード 格闘ゲーム 
コマンド 必殺技 ハイスペ ざいますううちのさんっ ある意味 幻獣契約クリプトラクト 
スマホゲーム エアコン 換気扇 トロロッソ ツイート イベント 法政大学 キャンパス 
キャリア センター センター 申し込み 水曜日のダウンタウン お父さん ゴチになります 
リプライ リプライ リプライ 前日比 フォロー 前日比 もっての外 ハンカチ ティッシュ 
大杉漣 急性心不全 バイプレーヤー スポニチアネックス ニュース 親日国 日本語 
自分たち リスタート フォロワー びっくり ハイテンション パラシュート パシュート 
金メダル 羽生結弦 サーァント ひとまず バーサーカー バーサーカー ガチヒント 
・・・

スペース区切りにした理由は、後述します。



STEP 3 結果を可視化する

STEP 2で無事データが取れたので、試しに集計してみましょう。

f = open('m-kiroku.txt', 'r')
wordlist = f.read().split(" ") #スペースでsplitしてlist化する
f.close()

setlist = set(wordlist) #ソート用の要素の重複なしの集合
sumdict = {} #集計用の辞書
for word in setlist:
    sumdict[word] = wordlist.count(word)

sortlist = sorted(sumdict.items(),key=lambda x:x[1],reverse=True) #降順にソート

print(sortlist)



もっといい書き方があるかと思いますが、とりあえずこれで集計すると・・・

[('フォロー', 431), ('大杉漣', 364), ('カーリング', 303), ('配信中', 300), ('ツイート', 238), ('大丈夫', 220), 
('パシュート', 196), ('参加者募集', 189), ('イベント', 187), ('よろしくお願いします', 181), ('質問箱', 164), 
('ボンボンポニー', 152), ('金メダル', 151), ('フォロワー', 125), ('たくさん', 120), ('アカウント', 113), 
('ショック', 106), ('めちゃくちゃ', 105), ('バイプレイヤーズ', 103), ('準決勝進出', 98), 
('ドラゴンボールドッカンバトル', 97), ('スウェーデン', 96), ('びっくり', 93), ('オリンピック', 90), 
('プレゼント', 87), ('アメリカ', 87), ('相互フォロー', 86), ('ニュース', 82), ('とんでも', 82), ('誕生日', 79), 
('前日比', 77), ('久しぶり', 76), ('コメント', 75), ('じゃなくて', 73), ('体育祭', 70), ('ハプニング', 69), 
('ご冥福をお祈りします', 66), ('メンバー', 66), ('わからん', 64), ('イメージ', 64), ('フォロバ', 61), 
('アイドル', 60), ('チェック', 59), ('いろはす', 58), ('好きな人', 55), ('準決勝', 55), ('世界一', 55), 
('開催中', 54), ('イタズラ', 52), ('ありません', 52), ('イケメン', 51), ('イラスト', 50), ('リツイート', 49), 
('魔人ブウ', 49), ('特別編', 49), ('テンション', 49), ('ブロック', 48), ('モンハン', 48), ('アイコン', 48), 
('ガンダム', 48), ('コンビニ', 47), ('可能性', 46), ('チャンス', 46), ('お知らせ', 45), ('リプライ', 45), 
('雰囲気', 43), ('おすすめ', 43), ('キャンペーン', 42), ('ランキング', 42), ('ごめんね', 42), ('お買い得', 41), 
('シリーズ', 41), ('リラックス', 41), ('事前登録', 40), ('デビュー', 40), ('マラソン', 40), ('チケット', 39), 
('対象商品', 39), ('デザイン', 38), ('真面目', 38), ('バレンタイン', 38), ('ポイント', 38), ('めちゃめちゃ', 37), 
('拡散希望', 37), ('あるある', 37), ('日本人', 36), ('カラオケ', 36), ('クーポン', 36), ('ーーーー', 36), ('北海道', 36), 
('インスタ', 34), ('初心者', 34), ('ポケモン', 34), ('おっぱい', 34), ('サービス', 34), ('メッセージ', 33), 
('グループ', 33), ('インタビュー', 32), ('ツイッター', 31), ('個人的', 31), ('いっぱい', 31), ('ラーメン', 31), 
('乃木坂', 30), ('モンスト', 30), ('名古屋', 30), ('スピードスケート', 30), ('ストレス', 29)...以下省略....

みたいな感じで集計結果が出ます。
大杉漣さんが亡くなったことに関するツイートや、オリンピック関係のツイートが目立ちますね。
やはりTwitter上では、リアルタイムの出来事を色濃く反映したものがよくつぶやかれているようです。




さて、単純に結果を表示するだけではつまらないので、
前の記事でも使ったword cloud化するライブラリを使って、
ツイッターのアイコンの鳥さんをカラフルにしたいと思います。

word clouds in Python — wordcloud 1.3 documentation

もともと、英語の文章をWordCloud化するために作られていますので、
スペース区切りで単語を拾って行く仕組みになっているようです。
そのため、STEP 2では後々扱いやすいように単語をスペース区切りのテキストにしておきました。
では、さっそくやっていきます。


f:id:pypytestes:20180222234202p:plain
この子に色をつけていきます。


from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

from wordcloud import WordCloud

d = path.dirname(__file__)

# 抽出元のテキストを指定
text = open(path.join(d, 'm-kiroku.txt')).read()

# WordCloudにするイメージを指定
birdmask = np.array(Image.open(path.join(d, "Twitter_logo.png")))

#フォントを指定
fpath = "/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc"

#いろいろパラメーターの設定が出来るっぽい
wc = WordCloud(background_color="white", max_words=2000, mask=birdmask,
               font_path=fpath)

# WordCloudをジェネレートする
wc.generate(text)

# ファイルに保存
wc.to_file(path.join(d, "TweetCloud.png"))

# 表示
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.figure()
plt.imshow(birdmask, cmap=plt.cm.gray, interpolation='bilinear')
plt.axis("off")
plt.show()

パラメーターとか細かく設定出来るようですが、公式ページのExamplesのコードを参考に必要最低限設定します。



出来上がった TweetCloud.png を開いてみましょう・・・

f:id:pypytestes:20180222235449p:plain


けっこう、上手いこといきました。
結果を数字だけで羅列しても味気ないですが、WordCloud化するとパッと見でどんな言葉がよく使われているかよくわかりますね。



ただ、listのcountメソッドで数えたものと比較してみると、
上手く反映されていない部分もあるみたいです。
例えば、「ツイート」という言葉は先ほどcountメソッドで数えた時は、431回と一番多かったはずなのに、4~5番目くらいの大きさになってしまっています。
よくよく見てみると小さい文字の「フォロー」が何個か出てきているようなので、何かが原因で分割されているっぽいです。
ほかのカタカナ語も何個かに分割されてしまっているものがあるようなのですが、原因がわかりません。
詳しい方おりましたら、ぜひ原因を教えてください。






ちなみに、バレンタインデー前日はこんな感じでした。 f:id:pypytestes:20180223003904p:plain



参考にした書籍

gihyo.jp この1冊のみです。
今回使ったコードもこの書籍のサンプルコードを参考にさせてもらっています。
Unixコマンドの使い方から詳しく解説してくれいるので、Pythonでクローリング・スクレイピングしたい人の入門書として非常に適しているのではないかと思います。ただ、クローリング先のWebサイトの変更等で動作しないコードがあるので注意が必要です。






おわりに


けっこう長めの記事になっちゃいました。
今流行りの機械学習、というかWebデータの収集・解析の勉強中なので、自分用の備忘録がてら書きました。本職の人が見たら残念コードが多々あったかもしれませんが、ご容赦を(._.)
ここはこうした方がいいんじゃないの?とか、このやり方はイケてないぜみたいなところがあればコメント残してもらえれば嬉しいです。

イタリアのんびりぼっち旅  -ローマ編-

昔のデータを整理していたら、写真がいっぱい出てきたので。

ちょっと昔に、イタリア中をひとりぼっちでふらふら旅した時の記録です。

ヴェネチアの仮面カーニバルと、ピエンツァのオルチャ渓谷がどうしても見たかったのでイタリアへ。

 

 

旅程は

ローマ(バチカン) -> フィレンツェ -> ヴェネチア -> シエナ -> ピエンツァ -> モンテプルチャーノ -> バーリ -> アルベロベッロ -> マテーラ -> ローマ

でした。

 

 

全くノープランで行ったので、結局ローマに1週間くらい滞在していました。

1ヶ月日程を取っていたので、もっといろいろ回れたかもですが、基本のんびり旅が好きなのでこれはこれで良かったです。

 

当時のこと思い出しながら書くので、今の状況とは違うところがあるかもです。 

 

旅のはじめはローマから。

 

 

 

f:id:pypytestes:20180218205207j:plain

f:id:pypytestes:20180218201953j:plain

石畳の街並み

どこの路地裏に入ってもおしゃれ。 

馬車とかも走ってる。

 

 

 

f:id:pypytestes:20180218183001j:plain

ローマのテルミニ駅


イタリア・ローマの玄関口であり、映画「終着駅」の舞台としても知られている。

空港や他の都市に行くときはこの駅から出発。

 

 

 

 

 

 

f:id:pypytestes:20180218195940j:plain

昼のサンタ マリア マッジョーレ大聖堂

f:id:pypytestes:20180218183612j:plain

夜の サンタ マリア マッジョーレ大聖堂


ローマの夜闇に怪しく浮かび上がる教会。異様な存在感を放っていた。

夜の教会は、人を魅了する不思議な力があると思います。

街のどの方向から見るかによって、全く異なった印象を持つ不思議な建物でした。

 

 

 

 

 

 

 

 

 

f:id:pypytestes:20180218184431j:plain

f:id:pypytestes:20180218200518j:plain

サン・ピエトロ大聖堂



全世界に12億人以上の信徒の総本山。

 

 

f:id:pypytestes:20180218201627j:plain

パパ・フランシスコと会える日

2回目に行った時は綺麗に晴れました。

ちなみに、パパが来る日はこんなに人でいっぱいです。 

 

 

 

 

 

f:id:pypytestes:20180218184827j:plain

遠くから見たコロッセオ

晴れるとイタリアの空は、辛いこととか嫌なこととかどうでもよくなるくらい青く澄み渡る。

 

 

 

 

 

f:id:pypytestes:20180218202606j:plain

テルミ二駅近くのボルケッタが美味しいお店

お店のおじさんがいい人でした。

美味しい豚の丸焼きポルケッタのパニーノ(サンドイッチ)が食べられます。

気に入って、ローマ滞在時何回か行きました。

 

 

 

 

 

 

f:id:pypytestes:20180218185529j:plain

子どもたちのパレード

街中でいきなり子どもたちの仮装パレードが始まった。

色鮮やかな紙吹雪が舞い散り、大人たちも楽しそうに眺めていた。

幸せな国だなぁ。

 

 

 

 

 

 

f:id:pypytestes:20180218185803j:plain

f:id:pypytestes:20180218204942j:plain

ローマの外れの市場


見たことない野菜がいっぱい。

RPGの世界みたい。

歩き回ってるだけで幸せ。

 

 

 

 

 

f:id:pypytestes:20180218205425j:plain

f:id:pypytestes:20180218185948j:plain

ヴィットーリオの無名戦士を弔う墓

イタリア王国建国の父ヴィットーリオ・エマヌエーレ2世の偉業を讃える建物。

 

f:id:pypytestes:20180218200713j:plain

屋上からはローマ市街を一望できた。



 

 

 

 

 

 

f:id:pypytestes:20180218204856j:plain

f:id:pypytestes:20180218205727j:plain

f:id:pypytestes:20180218204724j:plain

フォロ・ロマーノ



 

古代ローマ時代の遺跡。

とても大きな遺跡なのに、観光客が少なめでした。

かくれんぼしたら楽しそう。

 

 

 

 

f:id:pypytestes:20180218210333j:plain

お絵かき

地面に絵を描いてる人がいた。
 

 

 

 

 

 

 

 

f:id:pypytestes:20180218190645j:plain

宿の近くのスーパーでのチーズ攻撃

これぞ、イタリア。

どこのお店に行ってもチーズと生ハムとワインとパスタが死ぬほど売られている。

 

 

 

 

 

f:id:pypytestes:20180218190916j:plain

ローマ郊外にあるピラミッド

何故か、イタリアにもピラミッドがある。

エジプトよりお手軽。

 

 

 

f:id:pypytestes:20180218200906j:plain

ローマ市内をたくさん走っている小さい車

FIATパワーかローマ市内を走っている車はちっこいのが多かった。

こんなのがたくさん路地裏に止めてある。かわいい。

 

 

 

 

 

 

とりあえずローマだけ。 

 

ローマは見るものがたくさんあるので余裕で1週間くらい滞在出来ます。

しかし、田舎の方に比べるとあまり街の人たちが優しくありません。

田舎に行けば行くほど親切な人が多かった印象があります。

ただ、田舎よりも安宿が多いので食費を抑えれば割と長期で滞在出来そうでした。

 

ずっと泊まっていたゲストハウスも一泊10ユーロ弱くらいでしたが、とても清潔で便利な場所にあったので、連泊してまったり観光しているうちに、1週間くらい経ってて、「あかーん、そろそろ次の街行かな(・_・;」みたいなかんじでした。

 

本当にただの自己満足になっちゃいましたが、

気が向いたら写真整理してローマ編以外もアップしようかなと思います。

 

また行きたいなぁ。

 

 

Python初心者エンジニアにおすすめの機械学習プログラミングサービス

(WORD,COUNT)

('おすすめ', 36)

('エンジニア', 31)

('機械学習', 19)

('初心者', 14)

('Python', 14)

('サービス', 13)

('プログラミング', 13)

('はあちゅう', 10)

('日本人', 9)

('Google', 9)

('Web', 9)

('ベンチャー', 9)

('仮想通貨', 9)

('はてなブログ', 9)

('Linux', 8)

('IT', 8)

('株式会社', 7)

('Amazon', 7)

('メルカリ', 7)

('ヨッピー', 7)

('ランキング', 7)

('プログラマ', 7)

('人工知能', 7)

('Webサービス', 7)

('コードレビュー', 6)

('Go', 6)

('Rails', 6)

('おっさん', 6)

('AWS', 6)

('日本語', 6)

('デザイン', 6)

('システム', 6)

('Twitter', 6)

('AI', 6)

('弁護士', 6)

('脆弱性', 5)

('SQL', 5)

('Ruby', 5)

('セックス', 5)

('おじさん', 5)

('RaspberryPi', 5)

('オススメ', 5)

('フロントエンド', 5)

('YouTube', 5)

('リベラル', 5)

('民進党', 5)

('チェックリスト', 5)

('データベース', 5)

('発達障害', 4)

('営業マン', 4)

('被害者', 4)

('JavaScript', 4)

('加害者', 4)

('レビュー', 4)

('ユーザー', 4)

('OK', 4)

('Excel', 4)

('Mac', 4)

('CM', 4)

('ポイント', 4)

('コンテンツ', 4)

('時系列', 4)

('振り返り', 4)

('アフィリエイト', 4)

('パソコン', 4)

('ディープラーニング', 4)

 

 

・・・省略・・・

 

 

('この先生きのこるには', 1)

('Cookpad', 1)

('会社設立', 1)

('必要性', 1)

('ダイアトニック', 1)

('受信料', 1)

('LINEBot', 1)

 

 

はい。

ごめんなさい、タイトルと内容は全く関係ないものです。

この記事の本当のタイトルは

「今、はてなブックマーク数を稼ぎやすいブログのタイトルは?

あたりになるでしょうか。

 

上のタプルの羅列は

今週のはてなブログランキング〔2018年2月第2週〕 - 週刊はてなブログ

から約1年間分(2017年3月第2週分まで)をだーっと遡って頻出語をスクレイピングしたものです。

このうち上位7つを適当に繋げ合わせてそれっぽいタイトルにしてみました。

これやる前は、もっと面白いタイトルになるんじゃないかとワクワクしていたのですが、なんかそれっぽいタイトルになっちゃってがっかり。

 

やっぱり、人工知能ブームなんですねぇ

Pythonだけプログラミング言語の中で突出して出現率が高いようです。

今回のスクレイピングもゴリゴリPythonを使っております。

ざっくり今回用いた方法を書くと、

Scrapy を使って、週刊はてなブログのブクマ数ランキングのページをスタートページにして、再帰的に週ごとのページをクローリングしてタイトルを取得。

その後、ipadic-neologd でブーストしたmecab を使って形態素解析

正規表現使って記号とか飛ばしたり、あまり意味のない3文字以下のひらがな・カタカナや漢字2字以下のものを吹っ飛ばしたり、名詞と動詞以外の品詞を削ぎ落としたり・・・などなどの調整を行い

最後に出現頻度でソートして完成です。

ちなみに、こちらの本を参考に作業を行いました。

 

 ※なお、私はプログラミングに関してズブの素人さんですので、本職の方から見たら大変イケてない方法を使ってるかもですが、大目に見てやってください。

 

 おまけ

f:id:pypytestes:20180217221745p:plain

 

word clouds in Python — wordcloud 1.3 documentation

こちらのライブラリを使って、単語の出現頻度を可視化(Word Cloud化)してみました。

一枚絵でパッと見れるとなんかいい感じですね。

後日、気が向いたら今回の作業の詳しいやり方について加筆するかもです。