ブログタイトルの通り、昨日をもってソニーデジタルネットワークアプリケーションズ株式会社を退職いたしました。
特にトラブったわけではなく、濃い技術者のいる、よい会社でした。
中の人は意外とiPhoneユーザーが多いと云うと、意外と思われるかも
しれませんが新しいもの好きな人が多い印象です。
次の職はまだ決まっていません。就職先、絶賛募集中です。きゃぴっ☆
そして、我らがTwitter bot のメカウーサーCS5は昨日まで間接的に
ソニー(子会社)製でした(開発自体は僕の余暇の時間で行いました)
うーさーさんもソニー製品好きだということで、この点ソニー製でなくなる
のはちょっと残念です。
今年のコンピュータ将棋選手権にはいまのところ出場する予定です。
以上ご報告まで。
(文責kimrin)
Mecha Lady Shogi (GPGPU/NonGPGPU based japanese chess playing program), and the twitter bot @mechawooser
2013年3月20日水曜日
2012年2月23日木曜日
メカウーサー(twitter bot)誕生秘話(2)
だいぶ間が空いてしまいましたが、メカウーサー誕生秘話その2です。
今回は特にメカウーサーの実装についてお話したいと思います。
メカウーサーのエンジンはいわゆる「マルコフ遷移」を使ったタイプのエンジンです。
他にも保存している発言の名詞、動詞などを入れ替える方式がありますが、あえてメカウーサーではマルコフ遷移のエンジンにこだわっています。
初めてマルコフ遷移という言葉を聞いた方に、簡単にその原理を説明します。
ある単語「例:メカウーサー」とその次の単語「例:は」(助詞とします)の間には、共に共起しやすい(一緒に出やすい)2単語もあれば、逆に一緒には出にくい2単語の場合もあります。
そこでメカウーサーコーパス(うーさーさんが用意してくださった、1MBに及ぶ言語資料)から、すべての単語について、その次に出やすい単語の集合を求めます。このとき1回でも一緒に出現した2単語の間には「接続可能性」があるとして、これをPythonのハッシュ内に納めておきます。
{ u'メカウーサー': {u'は', u'の', u'には', ...}}
そして、前件(前の単語)でハッシュを引くと、次にくる単語の集合が得られるようにしておきます。
文章生成のときは、まず、文頭の単語の全集合から任意の単語を抽出し、その単語でハッシュを引いて、次の単語候補を選びます。
次の単語候補の集合が得られたら、その中からランダムに次の単語を選びます。
これを、「。」が来るまで繰り返します。これが初期のメカウーサーのエンジンの仕様です。
実際には一番出やすい単語をスコアを付けて保存するのですが、メカウーサーの初期のバージョンではあえて、接続するもの全てを許して、やや口語っぽい表現も出やすくしていました。また、最近のバージョンではPythonのdictをcPickleしたものを文章生成時に取り出していましたが、昔はBerkeley DBへのバインディングを使ってKey-Value pairのデータベースファイルにアクセスしていました。
実際のメカウーサーでは前件を2単語、後件を1単語からなる「単語トライグラム(trigram)」を使って文章生成を行っていました。また、文長の制御や句読点の密度を調整する関数を使って、丁度よいあんばいになるように、文章の加工を行って出力していました。
ここまでがVer.3.14と呼ばれているバージョンの主な実装になります。
コーパスの文章を単語に分割するのはMeCabと呼ばれる処理系を使いました。実装はPythonで行いました。最終的に python twitterと呼ばれるライブラリでtwitterにポストしていました。
CS4では係り受けの結果を利用しました。具体的には前件、後件に単語ではなく文節をあてて、文章生成を行いました。結果3.14のときよりもさらに日本語らしい文章の生成に成功しました。
より日本語らしい文章になったというコメントをいただいたCS5は、実は単語分割した表層(文字面)しか使っていません。しかしあれだけの精度の高い文章が生成可能です。実はとあるライブラリを使って文章生成を行っています。これはいまのところ、秘密です☆
共起のしやすさも考慮しています。
なお現在ではtwitterへのポストをtweepyと呼ばれるOAuth投稿可能なライブラリに変更しています。
実際の運用はMac Miniで行っています。少し古いですが、Hudsonで投稿の成功/失敗を管理しています。現在4つのタスクがHudsonには登録されていて、その内二つはkimrin専用の「寝坊したらBossにメールするw」アプリが、また残り二つのうち一つがメカウーサーで、もう一つは秘密のメカウーサー試験用アカウントへの投稿を行っています。
以上こんな感じになります。ではちゃお〜(文責:kimrin)
今回は特にメカウーサーの実装についてお話したいと思います。
メカウーサーのエンジンはいわゆる「マルコフ遷移」を使ったタイプのエンジンです。
他にも保存している発言の名詞、動詞などを入れ替える方式がありますが、あえてメカウーサーではマルコフ遷移のエンジンにこだわっています。
初めてマルコフ遷移という言葉を聞いた方に、簡単にその原理を説明します。
ある単語「例:メカウーサー」とその次の単語「例:は」(助詞とします)の間には、共に共起しやすい(一緒に出やすい)2単語もあれば、逆に一緒には出にくい2単語の場合もあります。
そこでメカウーサーコーパス(うーさーさんが用意してくださった、1MBに及ぶ言語資料)から、すべての単語について、その次に出やすい単語の集合を求めます。このとき1回でも一緒に出現した2単語の間には「接続可能性」があるとして、これをPythonのハッシュ内に納めておきます。
{ u'メカウーサー': {u'は', u'の', u'には', ...}}
そして、前件(前の単語)でハッシュを引くと、次にくる単語の集合が得られるようにしておきます。
文章生成のときは、まず、文頭の単語の全集合から任意の単語を抽出し、その単語でハッシュを引いて、次の単語候補を選びます。
次の単語候補の集合が得られたら、その中からランダムに次の単語を選びます。
これを、「。」が来るまで繰り返します。これが初期のメカウーサーのエンジンの仕様です。
実際には一番出やすい単語をスコアを付けて保存するのですが、メカウーサーの初期のバージョンではあえて、接続するもの全てを許して、やや口語っぽい表現も出やすくしていました。また、最近のバージョンではPythonのdictをcPickleしたものを文章生成時に取り出していましたが、昔はBerkeley DBへのバインディングを使ってKey-Value pairのデータベースファイルにアクセスしていました。
実際のメカウーサーでは前件を2単語、後件を1単語からなる「単語トライグラム(trigram)」を使って文章生成を行っていました。また、文長の制御や句読点の密度を調整する関数を使って、丁度よいあんばいになるように、文章の加工を行って出力していました。
ここまでがVer.3.14と呼ばれているバージョンの主な実装になります。
コーパスの文章を単語に分割するのはMeCabと呼ばれる処理系を使いました。実装はPythonで行いました。最終的に python twitterと呼ばれるライブラリでtwitterにポストしていました。
CS4では係り受けの結果を利用しました。具体的には前件、後件に単語ではなく文節をあてて、文章生成を行いました。結果3.14のときよりもさらに日本語らしい文章の生成に成功しました。
より日本語らしい文章になったというコメントをいただいたCS5は、実は単語分割した表層(文字面)しか使っていません。しかしあれだけの精度の高い文章が生成可能です。実はとあるライブラリを使って文章生成を行っています。これはいまのところ、秘密です☆
共起のしやすさも考慮しています。
なお現在ではtwitterへのポストをtweepyと呼ばれるOAuth投稿可能なライブラリに変更しています。
実際の運用はMac Miniで行っています。少し古いですが、Hudsonで投稿の成功/失敗を管理しています。現在4つのタスクがHudsonには登録されていて、その内二つはkimrin専用の「寝坊したらBossにメールするw」アプリが、また残り二つのうち一つがメカウーサーで、もう一つは秘密のメカウーサー試験用アカウントへの投稿を行っています。
以上こんな感じになります。ではちゃお〜(文責:kimrin)
2012年1月29日日曜日
メカウーサー(twitter bot)誕生秘話(1)
秘話というほどではないのですが、メカウーサー自体のいきさつとかを解説したページって、そういえばないなぁ、、、と思ったので、これから2回くらいに分けてメカウーサーの誕生のいきさつと、歴代のバージョンについての簡単な技術解説をしたいと思います。
第1回目はメカウーサー誕生のいきさつです。
皆さんは多分メカウーサーを知っていると思いますので、「うーさーのその日暮らし http://www.saturn.dti.ne.jp/~wooser/」というサイトはもうご存知だと思いますが、自分はかつて(そして今でも)そのサイトのにわかファンでしてw このサイト、宵越しのログは持たない方針でログが無いので自分で毎回ちまちまと更新ごとにフォルダに保存、フォルダに保存、しておりました。
そんなある日(恐らく2007年の12月頃)うーさーさんがサイトで
「誰かこの子に暖かい毛布とボットを」
的な発言をされて、ボット欲しいとおっしゃっていたのを目にして、
「じゃぁ2週間くらいでサクっと作ってみよう」
と自分のところにあるログをかき集めて文章の生成系を作成したのが1月から2月
くらいでしょうか。それが初代のメカウーサーになります。
ただ、その時は軽い遊びのノリでそのまま公開しちゃえばいいやと思っていました。
うーさーさんから大変興味深いとのメールを頂きました。
ただ、まだimproveできる余地があるとのことで、3月の始めの公開まで次の改善を行いました。具体的にはkimrinがプログラムを変えて生成ログをうーさーさんにお渡しし、うーさーさんが改善点を指摘する、kimrinが直すというスタイルでした。
・コーパス(言語資料)はうーさーさんが新たに書き下ろす(!)
・読点のバランスや文の長さについて見直す(主にうーさーさんの観点から)
・文章生成系を改良する(kimrin)
その結果、晴れて2008年3月3日に最初のツイートをすることができました!
(実際には3月2日の18時から3時間ごとに更新を掛けるように設定しました)
実はこの時ライバルとして目指していたのは今はR.I.P.されているkyoujinさんでした。
更新頻度などはうーさーさんと相談して、3時間ごとに、とこの時決めました。
結果としてうーさーさんには多大なるコーパス書き直し作業が発生しました。
作者としては嬉しい反面心配する毎日でした。
最終的には追加したtwitterログなど含め、約1MBのテキストコーパスが完成しました。
これが現在のメカウーサーを支えるメカウーサーコーパスとなります。
(うーさーさん、多謝です!)
開発はWindows上でPythonを使って行いました。
MeCabを使い形態素解析をして言語統計情報を作る部分を作成して、
そこから得られる情報を基に3時間に一回ツイートをする部分を作成しました。
ただWindows上で定期ジョブの管理をするのがやや難しいなどの点から、
その後はMac Mini上で運用するようになりました。
多分メカウーサーを知っている方は「うーさーさんがログをぽーんと渡して、kimrinさんがエンジン繋げただけで出来あがったのでは」とお思いになるかもしれませんが、
実際はうーさーさんとkimrinの共同作業がそれなりの量あったことを忘れないでいただけたらと思います。
その後もメカウーサーは改良を続け、現在ではCS5というバージョンを運用しています。
次回はその文章生成エンジンについて、簡単にお話したいと思います(文責:kimrin)。
第1回目はメカウーサー誕生のいきさつです。
皆さんは多分メカウーサーを知っていると思いますので、「うーさーのその日暮らし http://www.saturn.dti.ne.jp/~wooser/」というサイトはもうご存知だと思いますが、自分はかつて(そして今でも)そのサイトのにわかファンでしてw このサイト、宵越しのログは持たない方針でログが無いので自分で毎回ちまちまと更新ごとにフォルダに保存、フォルダに保存、しておりました。
そんなある日(恐らく2007年の12月頃)うーさーさんがサイトで
「誰かこの子に暖かい毛布とボットを」
的な発言をされて、ボット欲しいとおっしゃっていたのを目にして、
「じゃぁ2週間くらいでサクっと作ってみよう」
と自分のところにあるログをかき集めて文章の生成系を作成したのが1月から2月
くらいでしょうか。それが初代のメカウーサーになります。
ただ、その時は軽い遊びのノリでそのまま公開しちゃえばいいやと思っていました。
うーさーさんから大変興味深いとのメールを頂きました。
ただ、まだimproveできる余地があるとのことで、3月の始めの公開まで次の改善を行いました。具体的にはkimrinがプログラムを変えて生成ログをうーさーさんにお渡しし、うーさーさんが改善点を指摘する、kimrinが直すというスタイルでした。
・コーパス(言語資料)はうーさーさんが新たに書き下ろす(!)
・読点のバランスや文の長さについて見直す(主にうーさーさんの観点から)
・文章生成系を改良する(kimrin)
その結果、晴れて2008年3月3日に最初のツイートをすることができました!
(実際には3月2日の18時から3時間ごとに更新を掛けるように設定しました)
実はこの時ライバルとして目指していたのは今はR.I.P.されているkyoujinさんでした。
更新頻度などはうーさーさんと相談して、3時間ごとに、とこの時決めました。
結果としてうーさーさんには多大なるコーパス書き直し作業が発生しました。
作者としては嬉しい反面心配する毎日でした。
最終的には追加したtwitterログなど含め、約1MBのテキストコーパスが完成しました。
これが現在のメカウーサーを支えるメカウーサーコーパスとなります。
(うーさーさん、多謝です!)
開発はWindows上でPythonを使って行いました。
MeCabを使い形態素解析をして言語統計情報を作る部分を作成して、
そこから得られる情報を基に3時間に一回ツイートをする部分を作成しました。
ただWindows上で定期ジョブの管理をするのがやや難しいなどの点から、
その後はMac Mini上で運用するようになりました。
多分メカウーサーを知っている方は「うーさーさんがログをぽーんと渡して、kimrinさんがエンジン繋げただけで出来あがったのでは」とお思いになるかもしれませんが、
実際はうーさーさんとkimrinの共同作業がそれなりの量あったことを忘れないでいただけたらと思います。
その後もメカウーサーは改良を続け、現在ではCS5というバージョンを運用しています。
次回はその文章生成エンジンについて、簡単にお話したいと思います(文責:kimrin)。
登録:
投稿 (Atom)