こんな感じの 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 とはっきりわかるので残しています。
繰り返しになりますが、自分の履歴を可視化してなかなか興味深かったので、皆様も是非試してみてください!