「 2018年01月06日 」一覧

2018年ロードバイク2回目~正月走り

2018年1月3日、所用で新松戸へ出かけたので、セオサイクルに寄って輪行袋(Orstrich L220)を購入しました。現在使用している同形の輪行袋が破れ始めているので、買えるタイミングで買っておくことにしました。直近では、特に輪行予定はありません。

翌日の2018年1月4日、初乗りの距離が短かったので、この日も走ることにしました。天気は快晴で、風も前日に比べればだいぶ弱いです。と思って、余裕しゃくしゃくで江戸川CRに向かったのですが、北風なので往路では思いきり向かい風になります。前日より弱いとは言え、風速4m/s(あくまで広域予報、土手なのでもっと強いはず……)の向かい風なので、結構しんどいです。へろへろになりながら、何とか運河河口公園までたどり着きました。

空は抜けるような青空で、土手の枯草は明るく照らされ、とても気持ちの良い光景が広がります。公園でしばらく休憩したら、そのまま折り返します。冬の公園は、ベンチに座っていても蟻が這ってこなくて良いですね。

今度は追い風になるので、往路とは真逆の快走モード。前方がしばらく空いたら、猛ダッシュをしてみます。坂道ではないのに、ギアを上げずとも40km/hまで出ました。ここまでスピードが出ると、ふらついてちょっと怖いので、これ以上は自重。プロテクターとかしていないので、転んだら確実に怪我します。

今回の走行データは、以下の通りです。

走行距離 12.99km
平均速度 19.0km/h
最高速度 42.3km/h
走行時間 00:40:54
累計距離 1531.9km

記事に載せきれなかった写真は、こちらをご覧ください。


マルコフ連鎖モデルで台詞生成するプログラム

昔から、会話できる人工知能プログラムを作ってみたいと思っていました。しかし、当然ながらそれはとてもハードルが高く、実現可能なレベルへのダウンサイジングを続けた結果、学習させた情報からマルコフ連鎖モデルに基いて文章を生成する、という内容でした。

実際に作ったものは下記です。自分が作って楽しいもの、ということで、アイカツ!を題材にしました。

学習させる際の形態素解析の機能は、さすがに自前で用意できないので、mecabを使います。その他に必要となるスクリプトは、勉強を兼ねてPythonを選びました。Perl、PHP、Rubyはこれまで趣味プロで使ったことがあったので、新しいものを触ってみたかったのです。Pythonは2.0系と3.0系がかなり別物ですが、今から始めるならと思い、3.0系にしています。データベースは、データをファイル単位で管理できる方が規模的にも都合が良かったので、Sqlite3にしました。

  • mecab
  • Python3.0
  • sqlite3

いざ作ってみると、最初は慣れないPythonなので、言語仕様上のミスに悩まされます。それが落ち着いてくると、今度は設計上の問題点が見えてきたりしました。基本的な思想はマルコフ連鎖モデルですが、実装レベルに落とすと細かい問題も出てくるので、色々細かい調整を入れています。

そしてコンソールスクリプトとしては、ほぼ完成したので、Webサーバ経由で公開できるように、cgiとして動かしてみました。すると新たな問題が発生。文字コード絡みで特に悩まされました。コンソール環境では自動的に上手く解決されていた部分が、Webサーバ経由だと問題として顕在化するようです。Python内ではUnicode型で扱ったり、外部との入出力時にはエンコード及びデコード指定が必要だったり。特にmecabを起動する際に外部プロセスにforkして、そこでマルチバイト文字列を渡すのですが、これがWebサーバ経由だと上手くいきません。UnicodeEncodeErrorになってしまいます。未だに原因が分かっていません。この機能はコンソール限定することで、回避しました。

他にも細かいバグ修正をして、プログラムとしては、想定通りに出来上がりました。この後に出てくるのは、運用上の問題。まずmecabで形態素解析する際に、固有名詞の辞書登録が不十分であったため、期待外の単位で分割されることがあります。他には、単純マルコフ連鎖であるため、生成した文章のつながりが明らかに不自然なケースが目立つことです。N階マルコフ連鎖にする必要があったかもしれません。本来は設計を改善すべきですが、そこまでの気力はないので、運用カバーしています。

何だかんだでちまちまと、1年くらい掛けて、ようやく形になったので、少し感慨深いですね。仕事のようなペースでやれば、1周間も掛からない内容ですけど。