LoginSignup
7
7

More than 5 years have passed since last update.

自分のブラウザ履歴からQiitaのWordCloudを作ってみる

Posted at

qiita.png

こんな感じの Word Cloud を作ってみました。
単にブラウザ履歴から qiita.com のタイトルだけを抜き出し、そのタイトルを Mecab で分割、名詞だけを Word Cloud化して僕が興味を持っている分野、調べた分野などを可視化しました。自分の履歴を可視化してなかなか興味深かったので、皆様も是非試してみてください。

可視化のための Word Cloud ライブラリとして https://github.com/amueller/word_cloud を。形態素解析は Mecab を Python3で形態素解析エンジンMeCabを使えるようにする(2016年3月版) を参考に用意。

ブラウザ履歴は、MacOSなら Safari が ~/Library/Safari/History.db に、Chrome が ~/Library/Application\ Support/Google/Chrome/Default/History にあるので、それぞれコピーして以下のスクリプトと同じところへ。コピーせずこのpathを直接 db のpathに指定しても、読み込みエラーで読めなかったりするので、操作で db 破損のリスクも考えてコピーしておくのが無難です。

さて、ブラウザ履歴からQiitaのWordCloudを作るスクリプトは以下のようになります。

import sqlite3
from enum import Enum
import MeCab
from wordcloud import WordCloud

# dbは元をコピーして使う
# Safari History
# => ~/Library/Safari/History.db
# Chrome History
# => ~/Library/Application\ Support/Google/Chrome/Default/History
SAFARI_HISTORY = 'History.db'
CHROME_HISTORY = 'History'


class Browser(Enum):
    Safari = 1
    Chrome = 2


MECAB = MeCab.Tagger('-Ochasen')
MECAB.parse('') # 開放されないように
def get_nouns(text):
    nouns = []
    node = MECAB.parseToNode(text)
    while node:
        if '名詞' in node.feature:
            nouns.append(node.surface)
        node = node.next
        if node is None:
            break
    return nouns


def get_db_config(browser):
    if browser == Browser.Safari:
        dbname = SAFARI_HISTORY
        sql = 'select v.title from history_items i join history_visits v on v.history_item = i.id and i.url like "http://qiita.com%"  group by i.url'
    elif browser == Browser.Chrome:
        dbname = CHROME_HISTORY
        sql = 'select u.title from urls u where u.url like "http://qiita.com%" group by u.url'
    else:
        raise ValueError('invalid argument')
    return (dbname, sql)


def get_qiitas(browser):
    qiitas = []
    (dbname, sql) = get_db_config(browser)
    for row in sqlite3.connect(dbname).cursor().execute(sql):
        if row[0]:
            qiitas.append(row[0].strip())
    return qiitas


def create_wordcloud(text, output):
    fpath = '/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc'
    stop_words = ['こと', 'これ', 'ため', 'とき', 'よう']
    wordcloud = WordCloud(background_color='white', font_path=fpath, width=900, height=500,
                          stopwords=set(stop_words)).generate(text)
    wordcloud.to_file(output)


def main():
    qiita_nouns = []
    for browser in [Browser.Chrome, Browser.Safari, ]:
        for title in get_qiitas(browser):
            qiita_nouns.extend(get_nouns(title))
    create_wordcloud(','.join(qiita_nouns), 'qiita.png')


if __name__ == '__main__':
    main()

こんな感じになりました。
Safari も Chrome も履歴は sqlite3 で保存されているので、適当にデータを引っ張り出しています。残念なことに schema が両者ぜんぜん違うので sql は別にする必要があります。
また、Qiita の記事のタイトルの最後には必ず "Qiita" という文字列が含まれてしまうため、Word Cloud で Qiita が非常に強く表示されてしまうので stop_words に小文字で "qiita" と追加してやれば取り除くことが出来ます。個人的には Qiita とはっきりわかるので残しています。

繰り返しになりますが、自分の履歴を可視化してなかなか興味深かったので、皆様も是非試してみてください!

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7