読者です 読者をやめる 読者になる 読者になる

StatsBeginner: 初学者の統計学習ノート

初学者が統計学、機械学習、R、Pythonの勉強の過程をメモっていくノート。

自分のEvernoteのタグ付け状況をデータで分析したい

SQL

Evernoteのタグ付けデータ

 色々なドキュメントをEvernoteに入れてまして*1、気づいたら1万数千のノートと千数百のタグを運用する状態になってました。


f:id:midnightseminar:20140817014411p:plain


 私はタグ付けには色々こだわりがありまして、「テキスト検索だけで十分」という(多数派の)意見には断固反対なのですが、ここではそのこだわりについては措いておきます。
 とにかく、タグの数はともかくとして、ノート数がこれだけ増えてくると、全体として各ノートに適切なタグが付けられているのか心配になってきます。タグづけルールが一貫してるかとか、同じような使い方をしてるタグが複数あって統合したほうがいいんじゃないかとかですね。


 で、ふと思いついて、EvernoteのノートIDとそれに付与されているタグIDの対応表があれば、なんかデータ分析とかできるのではなかろうかと。同じような使われ方をしてるタグを割り出したりできれば、Rの練習をする上でもなんか面白そうだなと。


 というわけで今日、データをつくってみました。ただ、いま大学院で書いてる論文の作業でやらないといけないことが色々あるので、今日はデータを取得するところまでしかやってません。あとで暇な時にいじってみます。
 
 

Evernoteのノート⇔タグ対応表をつくる

 とりあえず、あとで何かの役にたつかもしれないので、ノートとタグの対応表を得る方法だけメモしておきます。EvernoteのMac版アプリを使ってる場合の話です。
 ちなみにLang-8というサイト(リンク)で英作文指導をしてくれた外人さんが教えてくれたのですが(笑)、Evernoteは内部のデータベースにSQLiteを使っているので、SQLiteクライアントでデータの中身を直接みて、タグとノートの対応データをcsvとかで吐き出せばいいよと。
 Macだと、


 /Users/ユーザ名/Library/Application Support/Evernote/accounts/Evernote/Evernoteのアカウント名/


 という場所に「Evernote.sql」という名前でデータベースが保存されてるので、これを開きます。
 SQLiteのデータベースをみるのには、このアプリを使いました。
 Database Browser for SQLite | SourceForge.net


f:id:midnightseminar:20140816230234p:plain


 このように、テーブルは6個あるんですが、このうち「Z_12TAGS」というテーブルが、ノートIDとタグIDの対応表になってます。


f:id:midnightseminar:20140816230055p:plain


 で、「ZENATTRIBUTEDENTITY」というテーブルに、あらゆるマスタがまとめて入ってるっぽいです。ノート名称のマスタもタグ名称のマスタもここに入ってるんですよね。


f:id:midnightseminar:20140816225311p:plain


 「Z_PK」というフィールドに各種IDがぶちこまれてまして、ここにノートIDもタグIDもタテに並ぶかたちで入ってます。「Z_ENT」というフィールドが12になっているレコードがノート関係で、17になってるレコードがタグ関係です。ということを↓の記事を読んで知りました。
 mengwong - Direct access to the Evernote SQL database


 ずーっと右のほうにいくと「ZNAME2」というフィールドにタグ名称が入っていて、「ZTITLE」というフィールドにノート名称が入っています。
 なので、「Z_12TAGS」と「ZENATTRIBUTEDENTITY」という2つのテーブルだけあれば、ほしい情報は揃いますね。


 あとはSQLの命令を書いてテーブルを出力すればいいのですが、私はAccessとかもマウスでしか使ったことがなくw、SQLの初歩も理解してないので、うまいやり方が分かりませんでした。
 なんか、単にタグとノートのIDをキーにして「Z_12TAGS」のテーブルの横に「ZENATTRIBUTEDENTITY」から取ってきた「ZTITLE」と「ZNAME2」を表示させたいだけなんですが、

SELECT Z_12NOTES,ZTITLE, Z_17TAGS, ZNAME2
FROM Z_12TAGS LEFT JOIN ZENATTRIBUTEDENTITY
  ON Z_12TAGS.Z_17TAGS = ZENATTRIBUTEDENTITY.Z_PK
    OR Z_12TAGS.Z_12NOTES = ZENATTRIBUTEDENTITY.Z_PK


 とか、

SELECT Z_12NOTES,ZTITLE, Z_17TAGS, ZNAME2
FROM (Z_12TAGS LEFT JOIN ZENATTRIBUTEDENTITY
   ON Z_12TAGS.Z_17TAGS = ZENATTRIBUTEDENTITY.Z_PK)
      LEFT JOIN ZENATTRIBUTEDENTITY
      ON Z_12TAGS.Z_12NOTES = ZENATTRIBUTEDENTITY.Z_PK


 というふうにすると、「ZTITLE」を表示させる行と「ZNAME2」を表示される行が別々にできてしまって、レコード数が2倍になったんですよね。
 こんなふうに。


f:id:midnightseminar:20140816225414p:plain


 初歩の初歩から間違ってて、「SQL入門」みたいなサイトでも読めばすぐ解決するんだろうと思いますが、SQLの勉強はべつに優先度高くないのであと回しに……。あとで詳しそうな人にきこうかな。
 とりあえずタグ名とノート名を一緒に表示させるのはうまくできなかったので、↓のようにタグ名だけにしました。まあ、どのタグとどのタグが一緒に使われてるかみたいなデータを中心にみることになると思うので、べつにいいかなと。

SELECT Z_12NOTES, Z_17TAGS, ZNAME2
FROM   Z_12TAGS LEFT JOIN ZENATTRIBUTEDENTITY
   ON Z_12TAGS.Z_17TAGS = ZENATTRIBUTEDENTITY.Z_PK


 f:id:midnightseminar:20140816225447p:plain


 ちなみに、「ZENATTRIBUTEDENTITY」が1つのテーブルになってるせいなのかと思って、いったん「タグID⇔タグ名」「ノートID⇔ノート名」のマスタをつくってCSVで保存して再度読み込んでみたんですが、文字化けしたのでむかついてやめました。


 とりあえず、データは得られたので、あとでなんかやってみたいと思います。
 では、論文の作業に戻ります……。

*1:ただし、最悪漏洩した場合でも「まいっか」と思えるものだけクラウド(web上のEvernote)に上げており、より大事なデータはPCのEvernoteアプリのなかでオフラインノートブックとして管理してる。