はてなキーワードAPIを使って特徴語抽出
ツイートを形態素解析してカテゴリ分類したい! ということで、簡易的に特徴語のカテゴリを得る方法を考えます。
トピックモデルとかそれらしいアルゴリズムを使うのが本筋かもしれませんが、もっと単純に「芸能ジャンルの単語が多いから芸能ジャンルのツイート」みたいなのでいいんですよね。量も多くないし(1時間最大100ツイート)。
ということで、はてなキーワード自動リンクAPIを使って、文章中のワードのカテゴリを調べていきます。
はてなキーワード自動リンクAPIとは
はてなの記事って、それっぽい語句に勝手にリンクが張られてますよね。はてなキーワード自動リンクAPIは、文章を与えると、そのようなリンクを自動で生成してくれるAPIです。
詳細:はてなキーワードAPI - Hatena Developer Center
いわゆるリンクを生成するだけでなく、リンクを張るべき単語をxml形式で返してくることもできます。今回はこちらを使います。
(はてなキーワードAPIはカテゴリを返してくれないので今回は使えません)
目標
ツイート中に含まれる名詞とそのカテゴリを得る
コード(Java)
XML-RPC APIという、ブログサービスによくあるAPIに対応しているということで、XML-RPCのライブラリを使います。ws-xmlrpc - Apache XML-RPCからダウンロードして解凍、lib以下のjarファイルをライブラリに追加します。私の場合は以下を追加。
commons-logging-1.1.jar
ws-commons-util-1.0.2.jar
xmlrpc-client-3.1.3.jar
xmlrpc-common-3.1.3.jar
xmlrpc-server-3.1.3.jar
コード参考:XML-RPC してみる - bluepapa32’s Java Blog
String text = "解析したい文章"; // URL設定 XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL("http://d.hatena.ne.jp/xmlrpc")); // XmlRpcClient生成 XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); // パラメータ設定 Map<Object, Object> params = new HashMap<Object, Object>(); params.put("body", text); // 解析したい文章 params.put("mode", "lite"); // 省略するとリンクタグ付きの文章が返ってくるモードに params.put("score", 10); // キーワードのスコア(詳細不明。閾値を設定しておくとどうでもいい語が返ってくることがなくなる気がする) HashMap<Object, Object> result = (HashMap)client.execute("hatena.setKeywordLink", new Object[]{params}); Object[] wordlist = (Object[]) result.get("wordlist"); for(Object word:wordlist){ System.out.println(word); }
textに
を入れると、以下のような出力結果になります。{refcount=7, score=61, word=はてなキーワード, cname=hatena} {refcount=79, score=69, word=プリキュア, cname=anime} {refcount=78, score=69, word=プリキュア, cname=science} {refcount=36, score=22, word=サイエンス, cname=science} {refcount=1062, score=24, word=アニメ, cname=anime} {refcount=2, score=28, word=bit.ly, cname=web}
できた!ヽ(゚∀゚)ノ
あとは適当に計算式を立ててカテゴリを決めれば超簡易カテゴリ分類になるでしょう。
ちなみに、はてなキーワードのカテゴリははてなキーワード - 話題の言葉がわかる、みんなで編集するキーワードの下部にある20種類です。
wikiのデータを使ったカテゴリ分類も試したのでまたそのうち。
Python→MySQL nullの挿入
Pythonって区切り文字の扱いがとっても簡単でいいですね。どんどんタプルにつっこみたくなります。そのままPreparedStatement的な役割を果たすexecutemanyなる関数で大量に挿入できるのもありがたい!
で,Python→MySQLでexecutemanyを使ってNULLを入れるときに少し詰まったのでメモ。
データ例
名前 | 好きな教科(3〜4) |
---|---|
佐藤 | 国語,算数,理科,社会 |
鈴木 | 算数,理科,音楽 |
高橋 | 国語,理科,体育,音楽 |
データが4つとか3つで,空いたところをnullで埋めておきたい場合,Noneを使うと良い。
import MySQLdb db = MySQLdb.connect(host="*****.jp", user="user", passwd="pass", db="db", charset="utf8") c = db.cursor() cnt = 0 dataL = [] for line in open('../subject.txt', 'r'): itemL = line[:-1].split('\t') subjectL = itemL[1].split('.') if(len(subjectL)==4): # 要素が4つならそのまま tpl = (itemL[0], subjectL[0], subjectL[1], subjectL[2], subjectL[3]) dataL.append(tpl) elif(len(subjectL)==3): # 要素が3つなら最後をnullで埋める(DBカラムはnull可に設定済) tpl = (itemL[0], subjectL[0], subjectL[1], subjectL[2], None) dataL.append(tpl) c.executemany('insert ignore into Item (ItemID, Subject1, Subject2, Subject3, Subject4) values (%s, %s, %s, %s, %s)', dataL) c.close() db.close()
できた!ヽ(゚∀゚)ノ
Python覚え書き,MySQL接続など
とあるデータ解析を共同研究という形でやっており,Python勉強中です。
EclipseにPyDevを入れていつもの環境で手探りコーディング。
MySQL接続時に若干ハマったのでメモ。
MySQLとの接続
適したMySQL-PythonモジュールをDL,インストール
import MySQLdb db = MySQLdb.connect(host="*****.jp", user="user", passwd="pass", db="db", charset="utf8") c = db.cursor() c.execute("show tables") # 接続テスト
ImportError!
参考:PythonでImportError: No module namedに遭遇した。 - Last Modified
(Eclipse→Preferences→PyDev→Interpreter - Python→System PYTHONPATHを確認したら,Pythonをインストールしたフォルダではないところばかり参照されていた(今まで普通に使えていたのは何故?w)ので,適切なpython.exeの登録からやり直し)
the sets module is deprecated!
参考:import MySQLdb : 技術メモ
動いた!ヽ(゚∀゚)ノ
よく使うviコマンド備忘録
情報系ならviの一つや二つ使えなくては,ということでやってます。そもそも普段はJavaしか使わないため必然的にEclipseユーザ,viなんて使う機会がなかったのです。というのは言い訳ですが。今回,運営中のサービスのphpをどどんと修正するためにviを使いました。
最初はそれこそ「文字が入力できない!?」レベルでしたが,5日ほど毎日やってればさすがに覚えてくるものですね。でもまたしばらく使わなくなりそうなので,今回覚えたことを記録しておきます。ググればいくらでも出てくるけど
基本作法
- i 文字入力モードへの切り替え
- ESC コマンドモードへの切り替え
コマンドモード
- :q! 変更せず終了
- :qw 変更を保存して終了(wqの方がいいとかあるのかな)
- yy カーソル行をコピー
- y10G ファイルの10行目からカーソル行までをコピー
- p ペースト
- 10G ファイルの10行目へジャンプ
- dd カーソル行を削除
- 10dd カーソル行から10行削除
- Ctrl+F 1画面分下へ
- Ctrl+B 1画面分上へ
- u 元に戻す
- . 繰り返す
他にも便利なコマンドは大量にあるようなのですが,とりあえずこれを覚えるだけで簡単な開発には十分でした。
参考:http://net-newbie.com/linux/commands/vi.html
(UNIXというカテゴリにしてみたけど,サーバ関連のことを書くことが今後どれだけあるだろうか……?)
新しい季節の始まりには新しい日課を
始めるべきかと思い,ブログを作成してみました。
現在M1,明日からM2に上がる情報系女子です。来春からはWEBエンジニアになります。
IT系エンジニアといえばトライアンドエラーを記録したエンジニアブログ!
エンジニアブログといえばはてなダイアリー!
そんな気がしたのではてなです。
何か価値のあることを残していければなと思います。
よろしくお願いします〜。