思考ノイズ

無い知恵を絞りだす。無理はしない。

Chainerをつかった助詞の学習システムを作る (2)

続き

bython-chogo.hatenablog.com

前回は助詞を学習して、正しい助詞をSuggestするシステムを作りました。ただ、テストをしてみたところ正答率が50%超とちょっと微妙な正解率。はじめてにしてはよかったと思うけど、でも実用的には使えないです。目標としては90%越え、できれば95%といったところでしょうか。

とりあえずいろいろ試してみる

せっかくなので以下のように学習方法を変えてみて検証結果に変化が出るか確認をしてみることにしました。

  • 学習する記事の量を増やす (Double)
    前回は1日分の記事でしたが、とりあえず2日分入れてみるとどうなるでしょうか
  • 学習する前後の単語を増やす (15Words)
    前回は前後の10ワードずつ入れていましたが、15ワードに増やしてみるとどうなるでしょうか
  • 学習するモデルを変える (GRU)
    前回は本に書いてあるがまま、LSTMで試してみましたが、さらに本に書いてあるままにGRUモデルで変化がでるのかを試してみます。

基準として前回の学習内容を (Single) というラベルを張っています。

結果をどん

f:id:bython-chogo:20171011183315p:plain

  • Double: 最高で70%程度の正解率、やはり上がってますね
  • 15Words: こちらも同じく70%程度に上がっていて、効果がみられます
  • GRU: 正解率は Single と同程度ですが、学習を繰り返すとしり上がりによくなっている?
  • 全体を通して、学習は10~15 epoch内で終わってしまっていて、50までは不必要そうだが、微妙な変動で正解率に差がでている?

次は欲張って、全部組み合わせて正解率がどれくらい上がるのかみてみます。 学習する記事は4日分、前後15wordで、なんとなくGRUモデルで学習した検証結果が次のようになりました。

f:id:bython-chogo:20171011183323p:plain

比較はGRUの1日分の記事、10Wordです。最初の方の学習はすごくよく、80%弱ぐらいの正解率までいきます。が、繰り返すをするたびに、だんだんと正解率は低下、ついには GRU にも負けてしまうようになります。学習に1日半ついやしたのに。こりつが過学習というやつなのでしょうか。

以下がまとめたテーブルです。時間とかの数値は裏でいろいろ動かしていたので正確ではないのですが、ご参考までに。また、今回は Chainerに付属するCudaの計算機能を使ってみたのですが、比較として、CPU Onlyの時間も最後に入れています。条件は Single 相当です。

f:id:bython-chogo:20171011184756p:plain

まとめ

学習するサンプルを増やすことは成果はあるようですが、モデルとか回数とかのバランスが難しそうです。この学習に関していえば、正解か不正解かがすぐわかるので、ループさせれば半永久的に学習の追加ができます。 なので現在は新着の記事を読みに行って、間違ったサンプルのセットを自動的に再学習させる、ということを試みています。またまとまったらここに追記したいと思います。 なお、ソースコードの公開もしたいのですが、いかんせんぐちゃぐちゃになってしまっているので、まとめてからだしたいと思います。

f:id:bython-chogo:20171011185613p:plain:w300 かわいいフリー素材集 いらすとや

<ネタバレ有り> スイス・アーミー・マン

この映画を最初に知ったのは芸人「アルコ・アンド・ピース」のラジオで取り上げられていたことです。

f:id:bython-chogo:20171009175031j:plain

ある島で遭難した主人公がその島で遭遇した死体。その死体はサバイバルに必要な「死体のおならでジェットスキーのように海を渡る」などの便利な機能をもっていた。この時点ですでにぶっとんだ設定ですが、ダメ押しとして、その死体を演じるのがあのハリーポッターダニエル・ラドクリフということです。これはあれだ、「打ち上げ花火ー」に続く、俺がみなくてはならない案件だ。流行りでいうならばにゃんこスターの「おいらが見なけりゃ、だれがみるってんだい」案件です。

祝日の昼間の映画館で人入りはまあまあ。カップル、女子通し、一人もの、の割合は 3:3:4 といったところでしょうか。 設定がぶっとんでいて、下品なネタも多いので、低俗な笑いで受けを狙う映画、として捉われてしまいそうですが、個人的にはいろいろ思うところがある映画でしたので、すべてを書かせてもらおうと思っています。そのため、ネタバレも含まれます。これから見に行く予定の方はご注意のほどをお願いいたします。

なお、映画を見てすぐに書いてますが、記憶があいまいなところが多く、会話の詳細が間違っている可能性が大きいですが、ニュアンスでとらえていただければと思います。

感想 - ネタバレ有

遭難した主人公はさえない人生をおくっていたさえない若者で、偶然バスで出会った女性に声をかけられずにスマホのカメラで隠し撮りをおこなって待ち受けにするという小心者。家庭環境もあまり恵まれてなく、偏屈な父親と、若くして亡くなった母親へのコンプレックスというのも背景としてかかれています。 遭難したときに偶然遭遇した「死体」の便利な機能に気づき、その機能を使いながら困難を乗り越えていきます。また一方でその死体はしゃべることもでき、ただ生前の記憶はない状態のようで、主人公は死体に言葉、感情、一般的な常識的行動などを教えながらコミュニケーションをとっていきます。

先ほどいったように、「死体のおならでジェットスキーのように海を渡る」「死体の口から飲み水がでてくる」「死体の勃起したイチモツがコンパスのように方向を示す」といった一見すると下品なネタで笑いを取っているだけにもみえてしまいます。実際、映画終わりでそのような感想を言っている声もきいたのですが、私としては下ネタだけで興味を持続させている映画ではないと思っています。

遭難しているという主人公の過酷な環境は言わば、「非常識・非現実」な世界に置かれています。それに加えて、道具として使え、しゃべる死体がいるという状況が非常識に拍車をかけており、その死体とのコミュニケーションのなかで、いままでの自分の生き方、常識と非常識、理想と現実、について自然と問いかけるようになっていきます。そもそもこの非常識な死体には、常識は通用しません。「人前でおならをしないのが常識なんだ」と教わると「わあ、なんて最悪な世界なんだ」(おならを道具として海を渡ったのに、という背景がある。)、などの純粋な感想を投げかけます。さらに終盤でも「そんなに常識にしばられているのに故郷に帰る必要があるのかい?」と主人公に問いかけをします。 また、ほかのポイントとして、主人公はその死体にうそをつくというシーケンスがあります。主人公がバスで隠し撮りした女性の写真に一目ぼれしてした死体は、その女性に会うことをモチベーションとして主人公を手伝うようになります。遭難中の森の中、バスを模した即席のセットを作成し、さらに主人公を女装させ、女性とバスで出会い、声をかけるシチュエーションを演出をしながら2人は絆を深めていくようになります。しかし、バスで出会った女性はすでに結婚していて子供もいるので、なんにせよかなわない恋となります。主人公はそのことを隠しながら死体を盛り上げる趣向を繰り返します。これは遭難、しゃべる死体、という非現実的な状況下でこそ積み上げられる、「現実ではない世界」の中に「理想の世界」を2人で作り上げていることにほかなりません。いわばこの妄想的な世界感においては、こんな非現実な世界でもとがめる人は出てきません。そこはだれも見ていない、自由な空間だからです。これは映画を見ている我々観客もその妄想の世界を一緒に楽しんでいくようになります。

その楽しい非現実世界にも終わりが来ます。現実世界にもどってしまうと妄想を繰り広げる自由はありません。やっと人里におりてきた2人を待ち受けるのは現実世界の人の目です。ボロボロの服をきた主人公、その携帯のカメラにはバスで隠し撮りした女性の画像、森の中には手作りされたバスのセットという妄想の亡骸、そしてしゃべっていた死体は、一般的な常識通りにしゃべらなくなってしまいます。一緒に非現実世界を楽しんでいた観客も、我に返りざるを得ません。私たちが楽しんでいたこの妄想の世界は、一般社会的には超異常な変態的な世界なのだと気づかされるからです。 この現実に戻る直前、死体がしゃべらなくなく前に死体は主人公にこういうのです。「人前で大きな声で歌をうたうことも、おならをすることも、誰かが少しづつ認めてくれれば、変わっていくんじゃないか」。 そして常識の目をもった人たちのまえで、狂人としてとらわれている主人公、そんな主人公はある「一般社会的に非常識的な行動」をします。この行動は常識をうちやぶる奇跡をおこすこととなります。

常識に「自由な発想」をつぶさせない

常識というのは社会生活では必要な規範となる一方、自由な発想を妨げる制約になります。せめて人目が届かないところでは、常識に問われることなく、自由な発想で、自分のやりたいことを突き通してもいいのではという提案にも感じ取れました。もしその発想に共感する人が一人あらわれ、さらに理解者の輪が広がっていけば、いつか常識を覆す新しいパラダイムシフトが生み出される、そんな励ましを勝手ながら感じ取ってしまいました。

そしてラドクリフがすごい!

この映画の見どころはやっぱり死体役のラドクリフとなってきます。便利な道具をおこなう死体、というなんのこっちゃわからない役を怪演しきっていたと思います。ほんと見事な死体っぷりでした。子役時代、ハリーポッターで華々しくデビューした彼ですが、実はこうした怪役のほうが性に合っているのではないかと思いました。日本のドラマでいう高嶋政伸のように、非常識的なキャラクターがぴったりくる印象をもってしまいました。願わくば、この路線を突き進んでほしいものです。

まとめ

このようにぶっとんだ設定や下ネタで笑いを起こして楽しいのですが、実はその裏には社会生活の常識と、それに自然と縛られている私たちの発想、というテーマを垣間見ることができました。入口はただただぶっとんだ映画ですが、持って帰るものも多かった一作、怪作となったのは間違いないと思います。

Chainerをつかった助詞の学習システムを作る

久しぶりにPythonでちょっとおおネタ。複数回にまたがりそうなうえ、個別項目の備忘録も必要になってくるかもしれないですが、見切り発車でGoです。

モチベーション

Chainerによる実践深層学習

Chainerによる実践深層学習

この本のお勉強の続きで、7章Recurrent Neural Network, 8章で実用のケースとして翻訳モデルの実装方法について記載しています。せっかく得たこの知識を使ってなにか作れないか探していたところ、以下の記事を見つけました。

www.atmarkit.co.jp

助詞の訂正かー、これ実装できたら面白うだし、課題としてはちょうどよいかもしれない。ということでコーディングを始めてみました。ちなみにですが、コーディングにつきましては以下のエントリをがっつり参照させてもらっています。この方も助詞検出を機械学習してコードを公開していらっしゃいます。こちらのコードをだいぶお手本として参照させていただきました。

catindog.hatenablog.com

今回作るものはChainer本とこちらのエントリのミクスチャーとなります。id:catindog さんはKarasというPythonライブラリでの実装を行っていますが、私が持っている武器は現在本に記載されているChainerだけなので、Chainerでの実装をめざしてみようと思います。

助詞の検出のための学習

学習のアイデア id:catindog さんの方法を丸々使わせてもらいました。*1

今回の助詞の検出モデルを作成するにあたり、何を学習させる必要があるのかを考えてみます。

f:id:bython-chogo:20171008031513p:plain

助詞は前後の文節の流れで決まります。上の例で、私は/野球、に続く助詞を考えたときに、この後にくる助詞は、「が」、「を」、「も」など、一意に決まりません。しかし後に続く、好き、です、により「が」が適していることが分かります。つまり学習のプロセスは、1. 学習(検出)する文章の助詞をさがす。2.その助詞の前後の文章を入力値、助詞自身が正解の出力値として複数の文章を学習させる。 となります。

学習文章のサンプル取得方法

某地上波のWeb記事を抽出しました。その文章を文節ごとにスペースを空ける「分かち書き」をおこない、その文章の中で助詞にあたる文字を抽出して、その前後の文節を一定数、入力値として登録します。お手本に習い、助詞の前後10ワードずつとしました。

文章の抜き出し方法はそのまま公開するといろいろ問題がありそうなのでしませんが、Beautiful Soupを使っています。また分かち書きMeCabPythonモジュールを使いました。正直、ここの分かち書きが難所だと思ったのですが、こんなライブラリが用意されているとはほんとにインターネット時代様様です。

ちなみに、Mecabを使うと以下のような変換が行われます。(わかりやすく間に / を入れています。通常はスペース。)

せっかく得たこの知識を使ってなにか作れないか探していたところ、以下の記事を見つけました。
せっかく/得/た/この/知識/を/使っ/て/なにか/作れ/ない/か/探し/て/い/た/ところ/、/以下/の/記事/を/見つけ/まし/た/。 

素敵。これをそのまま別の文節として学習できちゃう。 この例の場合、今回の学習の入力値と出力値は次のようになります。

  • 入力1:/得/た/この/知識/を/使っ/て/なにか/作れ/ない//探し/て/い/た/ところ/、/以下/の/記事/を/
  • 出力1:か
  • 入力2:/この/知識/を/使っ/て/なにか/作れ/ない/か/探し//い/た/ところ/、/以下/の/記事/を/見つけ/まし/
  • 出力2:て

学習文章と検証文章について

先ほどのWeb記事の10月1日の記事を学習サンプルとして、10月6日の記事を検証サンプルとしてみました。10月1日のデータ数は以下になりました。*2 学習の繰り返し回数は50にしてみました。根拠なくChainer本の値をそのまま入れただけです。

  • 学習するUnit: 7154
  • 学習において出てきた単語数: 5241

ちなみに検証の記事については2つ以上の助詞があっても1文章につき、1サンプルとしました。類似の検証用記事が偏ること避けるためなのですが、意味があるかはわかりません。

成功例と失敗例

今回のテストで学習させた結果、以下の例のように助詞を提案してくれます。正解の例と、失敗の例を示します。

正解例

ことし 7月 1 日 から 9月 1 0 日 まで  [ の ]  夏山 シーズン の 登山 者 は 合わせ て 2 
    の 0.999983
    に 1.62042e-05
    と 4.91623e-07
    や 9.80575e-08
    で 8.98966e-08

失敗例

 の 繁華 街 で は 悪質 な 客引き 行為 など  [ が ]  相次ぎ 、 日本語 が わから ない 外国 人 観光 
    は 0.804192
    の 0.0810047
    を 0.0239791
    が 0.0194065
    に 0.00046254

正解率と損失率

今回の学習と検証では以下のような結果となりました。横軸は損失数を減らすようにアジャストした学習の反復回数です。 f:id:bython-chogo:20171008205752p:plain

いえることとして、 - およそ 0.55 ~ 0.60 の正解率。微妙w - 10回の反復で損失数はほぼ0に張り付いてます。この学習では50も繰り返す必要はなさそうですね。

次のステップ

さて、今回のパターンでは微妙な正解率となってしまいました。次回からはこの学習率を高めるにはどうするかを実験してみたいと思います。あと、コードはぐちゃぐちゃになってしまったので、整理してからきちんと公開したいと思います。

追記

最初に間違ったスペルでIDコールを飛ばしてしまいました。お詫びして訂正いたします。

*1:すいません、例題分もまるまる同じものを使って説明しております。

*2:ちなみに、Web記事は記事の抽出コードを実行したときにWebに掲載されている新着記事となります。同じ日でも別の時間に実行すると抽出する記事は変わります。

Rhymester Live 公開リハーサル・ゲネプロにいってきた話

10月5日に行われたRhymester Liveのゲネプロに行ってきました。いやー最高だったのですが、どうまとめたもんかと考えているうちに週末に入り、記憶が定かなうちに書きはじめてます。考えが全然まとまってねぇw

Rhymester

Rhymesterとは2MC(宇多丸/Mummy-D)と1DJ(DJ Jin)からなる日本のヒップホップグループで日本のHIPHOPシーンの創世記をささえてきたグループなのです。

Rhymesterの公開リハーサルライブ

で、そのRhymesterのツアー名は、「KING OF STAGE」といい、今回のライブは「KING OF STAGE VOL. 13 ダンサブル Release Tour 2017」の公開リハーサルとなっています。

f:id:bython-chogo:20171007162305p:plain

http://www.rhymester.jp/

9月6日に発売されたアルバム「ダンサブル」のリリースLiveツアーを始めるのですが、Rhymesterはここ最近「公開リハーサル・ゲネプロ」というのを最初に行っています。通常のライブチケットより安くして客を入れてリハーサルを見てもらい、そのフィードバックをもって本番のツアーをブラシュアップさせるという試み。

リハーサルといっても、本番さながらのセットでもちろん楽曲も本番と同じクオリティで行われます。一部、映像が間に合ってなかったり、予定のEvent (a.k.a 余興) をスキップしていたようですが内容的には本番とそん色ないQualityで行われます。

感想箇条書き

セットリストやサプライズの内容はネタバレになってしまうので抑えながら箇条書き。

  • もちろん今回は新作アルバム・ダンサブルがメインでの構成。今回のアルバムはタイトル通りにノリやすく非常に自分好みでうれしい。
  • 始まる前のクラブチッタ松井さんの始まりの言葉。「リハーサルであるため、一部演出、映像が間に合っておりません。ご容赦ください。また2人のリリック等も間に合っておりません。」のエクスキューズに爆笑。
  • しょっぱなの3曲はマジあがる。たまらない。
  • 新作曲から「テーマつながり」で旧作曲の流れが一つあったが最高だった。昔のライブでいうとアルバムPOP LIFEツアーでの「敗者復活戦」からの「Born to Lose」のような。歴史のあるRhymesterの旧名(迷)曲がフックされるととても気持ちいい。
  • 旧作のつなぎで盛り上がる「鉄板」ネタも健在。上がりまくる流れにひと工夫加えてまじヤヴぁい。
  • J-HIPHOP リスペクトのカバー曲が登場。そんな昔の曲とは思えないほどやばすぎのカバーだった。全然新曲としてもいける。
  • さらに昔のJ曲のカバーもリクエストに登場。J-PopではなくJ歌謡曲の域。さすがの私もカバーしきれないほど古いw なぜそのチョイスw かっこよいんだけどそのチョイスに至った理由がききたいくらいぶっ飛んだ方向(笑) かっこよかったけど。そのあとのMCでハモリを披露する三人のおっさんHIPHOPレジェンドw
  • MCは相変わらず面白い。2MCの掛け合いが最高すぎる。個人的には「俺の緩さは半端ないよー」とお決まりのフロウで観客に語りかけるDさんに大笑いしてしまった。
  • 通常チケット5500円で、公開リハは3000円。宇多丸「2500円分を差し引いてパフォーマンスしますから。そうしないと割が合わないから!」。Mummy-D「それか2500円分、みなさんにはイヤーな思いをしてもらいます。」
  • Mummy-Dさんが髪切ったあと初めてみたけど、似合ってた。マネしたいけど似合わないだろうな。
  • 休憩の合間の偽CMはまだ間に合わず過去の迷作選でした。いいね。ひどいね。
  • 舞台セットもアルバムのイメージにとてもあっていると思います。

すべてが終わって、クラブチッタの松井さんが「いつも出待ちをしていただいている方がいらっしゃいますが、今日はこのあと深夜までここでミーティングをする予定なのでお控えいただきますようお願いいたします。」楽しく愉快にパフォーマンスるようにみせて、きっちり反省会をその日のうちにおこないまじめにブラシュアップを練っているようです。レジェンドになっても決して手を緩めぬ姿勢にリスペクトで、好きなものを仕事にしている人たちはこうした地道な積み重ねをおこなっているんだと思い知らされました。

お台場にも行く予定なので、「本番」も楽しみにしています。

10年後に1998年を振り返る記事をみてからもう9年

Webクロール中にたまたまBuzzFeedさんの以下のエントリを見つけました。

www.buzzfeed.com

あれ、これデジャブだなーと思って探したらそうそう、このまとめサイトを見てた記憶だ。

blog.livedoor.jp

そうか、このまとめ見てからもう9年も経つんだ。というかBuzzfeedさんの19年前を振り返るのって中途半端じゃね? でもなんとなくわかるのですが、感覚的に「1997年が20年前」よりも「1998年が20年前」というほうがちょっと心に刺さるものがあります。それが2007年と2008年でも同じ。下一桁の8は大台にのる直前感を醸し出すマジックナンバーなのかもしれませんね。

ちょっと9年前の痛ニューのコメントについて、9年後の自分がコメントを入れてみます。

55 名前: グラドル(アラバマ州) 投稿日:2008/01/01(火) 00:58:38.53 ID:4teCgfiA0
MXとか2chとかなにやってたんだおれ

9年後、5chになるって言ってもだれも信じないだろうな。MXとかWinnyとかYouTubeなどなどでなくなっちゃいましたね。

64 名前: 建設作業員(埼玉県)[sage] 投稿日:2008/01/01(火) 00:59:35.81 id:oVqD1qdQ0
時のオカリナも10年前の作品に。

さらに9年。ゼルダも新ゲーム機で健在

120 名前: 日本語教師(北海道)[sage] 投稿日:2008/01/01(火) 01:07:06.72 id:zPUln/+60
宇多田ってどんだけ若いんだよw

20年近くたっても35ですからねー

383 名前: 留学生(長野県) 投稿日:2008/01/01(火) 01:46:23.75 ID:E+hBCPSk0
10年間何してきたか? 違うよ、これから10年何をするかが大切なんだよ

2028年を見据えて頑張ります

415 名前: 人気者(東京都)[sage] 投稿日:2008/01/01(火) 01:51:29.71 ID:6AOQYFO+0
人の人生で一番重要な時期って10歳~30くらいだろ この10年が2回くらい過ぎたら人間の人生なんて終わったようなもんだ 30歳からなんて老いていくだけだろ

30半ばを過ぎてきましたが、まだまだこれからのつもりです。

868 名前: 山伏(dion軍) 投稿日:2008/01/01(火) 08:06:11.75 ID:wBQoO+020
未だにスマップや宇多田が人気とか文化停滞しすぎだろw

解散、3人がジャニーズ脱退=>New(s) Mapへ いろいろありますがいまだに活躍中。

423 名前: あらし(アラバマ州) 投稿日:2008/01/01(火) 01:55:23.84 id:fzVGd+k50
ニコ動って10年後にも存在してんのかな? 2ch以上に廃人を生み出すだろ・・・

角川と合併も、課金ユーザの減少がニュースになっています。

442 名前: 人気者(東京都)[sage] 投稿日:2008/01/01(火) 01:58:57.00 ID:6AOQYFO+0
ネットが普及してからおかしくなった ネットで得たものもたくさんあったが失ったもののほうが大きいだろう 10年後はもっとネットが進化してるからどうなるのかな・・・

ネットの中心はPCからスマホへ。You Tuberなるものが職業に。

443 名前: 朝日新聞記者(東京都) 投稿日:2008/01/01(火) 01:59:05.63 ID:3L3hY0id0
オレが1998年に購入したVAIO505 ソニータイマー故障で現在も現役。

大丈夫、もうVAIOソニーじゃないよ!

584 名前: ダンパ(アラバマ州) 投稿日:2008/01/01(火) 02:36:55.43 ID:1Y0Vdh3+P
10年前のこち亀こち亀モンスターPCマシンのキャプチャ・自重> そういやこち亀1000話って96年なのか・・・

こち亀がついに終わりました。このキャプチャは後になってみれば見るほど趣がでてきますね。

682 名前: ボーカル(コネチカット州) 投稿日:2008/01/01(火) 03:24:48.86 ID:+E7EmGMuO
この十年で国の借金がとんでもない額になりました

あっ。。。

829 名前: 愛のVIP戦士(アラバマ州) 投稿日:2008/01/01(火) 07:02:25.80 id:px9pfaj40 
平成になってからもう20年も経つのが驚き

平成も30年(31年?)までということになりました。

844 名前: 自衛官(福岡県)[] 投稿日:2008/01/01(火) 07:20:36.47 id:p6cvu58s0
10年後2ちゃんがあるかどうか知らんが、日本はどうなっているのだろうか・・・・

2chは名前を変えましたが、日本は問題を抱えながらまだそれなりにやっていってます。これからの10年もがんばりましょう。

それでは、2028年にまた!

備忘録 - Python/WIn10 64bit でMeCabを導入

最近 Chainer本をやっているのは、ぼんやりと言語系の機械学習をいっちょかみしたいなと考えているからなのですが、そろそろ必要な環境についてもPCへの導入を始めました。その過程のお話し。

日本語の文章を学習させるにあたって必要になるのが「わかち書き」ってやつで、ようは機械に日本語を学習させるにあたり、意味で区切った文節の間に英語のようにスペースなどの記号を入れる必要が出てきます。これって結構難儀だよなって思っていたのですが、あっさりとMeCabというフリーの形態解析エンジンがでてきました。。

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

MeCab京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 言語, 辞書,コーパスに依存しない汎用的な設計を 基本方針としています。 パラメータの推定に Conditional Random Fields (CRF) を用 いており, ChaSenが採用している 隠れマルコフモデルに比べ性能が向上しています。また、平均的に ChaSen, Juman, KAKASIより高速に動作します。 ちなみに和布蕪(めかぶ)は, 作者の好物です。

これぞ情報の海の産物。めかぶだけに。この時代に生まれてよかったと感じざるを得ませんでした。 これを自分の開発の環境に合わせなくてはいけません。Windows10 64bitのPC上で、Python 2.7を使って動かしています。Pythonも活発な言語なのでこのあたり導入したライブラリの情報がいくらでもあるだろうとたかをくくっていたのですが、実際に導入する方法はちょっとトリッキーでした。ただそのトリッキーな方法もわかりやすく記載したエントリーがでてきます。

hassiweb-programming.blogspot.jp

Mecab 32bitをインストールする。ただ動かしたいのは64bit版なので、そのソースコードをダウンロードして少し情報を書き換えたうえでコンパイルPythonモジュールのビルドをしてようやく導入が完了します。

おおむね参照させていただいたページのプロセスで進んだのですが、どうしてもPython モジュールのコンパイルの場所でエラーが発生してしまいます。 曰く、"Unable to find vcvarsall.bat" とのこと。実はこれも先のページのトラブルシュートで記載があったのですが、解決に至りませんでした。*1

なんのこっちゃよくわからず、ぐるぐると検索して回った結果、以下のページで解決しました。

www.regentechlog.com

例えば、Python本体がMSC v.1500、つまりVC++9.0(2008)でコンパイルされていてインストールされているVC++が11.0(2012)の場合、 set VS90COMNTOOLS=%VS110COMNTOOLS% と環境変数をセットしてやるとVC++11.0を使ってコンパイルしてくれます。

私の環境だと、Visual Stdio 2015を導入していて、これだとVCのバージョンは14になるようです。一方で、Microsoftから提供されているPython2.7用のコンパイラはVC9となり、Visula Stdioでいうと2008と相当古いものになってしまうのです。VC9のコンパイラVisual Studio 2008のライブラリを探しに行くのですが、システム上にないためのこのエラーがでてきたということでしょうか。そこで上の環境変数のセットで存在するバージョンのライブラリのパスを設定する必要があったようです。私の環境の場合Visual Studio2015はVC14となるので、以下の設定になりました。

set VS90COMNTOOLS=%VS140COMNTOOLS%

これで、MeCabのPython2.7 (on 64bit) での導入は成功したようです。次のステップは日本語データの収集かな。

以下のサイトでも勉強させていただきました。

qiita.com

*1:よくよく確認すると、正しい対処法が書かれていたようです。解決できなかったのは理解不足が原因ですね。。。

「自然界の黄金比」をプロットしてみる

話題になった黄金率の話にうすーく乗っかってみたくなりました。

モチベーション

www.watto.nagoya

正直、連分数に関してちゃんと理解できていないのですが、とにかく、

(略)これは、黄金比有理数による近似は常に精度が最も悪くなることを意味するのである。 これまでと同様の手順で、100枚の葉をつけた状態が、下図である。有理数による近似の精度が悪い=腕が見えづらい=葉の重なりが少ないってことで、葉の重なりが最も少なくなる配置が得られた。

というところに素直に感動してしまいました。自然界、まじやべぇ。*1

というわけで、これは matplotlib を使って動画化してみてみるしかないと奮い立ちました。先に言ってしまうと、自分の理解が薄かったせいで最初に考えていたよりも作業は大変でした。

課題のおさらい

幹から1枚目の葉を出したら、1枚目の葉からθの角度で2枚目の葉を出す。3枚目の葉は2枚目の葉からやはりθの角度で出す。以下n枚目の葉まで、同様に繰り返す。 幹からn枚目の葉の中心までの長さは、√nとする。

こうして幹の周りから同じ角度でずらしながらで直径1の葉っぱを配置していきます。中心からのきょりも順番の数の平方根で遠ざかっていって、全体に効率よく太陽の光をあびることのできる配置を考えるんですね。そうすると黄金比を使ったやつが一番となるらしいです。今回は元エントリーの例に倣って 無理数の代表 θ = π×π も作って比較してみます。

プロット結果

とっとと実行結果からお見せします。葉っぱの枚数は300枚としました。 まずは π×π

f:id:bython-chogo:20170926021040g:plain

そして 黄金比を使った場合。

f:id:bython-chogo:20170926021151g:plain

きちんと前の円の群れで欠けたるところにすっぽりはまっていくように見えますね。不思議。

コード

jupyterで書いていますが、plt.show()使えば、jupyter以外でもできると思います。未確認。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib import animation

from IPython.display import HTML

T = 360 * 1.0 / (1 + (1+math.sqrt(5))/2)
#T = 360 * 1.0 / (math.pi * math.pi) 

fig = plt.figure()
ax = plt.gca()
ax.set_xlim(-20, 20)
ax.set_ylim(-20, 20)

def ccl_plt(n, d):
    r = n * d * math.pi / 180 
    x = math.sqrt(n) * math.cos(r)
    y = math.sqrt(n) * math.sin(r)
    return x, y

def init():
    return []

def animate(j):
    plt.cla()
    patches = []
    for i in range(j):
        if i == 0:
            continue
        patches.append(ax.add_patch(plt.Circle(ccl_plt(i, T), 1.0, alpha=0.1, color='g')))

    return patches

    
anim = animation.FuncAnimation(fig, animate,
                               init_func=init,
                               frames=300,
                               interval=80,
                               blit=True)


#plt.show()
HTML(anim.to_html5_video())

もう一つ、簡単な静止画バージョン。

import math
import matplotlib.pyplot as plt
%matplotlib inline

def ccl_plt(n, d):
    r = n * d * math.pi / 180 
    x = math.sqrt(n) * math.cos(r)
    y = math.sqrt(n) * math.sin(r)
    return x, y

fig = plt.figure()
ax = fig.add_subplot(111)
plt.xlim(-20, 20)
plt.ylim(-20, 20)
for i in range(300):

    if i == 0:
        continue
    t = 360 * 1.0 / (1 + (1+math.sqrt(5))/2)
    #t = 360 * 1.0 / (math.pi * math.pi)
    x, y = ccl_plt(i, t)
    ax.add_patch(plt.Circle((x, y), 1.0, alpha=0.1, color='g'))
plt.show()

蛇足

今回の課題は簡単かなとたかをくくっていたのですが、いざやってみると黄金比の角度をどう設定すればいいのかわからず苦労しました。検索して見つけたのですが、黄金角っちゅうのがあるのですね。入力が度数である場合は以下の計算で黄金角を導き出されるようです。

t = 360 * 1.0 / (1 + (1+math.sqrt(5))/2)

参考:http://gakuen.gifu-net.ed.jp/~contents/museum/golden/page62.html

分母の部分が黄金比の式になってますね。

いやはや、時間がかかりすぎてしまった。眠い。

*1:というかこうしたネタを華麗に持ち出してくるwattoさん、しゅごい。