Shogo's Blog

Dec 16, 2012 - 1 minute read - NLP LaTeX

TinySegmenterをLaTeXに移植してみた

この記事はTeX & LaTeX Advent Calendarの傘下記事です. 15日はk16.shikanoさんの「TeX がむかついたので実装したけど挫折してる話」, 17日は@egtraさんの「LCDF TypetoolsでOpenTypeフォントを使う(DVIPDFMXで)」です. neruko3114が参加しているのを見てなんだか楽しそうだったで参加してみました. とはいってもネタも思いつかなったので,過去に作ったものをTeXに移植してみました. ターゲットはTinySegmenter. 以前作ったTinySegmenterMakerでLaTeXを出力できるようになったよ! 使ってみる TinySegmenterMakerのレポジトリをダウンロードするなりgit cloneするなりして 落としてきます. レポジトリに入っているのはモデルファイルとスクリプトだけです. これらを使ってTeXのスタイルファイルを作ります. $ cd /path/to/TinySegmenterMaker/ $ ./maker tex < RWCP.model カレントディレクトリにtinysegmenter.styができます. TeX から見えるところにおいておきましょう. これを使うソースコードは次のようになります. \documentclass{jarticle} \usepackage{tinysegmenter} \begin{document} \TinySegmenter{-}{私の名前は中野です} \end{document} platexで処理するとこんな感じに表示されるはず. 私-の-名前-は-中野-です 仕組み TinySegmeneterは元の文章の一部を切り取ってハッシュに入れる動作をしている. でも,LaTeXにはハッシュみたいなデータ構造がないのでコントロールシーケンスで代用. \@ifundefinedで有無を確認し,\csname\endcsnameで置き換え. コントロールシーケンスの一部に日本語を使わないといけないので,日本語LaTeX環境でしか動かない. ただ,一部句点などの扱いが違う?よくわからない. あとは,文字種の取得が必要なんだけど,ここでも同じことをしてます. すべてのアルファベット・ひらがな・カタカナ・数字について,その文字種をベタ書き. それ以外は全部漢字扱い. そのため,それ以外の文字を使うとオリジナルとは違う結果になるかも. 最後は足し算.これはカウンタを使えば簡単ですね. 応用編 TinySegmenterMakerでは自由にモデルを差し替えることができます. 以前JavaScript版のTinySegmenterを使って, 聞こえますか…自動生成…してみた…よ… ということをしてみました. LaTeXだってできるはず. 聞こえますか… に心に呼びかけるためのモデルファイルが含まれています. これをダウンロードして読み込ませます. $ ./maker tex < model これを自分のドキュメントに読み込ませてみます. \documentclass{jarticle} \usepackage{tinysegmenter} \begin{document} (…\TinySegmenter{…}{聞こえますか聞こえますかあなたの心に直接語りかけています}…) \end{document} 私の声が聞こえましたか・・・?

Dec 15, 2012 - 1 minute read - NLP MeCab Python

MeCabをPythonから使う注意点とか

日本語の文章をコンピュータで色々いじるときに, 必ずと言っていいほどよく使うのが形態素解析器. スペースなどの明示的な区切りの無い日本語を単語に分割してくれるツールです. 中でもMeCabが非常に有名で,さまざまなところで使われています. MeCabはいろいろな言語から呼び出すことができます. 自然言語処理の分野ではPythonが人気のようですね.僕も使っています. しかし,MeCabをPythonから使う場合,注意する点がいくつかあります. そこにハマっている後輩を見かけたので,文章として残しておくことにします. Python2系が対象です(3系はよくわからない). 注意するのは以下の二点です. MeCabに渡す文字列はencode,戻ってきた文字列はdecodeする MeCabに渡した文字列は必ず変数に入れておく EncodeとDecode Python2系の文字列には,バイト列として扱われる文字列(str)と,Unicodeで表現された文字列(unicode)があります. 日本語を扱う場合,strだといろいろ問題があるので,特に理由がなければunicodeを使うべきです. しかし,MeCabはstrしか受け付けません. そこでMeCabに渡す直前・直後でencode・decodeするようにします. import MeCab tagger = MeCab.tagger('-Owakati') text = u'MeCabで遊んでみよう!' result = tagger.parse(text) # エラー! encoded_text = text.encode('utf-8') # encodeが必要 encoded_result = tagger.parse(text) result = result.decode('utf-8') # 必ずdecode 'utf-8'の部分は辞書の文字コードに合わせて適宜書き換えてください. デフォルトはeuc-jpですが,utf-8の方が幸せになれると思います. 必ず変数に入れる 次にMeCabの作ったノードに直接アクセスして,品詞情報などを取ってくることを考えます. 適当に書いてみるとこんな感じでしょうか. import MeCab tagger = MeCab.tagger('') text = u'MeCabで遊んでみよう!' node = tagger.parseToNode(text.encode('utf-8')) while node: #printはstrを渡す必要があるのでdecodeは不要 print node.surface + '\t' + node.feature node = node.

Dec 5, 2012 - 1 minute read -

聞こえますか…自動生成…してみた…よ…

聞こえますか…あなたの心に直接…で始まるこのテンプレート. 誰かが「文章入力したら…を自動で入れてくれるのないかな」って呟いてたのでつくってみた. サクッと作成 TinySegmenterで単語分割, ランダムに…を単語の間に挿入して出力してみた. 聞こえますか… この程度なら数十分あれば作れますね. 挿入位置を学習してみる さて,実際やってみるとちょっと挿入位置が不自然な気がします. 世の中に出回っているツイートでは単語間ではなく文節の間に挿入しているのが多いように見えます. しかし,TinySegmenterは品詞情報をつけてはくれないので文節の判定は少し面倒ですね. ・・・待てよ・・・このテンプレートを使ったツイートなんて大量に手に入る・・・これから学習すればいいんじゃね? はい,やってみましょう. ツイートを集める Twitter APIを使ってテンプレートを使っているようなツイートを拾ってきます. ** 「聞こえますか OR きこえますか -RT」** で検索してみました. 普段Twitter APIを叩くときはTweepyを使っているのですが,これで検索するとあまり古いツイートは取れません. API 1.1 を使うと古いツイートも取ってこれるらしいので,強引にTweepyを書き換えて1.1対応. ** 72,529ツイートの取得に成功しました. ** プログラムについてはTweepyの書き換えでゴチャゴチャしているのでまた今度. TinySegmenterMakerに放り込む カッコで囲まれている部分を抽出,点々を空白に置換,パクリツイッタラー消去などの処理をした後, TinySegmentermakerに放り込みます. 実際に学習に使ったツイートは49,573ツイートです. 10000回の繰り返しで,学習結果は以下のようになりました. Result: Accuracy: 94.794% (3466578/3656961) Precision: 90.9504% (526277/578642) Recall: 79.2234% (526277/664295) System/Answer p/p p/n n/p n/n: 526277 52365 138018 2940301 約95%の精度という非常に高い性能を示してくれましたが, 区切るところ(p)よりも区切らないところ(n)のほうが多いためですね. Recallが8割しかありませんが,人によるばらつきが大きそうなので,まあこんなもんでしょう. 学習が終わったら最後にオリジナルのTinySegmenterを学習後のもので置き換えるだけ. チェックボックスで単語分割とツイートの学習結果,どちらを使うか選択できます. なんだかそれっぽくなりましたかね・・・? 元ネタについて ところでこのテンプレートの元ネタについて調査している方がいらっしゃるようです. 「聞こえますか…心に直接…」のオリジナル検証 ゲームが元ネタだ,っていう人を時々見かけたけど, 検証してみると微妙に内容が違うらしい. もちろん影響は受けているんだろうけどね. マンガとかゲームで始めて心に直接語りかけたのって何なんだろう?

Nov 24, 2012 - 4 minute read - Android Twitter

OAuthの認証にWebViewを使うのはやめよう

AndroidからTwitterへアクセスするためのライブラリとして,Twitter4Jが有名です. これを使ってみようと,「Android Twitter4J」と検索すると 認証にWebViewを使った例がたくさん出てきます. ・・・いや,ちょっとまて. それはちょっとまずいだろう. そういうわけでもうちょっと賢い方法を探してみました. 何がまずいのさ 「Android Twitter4J」と検索すると,上位にこんなページが出てきます. Twitter4jを使ってOAuth認証をアプリ内で行う方法 Twitter4j-2.2.xを使ったOAuth認証のコーディング例 twitter4jでツイートする Android+Twitter4JでOAuthするためのソースコード 上のサイトでは次の様は方法をとっています. アプリ内にWebViewを貼り付け WebViewでTwitterの認証画面を表示 onPageStarted や onPageFinished をオーバーライドして callback URL へのアクセスを検出 URL に入っている認証コードで認証 アプリ内でWebViewを使うとURLが表示されません. つまり ** 本当にツイッターにアクセスしているかわからない ** のです. もし,表示されるのが偽の認証画面だったら,アプリから簡単にパスワードがわかってしまいます. じゃあ,URL を表示させればいいかというとそういうわけでもありません. 画面上のURL表示なんて簡単に偽装できてしまいます. どんな工夫をしても ** アプリがパスワードの要求をしていることには変わりありません ** . アプリはパスワードを簡単に取得できます. アプリのユーザはTwitterに限らずSNSへのログイン時にブラウザを開かないアプリは信用しないようにしましょう. どこかでパスワードの抜かれている可能性があります. (ただし,公式アプリは除く.公式アプリが信用できないならそもそもサービスを利用できないもんね.) じゃあどうするのさ じゃあ,開発者はどうするのかって話ですが,もう少し詳しく検索してみましょう. 他の方法を使っているページもでてきます. PINコードを利用 TwitterでPIN番号認証を行う Intent Fileterを利用しコールバック twitter4jを使用したAndroid Twitterアプリケーション作成 Twitter4Jを使ってAndroidアプリでStreamingAPIのUserTimelineを取得する TwitterでOAuth認証を行う Twitterへのアプリケーション登録 Twitterの認証ページをブラウザで開く Access Tokenを取得する PIN コードを利用 一つ目の方法はPC版クライアントでよく使われる方法. 認証後にPINコードと呼ばれる数字が表示されるので,それをアプリに入力します. twiccaなんかでも使われてますね. Twitter へのアプリケーション登録のときにコールバックURLを入力しないとこの認証方式になります. 認証画面に,ブラウザを開くボタン,PINコードの入力ボックス,ログインボタンを用意しておきます. <?xml version="1.0" encoding="utf-8"?

Nov 23, 2012 - 2 minute read - NLP

TinySegmenterの学習ツールを作ってみた

TinySegmenterは工藤さん作のJavaScriptだけで書かれたコンパクトな分かち書きソフトウェアです. わずか20kバイト程度のサイズしかなく,お手軽に使える分かち書きソフトウェアですが, 当たり前のことながら学習データに使った新聞記事以外の文章の精度はイマイチ. 改善しようにも学習用のプログラムが公開されていないのでモデルの修正が大変です. ないなら作ってしまいましょう! ダウンロード ソースはgithubで公開しています.cloneするなりzipファイルを落としてくるなりしてください. TinySegmenterMaker 学習方法 スペースで分かち書きしたコーパスをあらかじめ準備しておきます. コーパスから分かち書きの情報と素性を取り出します. $ ./extract < corpus.txt > features.txt AdaBoostを用いて学習します. 新しい弱分類器の分類精度が0.001以下,繰り返し回数が10000回以上となったら学習を終了します. $ g++ -O3 -o train train.cpp # コンパイル $ ./train -t 0.001 -n 10000 features.txt model # 学習 きちんと分割できるが実際に試してみます. $ ./segment model 私の名前は中野です 私 の 名前 は 中野 です ライブラリの作成 TinySegmenterは実装が簡単なためいろいろな言語へ移植されています. モデルの更新のたびにそれらへの言語の移植バージョンを作るのは大変です. というわけで,makerコマンドで各種言語用のライブラリを作れます. 学習結果のモデルはライブラリのなかに組み込まれ,ファイル単体で簡単に使用することができます. allを指定することで,対応しているすべての言語向けのライブラリを出力します. $ ./maker javascript < model $ ./maker perl < model $ ./maker ruby < medel $ .

Nov 9, 2012 - 1 minute read - 6さいカンファレンス

6さいカンファレンス 第9回「マスタリングの技法 ~音圧を上げよう~」まとめ

2012/11/8にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第9回は「マスタリングの技法 ~音圧を上げよう~」です。 勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 よるほー くいなちゃん: みなさん、自分が作った曲が、市販のCDの曲にくらべ、 音量が小さい (最大まで波形を上げたにも関わらず)と悩んだことはありませんか? くいなちゃん: しかし、心配はいりません。 今回のことを実践していただくと、 みなさんの曲も、市販の楽曲並みに、音圧をあげることができるですん! では次の波形をご覧ください。 くいなちゃん: http://kuina.tes.so/6saiconf_9/img0.png はい、さっき作った曲です。 いい曲ですね! しかし、なんだか音量が小さいですね… それでは、波形に注目してください。 この図では、波形が-1.0~1.0 の範囲で 示されていますが、この範囲に比べ、明らかに波形が小さいです。 余白が空きすぎです! くいなちゃん: え、mp3ファイルがどこにあるかって? キニシナイ! では、とりあえず、この波形を -1.0~1.0 まで拡大してみましょう。 http://kuina.tes.so/6saiconf_9/img1.png はい、赤い矢印で示されたところが、確かに-1.0~1.0 の範囲に到達していますね。 素人さんは、この状態で完成、と思うでしょう。 しかし、それではダメダメですん☆ くいなちゃん: なぜなら、緑の2本線で示された範囲がメインの波形であって、 そこから飛び出た いわゆる魚の骨は、音量を上げる邪魔をするものだからです。 この魚の骨さえなければ、もっと音量が上がるのに…そう考えてください。 くいなちゃん: 市販のCD の音楽なんかは、こんな波形をしています。 http://kuina.tes.so/6saiconf_9/img2.png これは、全体が波形で埋まった、いわゆる海苔みたいなことになっているので、 業界でもしばしば 海苔 と言われます。 ここまで来ると、相当 音量が大きく聞こえます。 波形のピークは、魚の骨と同じなんですけどね。 くいなちゃん: で、素人さんは、この状態にしようと、魚の骨を無視して、 波形のレベルを上げるわけです。 しかし、これには問題があるのです。 くいなちゃん: http://kuina.tes.so/6saiconf_9/img3.png この図を見ればわかるのですが、青のラインが -1.0 ~ 1.0 の範囲をしめしています。 で、無理やり波形を拡大すると、青のラインを超えた部分が潰されて、 右の波形のようなことになってしまいます。これは、元の波形から変わっているので、 当然音も変わります。大抵、ノイズが入った汚い音になってしまいますですー くいなちゃん: じゃあ、どうするのか。 それは、波形を潰すことなく、波形のピークを下げて -1.0 ~ 1.

Nov 6, 2012 - 2 minute read - Hadoop VirtualBox

VirtualBoxでHadoop環境を作ってみる

隣の人がHadoopいじって遊んでたので,自分もちょっとやっておこうかなと思い少し触ってみました. 実際にマシンを借りて大規模な計算をするのは大変なので, 仮想マシンを作って遊んでみました. 仮想Hadoop環境の構築 巷ではVMWareが人気だったりしますが,今回はVirtualBoxを使ってみたいと思います. なぜかというとVirtualBoxをコンソールから扱えるVagrantで遊んでいたので, ちょうどパソコンにインストールされていたから. 以下,VirtualBoxは既にインストールされているものとして話を進めます. Cloudera’s Hadoop Demo VM for CDH4に VMWare, KVM, VirtualBox用の各種イメージが置いてあるので, VirtualBox用のものをダウンロードしてきます. tar.gzで圧縮されているので解凍しましょう. 中にcloudera-demo-vm.vmdkというファイルが入ってます. VirtualBoxを起動してHadoop用のマシンを新規作成します. 設定は以下のとおりに デモイメージはCentOSベースらしいのでOSタイプとして RedHat**(64bit版)** を選択 メモリは3Gバイト以上 ハードディスクは後で設定するので,「起動ディスク」のチェックを外し割り当てしない 新規作成したら設定を少しいじります. IO APICが有効化されていることを確認 ストレージにcloudera-demo-vm.vmdkを追加.この時 IDEコントローラ の下にいれること. ネットワークアダプタをホストオンリーアダプタに設定 これで実行できるようになります. 遊んでみる せっかくなので少し遊んでみる事にします. イメージの置いてあったページにあるHadoop Tutorialをやってみましょう. Hadoopの例として必ず最初に出てくるであろう,Word Countです. まずソースコードを入力します. package org.myorg; import java.io.IOException; import java.util.*; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.*; import org.apache.hadoop.io.*; import org.apache.hadoop.mapred.*; import org.apache.hadoop.util.*; public class WordCount { public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { String line = value.

Nov 1, 2012 - 2 minute read - NLP CaboCha Python

PythonでCaboChaを美味しくいただく

日本語構文解析器CaboChaをPythonから使ってみたメモ. インストール CaboCha自体のインストールは公式のドキュメントを参照. ググれば他の人のレポートも出てくるはず. CaboChaのソースコードを展開したディレクトリの中の pythonディレクトリにPython-bindingが入ってます. そこに移動した後,管理者権限で以下のコマンドを実行すればインストール完了. python setup.py install 食べ方 解析結果を文字列出力 python/test.py に書いてあるとおり. #!/usr/bin/python # -*- coding: utf-8 -*- import CaboCha # c = CaboCha.Parser(""); c = CaboCha.Parser() sentence = "太郎はこの本を二郎を見た女性に渡した。" print c.parseToString(sentence) tree = c.parse(sentence) print tree.toString(CaboCha.FORMAT_TREE) print tree.toString(CaboCha.FORMAT_LATTICE) 以下のような結果が得られれば成功. <PERSON>太郎</PERSON>は-----------D この-D | 本を---D | 二郎を-D | 見た-D | 女性に-D 渡した。 EOS <PERSON>太郎</PERSON>は-----------D この-D | 本を---D | 二郎を-D | 見た-D | 女性に-D 渡した。 EOS * 0 6D 0/1 2.

Oct 28, 2012 - 1 minute read - togetter userscript

Togetterの編集作業便利にしたい

TogetterはTwitterの投稿をまとめられる非常に便利なサイトですが, 編集画面が異様に使いにくいです. そんなわけで前回は 自動的に検索ボタンを押してくれるブックマークレットを書いてみました. それをユーザスクリプトにして, ついでに編集画面の不便なところを修正してみました. 編集を便利にするユーザスクリプト スクリプトはGistにあげておきました. https://gist.github.com/3953476 インストールはこちら Chrome拡張Tampermonkey で動作を確認しました. この拡張,ユーザスクリプトの管理ができてオススメです. 変更内容 ユーザスクリプトは編集画面に対して次のような変更をします. 画面レイアウトの変更 自動検索機能 重複削除・ソートの高速化 選択動作の変更 元に戻す機能 ショートカットキーの追加 画面レイアウトの変更 Togetterの編集画面のレイアウト,非常に使いにくいです. ツイート一覧をスクロールしようとしたら画面全体がスクロールしてしまって, 編集用のボタンが隠れてしまう,ということが編集中に何度もあってイライラします. ** 余計なものでごちゃごちゃし過ぎなんだ! ** ** 僕は編集に集中したいんだ! ** 編集と関係の無いヘッダやナビゲーションは要らないので消えてもらうことにしました. ツイートの一覧が画面いっぱいに表示され, 編集用のボタンは常常に画面上に表示されます. 自動検索機能 前回ブックマークレットで実現した機能です. 検索キーワードと一回あたりの読み込み回数を設定し, 「自動検索開始」ボタンを押しましょう. すると,繰り返し間隔を聞いてくるので秒単位で時間を指定しましょう. カウントダウンが始まり,周期的に検索・ソート・重複削除が行われます. 重複削除.ソートの高速化 Togetterのソートのスピードはびっくりするほど遅いです. 例えば,「劇的ビフォーアフター佐世保高専ラグビー部部室をリフォーム」には 1190個のツイートが含まれています. これを時間順にソートしてみたところ, 三回の平均で9.978秒(それぞれの結果は10.118秒, 9.925秒, 9.892秒)かかりました. 1000ツイート程度のソートに約10秒です.遅い! ソート自体は数ミリ秒で終わるのになんでこんなに遅いというと,結果を画面に反映するのにjQueryのセレクタを大量に呼び出しているから. ソートのときに一回読み込んだものをキャッシュしておけばもっと速くなるはず. ってことで自前で実装してボタンを置き換えました. 結果0.171秒(0.174, 0.177, 0.161)まで短縮することができました. 約58倍の高速化! 高速化とは直接関係ないけど, 「選択したところだけソート」にしました. ツイートを内容ごとに分類してるときとかに, 一部分だけソートできます(例:ロボコン死亡かるた). 何も選択されてないときは何もしません. 全体をソートしたい時は明示的に全選択する必要があります. 重複削除とかも実装しなおしました. 約200ミリ秒かかってたのが約20ミリ秒に高速化! 選択動作の変更 もともとの編集画面では,ツイートをクリックするとクリックしたツイートの選択状態が切り替わります. 他に選択しているツイートがある場合,そのツイートは選択されたままです. Excelとかではセルをクリックすると他のセルは非選択状態になるので, それに慣れているとなんだか違和感があるんですよね. そういうわけで,ツイートをクリックしたときはクリックしたツイートのみ選択されるようにしました. 複数選択ができないのも困るので, Ctrlキーと同時クリックでクリックしたツイートを全部選択, Shiftキーと同時クリックで範囲内のツイートを全部選択にしました. Excelとかと一緒ですね.

Oct 27, 2012 - 2 minute read - 6さいカンファレンス

6さいカンファレンス 第7回「Windowsのアプリをクラックしよう!(再)」まとめ

2012/10/25にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第7回は「Windowsのアプリをクラックしよう!(再)」です。 第4回「Windowsのアプリをクラックしよう!」はどこへいってしまったのでしょう? 頑張って探したけどこれしか情報が無い・・・? 昨日の 6さいカンファレンスは盛り上がりましたね (第4回 「Windowsのアプリをクラックしよう!」) 来週は、作曲講座をしようと思っています。 お楽しみに☆ #6saiconf — くいなちゃんさん (@kuina_tesso) 9月 28, 2012 厳しい緘口令が敷かれているのか,参加者がくいなちゃんさんしか居なかったのか,そもそもそんなのなかったのか・・・. 勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 (カンファレンスの内容にはくいなちゃんライセンスが適用されるらしいです.怖!) —–キリトリセン—– くいなちゃん: 10/25(木) 21:00 から、第7回 6さいカンファレンスを開催します。 テーマは、「Windowsのアプリをクラックしよう!(再)」 です。 ** (再) と付いていますが、前回やった記憶はございません。 ** 参加されない方は、今のうちにご退場お願いします。 ROMでの参加も歓迎ですん☆ それでは、もうしばらくお待ちください。 くいなちゃん: それでは、第7回 6さいカンファレンスを開催します。 テーマは、「Windowsのアプリをクラックしよう!(再)」 ですん☆ しかし、これを開始する前に、いくつかの免責事項をお伝えしなければなりません。 (6さい的な事情) くいなちゃん: まず、実際に既存の Windowsアプリをクラックする、という流れで 話を進めていきますが、実際にクラックを行っているわけではなく、 また画像も合成です。 実際に既存のアプリに対してクラックする行為は、 場合によっては犯罪となりますので、** 決してマネしないでください **。 本講座は、犯罪を助長する意図があるわけではなく、 むしろ攻撃側を知ることで、防衛スキルを身に着けようというものです! マインスイーパ! くいなちゃん: はい、よろしいでしょうか。 では、本日クラックするアプリはこちらです! http://kuina.tes.so/6saiconf_7/img0.png くいなちゃん: みなさん大好きな、マインスイーパですん☆ くいなちゃんは、マインスイーパが得意ではないので、上級をクリアする頃には、 時間が999になってしまいます。 そこで、この時間が経過しないよう、改造することを今日の目標としましょう。 くいなちゃん: まず、ollydbg というフリーソフトを起動します。 これは、主に アプリをクラックするのに使われるソフトです[要出典] http://kuina.tes.so/6saiconf_7/img1.png 画像は、ollydbg 上でマインスイーパを起動したところです。