C++0xで10行で書けるマージンパーセプトロン

C++0xの練習として,マージンパーセプトロンを書きました.データ読み込みやコマンドライン処理を含めてもperceptron_binary.cppという90行にみたない1ファイルだけで済ませてあり,一応,コピペなどで気軽に使えることを意識しています.

ソースコード使い方

上の「ソースコード」や「使い方」のリンク先にもかいてありますが,gcc4.6さえ入っていれば,下記のように打てば使えます.基本的には,perceptron_binary.cppをコンパイルするだけです.gcc4.6が必要なのは,range-based forを使っているからです.

% g++ -std=c++0x -O2 perceptron_binary.cpp -o perceptron_binary
% g++ -O2 mknews20.cpp -o mknews20
% wget http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/news20.binary.bz2
% bzip2 -dc news20.binary.bz2|./mknews20
% ./perceptron_binary news20.train news20.test 10 0.6
Accuracy: 4819/4996=0.964572
Zerofication rate: 334121/1355194=0.246548

10行,というのはこちらの記事にインスパイアされました.

直接の参考にしたのは,kisa12012さんのこの記事や輪講発表資料です.

最初,パーセプトロンを実装していたところ,id:sleepy_yoshi さんのTokyoNLP #5で発表された資料でマージンパーセプトロンも簡単に出来ることを知り,ついでにやってみたという感じです.

プログラムの解説

主要なマージンパーセプトロンの部分は,以下の10行です.

struct perceptron_t{
  weight_t weight;  val_t    margin;
  perceptron_t(int size, val_t margin_=0.0): weight(size),  margin(margin_)   {}
  inline clabel_t classify(const datum_t& datum) const{ return weight*datum>0.0?1:-1; }
  inline void     train   (const datum_t& datum){
    if(((val_t)datum.first)*(weight*datum)<=margin)
      for(const auto& p : datum.second)
        weight[p.first] += ((val_t)datum.first)*p.second;
  }
};


10行で書ける…というのは,class perceptron_tが10行ということです.すみません,さすがにc++でデータ読み込みまで含めて10行というのは無理です(汗 仕掛けはweight*datumにあります.weight_t型のoperator*をオーバーロードすることによって,重みベクトルと特徴量ベクトルの内積をweight*datumで書けるようにしました.id:sleepy_yoshi さんや id:kisa12012 さんの資料に出てくるパーセプトロンのifをほとんどそのままの形で表せています.
数式:

  • if {y_t {\bf w}_^\top {\bf x}_t \le \gamma}
    • {{\bf w}_{i+1} \leftarrow {\bf w}_i + y_t {\bf x}_t}

プログラム:

    if(((val_t)datum.first)*(weight*datum)<=margin)
      for(const auto& p : datum.second)
        weight[p.first] += ((val_t)datum.first)*p.second;

一方,更新式はプログラムっぽい形になってしまいました.これも,vectorのoperator +とoperator =をオーバーロードすれば数式っぽくかけると思うのですが,ナイーブに書くと途中でvectorのコピーが発生したり,データ中に現れる特徴だけではなくて,全ての特徴に対してforがかかったりしそうで,パフォーマンスが低下しそうです.プログラムで書けば2行ですむものにそこまで労力をかける気にもなりませんでした.


データフォーマットは,libsvmやliblinear,ollその他,みんなが使っている,1行1データで各行が"ラベル 特徴量ID:特徴量 特徴量ID:特徴量 ... 特徴量ID:特徴量"という形式です.
datum_tはpair<ラベル,vector>>で,trainのp.firstには特徴量IDが,p.secondには特徴量が入っています.datum.firstがラベルのy_iで,+1か-1を取ります.
weight_tはvectorの派生クラスで,operator*はweight_tの中で定義されています.

C++0xのRange-based forをfor(const auto& p : datum.second)で使ってますが,これ,この部分だけなら普通のC++でも書けますね.for(data_t::iterator it = datum.second.begin(); it!=datum.second.end();++it)みたいに.なので,分かりにくくなりますが,一応C++でも10行で書けます.C++0xのもうひとつの本領はラムダ式で,制度を求めるときに使ってます(後述).


C++0xの機能

Range-based for

今までC++でループを回すためには,for(int i=0;i

auto

先程のfor(c_t::iteratort it...のところのc::iteratorを書くのは,cがvector > >のように長いと泣けてきたりします.今まで,これを防ぐ代表的な方法は,typedefで短い型名c_tを付け直してやるぐらいしかありませんでした.これが,for(auto& it=c.begin()... )というように簡潔に書けます.

ラムダ式

今までも,operator()をオーバーロードすることによる関数オブジェクトは定義すれば作ることが出来ましたが,いちいち定義しなければならず,その場で作ることができませんでした.一方,Pythonでは,lambda x:x**2のように,その場で関数を作成する事ができます.C++でも,その場で関数オブジェクトを作成することができるようになりました.
今回は,集計のところで本領を発揮してくれています.

  printrate("Accuracy: ",  count_if(test_data.begin(), test_data.end(), 
    [&p](const datum_t& t){return p.classify(t)==t.first;}),  test_data.size());
  printrate("Zerofication rate: ", count_if(p.weight.begin(), p.weight.end(), 
    [](const val_t& w_i ){return (bool)(w_i==0.0);}) , (int)maxfid+1);

pがperceptron_t型で,パーセプトロンそのものです.printrate(文字列,int a, int b)は,文字列を表示した後,a,bをfloatに直して率を表示するだけの関数です.
ラムダ式はtest_dataに対するcount_ifの中で使っています.count_ifは,指定されたコンテナ(test_data)中の各要素について,渡されたpredicateを実行し,trueが返って時だけカウントするというものです.
[&p](const datum_t& t){return p.classify(t)==t.first;}という形をしています.t.firstには,正解が入っています.[&p]は現在のスコープからpという変数を使用できるという指定です.

マージンパーセプトロンについて

マージンパーセプトロンは,ものすごく乱暴にいってしまうとこういうものです:

  • 普通のパーセプトロンは「予測を間違えた時だけ更新する」という方針です.上のコードで,margin=0.0の場合がこれに当たります.
  • マージンパーセプトロンは,「予測があっていた時もスレスレだったら更新する」という方針です.そのために,スレスレ度のような「マージン」という量を定義します.そして,このマージンが一定以下だったら(=もう少しで間違えそう!,という時の「少し」がその量以下だったら),更新を行います.上のコードでは,マージンはそのままmarginです.

実験設定

実験は,news20.binaryで行いました.これは,既にBag-of-words形式で特徴量ベクトルになっている新聞記事を2つに分類する問題です.news20.binaryは,@hillbig さん作のollというオンライン学習ライブラリのマニュアルに書かれている実験で使われています.

この実験データの作り方は,id:n_shuyo さんも以前,書かれています.この実験でも,この記事と同じデータの作り方をしています.

が,困ったことに,行の順番をランダムに並び替えるsort -Rが自分の環境にはなかったので,この際news20.binaryから上記事のnews20.trainとnews20.testを作成するmknews20という簡単なプログラムを作成しました.使い方は簡単でコンパイルして,bzip2 -dc news20.binary.bz2|./mknews20で,news20.trainとnews20.testが作成できます.上のgithubのREADME.mdに書いてあります.

実験結果

まず,普通のパーセプトロンです.10はイテレーション回数で,0.0がマージンです.biasはデフォルトでは入りません.毎イテレーションでデータをrandom_shuffleしています.

$ ./perceptron_binary news20.train news20.test 10 0.0                                                                                                                                                                           Accuracy: 4768/4996=0.954363
Zerofication rate: 1025984/1355194=0.757075

Zerofication rate(ゼロ化率)は,重みベクトル中の0の要素の数/重みベクトルの次元(=素性の次元)です.精度はそこそこですが,高いゼロ化率を達成できています.

マージンをあげると,ゼロ化率は急激に下がりますが,精度は1%ほど上がります.

$ ./perceptron_binary news20.train news20.test 10 1.0                                                                                                                                                                           
Accuracy: 4820/4996=0.964772
Zerofication rate: 680830/1355194=0.502386

マージンを上げることによって,しばらく精度が上がるが,3.0ぐらいをピークにどんどんゆっくりと精度が下がっていく.一方,ゼロ化率はマージンを上げることで急激に下がっていく.

$ ./perceptron_binary news20.train news20.test 10 2.0                                                                                                                                                                           
Accuracy: 4825/4996=0.965773
Zerofication rate: 557335/1355194=0.411258
$ ./perceptron_binary news20.train news20.test 10 3.0                                                                                                                                                                           
Accuracy: 4827/4996=0.966173
Zerofication rate: 483274/1355194=0.356609
$ ./perceptron_binary news20.train news20.test 10 4.0                                                                                                                                                                           
Accuracy: 4825/4996=0.965773
Zerofication rate: 423173/1355194=0.31226
$ ./perceptron_binary news20.train news20.test 10 5.0                                                                                                                                                                           
Accuracy: 4824/4996=0.965572
Zerofication rate: 379253/1355194=0.279851
$ ./perceptron_binary news20.train news20.test 10 6.0                                                                                                                                                                           
Accuracy: 4819/4996=0.964572
Zerofication rate: 334121/1355194=0.246548
$ ./perceptron_binary news20.train news20.test 10 7.0                                                                                                                                                                           
Accuracy: 4818/4996=0.964372
Zerofication rate: 312279/1355194=0.230431
$ ./perceptron_binary news20.train news20.test 10 8.0                                                                                                                                                                           
Accuracy: 4817/4996=0.964171
Zerofication rate: 286297/1355194=0.211259

マージンパーセプトロンは,マージンがとても大きい場合は,ほとんど常に更新するので,マージンが十分に大きいところでは確率的勾配降下法(SGD)と同じ更新をする.ただし,今回は学習率は1.0で固定であるが,SGDは段々学習率をイテレーション回数に反比例する形で減衰させることが普通である.しかも,SGDでは重みベクトルを0に引き戻す作用をする正則化項を入れることも通常行われるが,今回はいれていない.

$ ./perceptron_binary news20.train news20.test 10 100.0                                                                                                                                                                         
Accuracy: 4472/4996=0.895116
Zerofication rate: 67953/1355194=0.0501426
$ ./perceptron_binary news20.train news20.test 10 1000.0                                                                                                                                                                        
Accuracy: 3958/4996=0.792234
Zerofication rate: 68017/1355194=0.0501899

失敗する場合だけでなく,正解した場合も常に重みベクトルを更新すると,このように,精度ががた落ちになり,しかも,ゼロ化率も低くなってしまうことが分かる.

結論

正則化項のないところでは,マージンを大きくすると精度は上がるが,ゼロ化率は下がる.正則化項のあるところでは,もう少しましな挙動をすると思われるので,この場合は将来の課題としたい.

TokyoNLP #6で発表しました〜言語アフリカ起源説〜

6/25にTokyoNLP #6で発表しました。id:nokuno さんがまとめてくださっています。

発表の中身は、世界の音素の多様性が言語がアフリカから広がる時の連続創始者効果を表しているという、Scienceの論文 を読むというものです。
僕自身、「この言語とこの言語には関連があるんじゃなかろうか」とか思ったときは、確かにまず音素を見るので、「音素を考える」という方針は悪くないと思っています。というわけで、音素について話しだしたら、音声学入門みたいな話に…(汗
全く自分の専門ではない話を、しかも言語処理の勉強会でするということで不安だったのですが、興味をもっていただけた方も多いようで、ほっとしています。
時間がオーバー気味だったので、最後の線形回帰とBICのところは端折ってしまいました。まぁ、最初から説明不足な点も多いスライドだったので、ここは、後で補足するかも知れません。

追記:@takeda25さんがスライドの異音のページに間違いを見つけてくださいました。スライドをreplaceしましたが、6/26 23:00現在、まだr反映されていないようです。6/27 5:00に見たら反映されていました。

僕以外の発表の感想はこちら。

@uchumikさん CRFと素性テンプレート

自分の発表の直前なので、あんまり聞けなかった…(汗
CRFと素性テンプレートのお話。
素性テンプレートは、去年、自分もちょっと使ったことがあるが、ちゃんと説明している文献が少ないので、貴重であると思う…と、思ったが、高村本には、そんな話まで載っていたんだっけ(汗
高村本の5章には、素性テンプレートっぽい話が載っているように見えますが、素性テンプレートに関してだけ言えば、やはり、こちらのスライドの方がよく説明されていると思います。

@niam 音素と発音、線形回帰とBICの話〜言語アフリカ起源説(Atkinson, Science 2011)を読む〜

僕の発表。

@shuyoさん はじめての生成文法(後編)

生成文法の色々ある理論が凄く分かりやすく説明されていて、大変おもしろかったです。
結局、やっていることは、「いくつかの言語で文と非文を分けられる文法を構築する」こと。
そうして得られた文法処理能力を、
1)人間が持っていること
2)持っていることを仮定したとしても、さらに生得的に持っていること
については、生成文法は説明が乏しいな、と感じました。

一定の文法処理能力を人間が生得的に持っていることは確かだと思います。
しかし、人間の文法処理が、本当にそのように行われているのかは分からない→真のモデルはよく分からない。さらに、その真のモデルを人間が生得的に持っていることの証明に乏しい。
僕は、実際には脳科学とかで頭の中の処理を見てみないと分からないんじゃね?と思っています。
ただ、文法理論の一部は、計算機で扱い易い構造を持っていたり、語学教育の場で文法を教えるのにもよい性質を持っているので、有用性は高いと思います。

@y_shindohさん 音声認識向け単語N-gram言語モデリング入門 ?今日からあなたも言語モデラー?

音声認識系の話はあまり知らなかったので、おもしろかった…chasenとか、普通に使われているんですね。

@nokuno 統計的機械翻訳入門 その2 ?フレーズベース編?

SMTの話。高次のIBMモデルが何をやっているかのまとめスライドが素晴らしい。

魔法少女まどか☆マギカの結末はいかに予想されたか:その1

このシリーズでは、魔法少女まどか☆マギカについて、他の記事では、あまり提供できないコンテンツであると思われる「10話までの放送から11話・最終話を予想する問題」について述べたいと思う。

簡単に経緯を説明する。魔法少女まどか☆マギカは、2011/3/11未明に10話の放送がMBSであった後、東日本大震災の影響で、2011/4/22未明まで11話と最終話の放送が休止になった。この一ヵ月半程度の間、ファンは11話と最終話の内容を予想しようという動きが広がった。私もこの予想に参加したものの一人である。早いもので、魔法少女まどか☆マギカの11話・最終話の放送が4/22に終わってから、もう、2ヶ月が経つ。実に感慨深い。

注:この記事は魔法少女まどか☆マギカのネタバレを含みます。

まず、このシリーズで目的とするのは、魔法少女まどか☆マギカを「説く」のではなく「解く」こと−すなわち、評論するのではなく、予想すること−であることに注意して欲しい。評論と予想の本質的な決定的な違いは、「予想」は、11話・12話を見る前にしか出来ないことだ。いかにフェアに注意して考察したとしても、既に結末を知ってしまった状態で「おそらく予想していたら自分はこう考えただろう」という内容と、結末を知らずに考察した内容は異なる可能性があるからだ。従って、11話・12話が放映されてしまった今では、11話・12話の内容を真の意味で「予想」することはもう出来ない。評論することしか出来ないのだ。

僕は評論には興味が無く、予想することに興味があった。それは、魔法少女まどか☆マギカというこの作品が、極めて高い完成度を持っているため、エンターテイメントとして何が重要かを考えることによって選択肢を狭められる性質を持っているからだ。端的に言えば、予想に耐えうる作品なのだ。そこで、僕は、11話・12話の放送日の2日前、4/20未明に、自分は今までの自分の考察をまとめ、様々な説の中から当時一番ありえそうだと思ったものを選び、放送に挑んだ。この記事において【】内は、4/20当時の自分の予想の文章そのままである。

まず、最初に立てた大方針を説明する。




大方針その方針を立てた理由結果
a.鹿目まどかが自らを犠牲にして暁美ほむらを助ける

  1. ファウストをモチーフにしだしたのは虚淵以外の第三者(おそらくイヌカレー)であるという情報がある。これが本当なら、第三者が見てもファウストを連想させるようなエンディングになっているはず。 】
  2. ファウストは、グレートヒェンが自らを犠牲にしてファウストを救う話】
  3. 【ほむら:ファウスト、まどか:グレートヒェンは、まどかの魔女名Kriemhild Gretchenよりほぼ確定】

なお、自分は後で証拠に残るように某掲示板に書き込んだのだが、その時の書き込みをどなたかが魔法少女まどか☆マギカwiki転載して頂けたようである。

b.鹿目まどかは自らの祈りで自分の魔女化をも防ぐ

  1. QB以外で魔法少女になったまどかの魔女化を防ぐことができそうなキャラはいない
  2. QBに関しては、「契約でQBに感情を持たせたら、QBが同情してくれて魔女化しないようにしてくれる」可能性はあるが、いくらなんでもご都合主義的過ぎるだろうという直感。

c.QBはエネルギー問題を解決してQB星に帰る
【作中の世界では,QBを出し抜いたとしても,QBがエネルギー回収ノルマを果たせないとエネルギー不足でやがて宇宙が滅びることになり,問題は解決しない.
だから,誰かがQBのエネルギー回収ノルマをも果たさなければならない.】
×

結論から言えば、a.とb.は当たったが、大方針としてc.を取り込んだためにc.説に符合するように調整した部分は当たらなかった。
まず、だいたい当たったものから見てみる。

a.とb.に従ったため、だいたい当たったもの:

対象 4/20時点での僕の予想 実際
鹿目まどか魔法少女になる願い 【私が魔女になった後、魔法少女も魔女もいない元の世界を返して】(時間を巻き戻すのではなく、暁美ほむらが転校してくる時点の世界から魔法少女と魔女を取り除いたバージョンの世界を新たに作り、今の時間軸の地球に上書きする) 「全ての魔女を、生まれる前に消し去りたい。全ての宇宙、過去と未来の全ての魔女を、この手で」
鹿目まどかが自分の魔女化をも防ぐ方法 全ての魔法少女と魔女がいない世界を願うことで、魔女化した自分自身を消す 全ての魔女を生まれる前に消し去ることを願うことで、魔女化した自分自身を消す
鹿目まどかの最後 暁美ほむらを含め全ての人間から記憶されなくなる 暁美ほむらと鹿目タツヤには記憶がある
「まどか…誰?」を言う役 暁美ほむら鹿目まどかのリボンの入った鞄を見つけてつぶやく) 巴マミ佐倉杏子
鹿目タツヤの役割 鹿目まどかが消えた世界で、まどかの家族に子供が残るようにするための仕掛け 鹿目まどかが消えた世界で、まどかの家族に子供を残し、暁美ほむらとの接点を作るための仕掛け

この中で、当時問題にしている人が殆どいなかったが自分が多大な注意を払っていたものとして、「鹿目タツヤの役割」がある。自分が魔法少女まどか☆マギカの1話を最初に見たとき、「なんだこれは!?」ととても異様に感じたのが、「主人公の弟の3歳児」である鹿目タツヤの存在だった。これについては、後で、何がどのように異様だったか書くかも知れない。

ここでは、完全なハズレになってしまったc.部分について、自分が、いかに、QBにノルマを回収させて星に返すことの出来たかもしれないストーリーをひねり出そうとしたかを読んで苦笑いしていただければ幸いである。基本的な仕掛けは、c.を満たすために、当時はまだそこそこの隆盛を保っていた「ワルプルギスの夜暁美ほむら」説(通称ほむワル説)を応用したものだ。ワルプルギスの夜には、時間軸を移動できる能力があり、それを使って突然出現すると考える。
暁美ほむらワルプルギスの夜になるときに回収できるエネルギーでQBがノルマを達成し、そのワルプルギスの夜鹿目まどかが他の全ての魔女と一緒に倒す−という形にすれば、QBはノルマを達成でき、鹿目まどかは魔女を消して、QBとまどかの間でwin-winの関係を作れるのではないかと考えた。


c.に従ったため、当たらなかったもの:

対象 4/20時点での僕の予想 実際
10話で鹿目まどかの能力が強くなっている理由 契約時の願いの違い 暁美ほむらの時間遡行
ワルプルギスの夜の正体 暁美ほむら暁美ほむらの能力に関連して、時間軸を移動できる能力を持つ 元々は一人の魔女です。そこにいくつかの魔女の波動が合わさって出現したという魔女です(出典:メガミマガジン7月号付録 魔法少女まどか☆マギカCOMPLETE BOOK )
ワルプルギスの夜を倒す方法 そもそも、他の時間軸から突然「具現」して、さんざん街を破壊した後、他の時間軸へ突然移動して消えてしまう性質の魔女である 結界内にいないこと以外は普通の魔女で、暁美ほむらでは歯が立たず、鹿目まどかの願いで「消し去られる」
QBのノルマ 突然他の時間軸からやってきたワルプルギスの夜(ワル夜A)に対して暁美ほむらは戦おう/逃げようとするが、歯が立たずに暁美ほむらソウルジェムが濁る→さんざん破壊したワル夜Aは、また突然、他の時間軸に移動して消えてしまう→暁美ほむらがのソウルジェムが濁りきり、ワルプルギスの夜になる(ワル夜B)。ワル夜Bは、Kriemhild Gretchenに匹敵する魔女であるため、ワル夜Bの誕生によって、この時間軸ではエネルギー問題が解決する。ワル夜Bは鹿目まどかの契約の願いで消される(厳密には、この時間軸の契約時点から後の半直線状の時間に干渉できなくなる)。よって、この時間軸では、QBのノルマが果たされ、魔法少女も魔女もいない平和な世界が実現できて、めでたしめでたし。他の時間軸のことは知らないよ。 鹿目まどかが円環の理になった後も、エネルギー問題は残り、QBのノルマは果たされない
QB エネルギー問題が解決したので、ノルマを果たしてQB星へ帰る ノルマが果たされないので、やっぱり、QBも地球にいる

計算論的メンタルレキシコン


ブログタイトルを計算論的メンタルレキシコンに変えました。

僕の専門は計算言語学自然言語処理)なのですが、自然言語処理の方には「メンタルレキシコン」というのは馴染みの薄い言葉であると思います。メンタルレキシコンというのは、端的に言えば、「人間が覚えている語彙知識の総体」です。例えば、「ある人が覚えている全ての英単語の知識⊆その人の英語のメンタルレキシコン」です。


僕は、修士からずっと、「ユーザが分からなそうな単語を予測して、あらかじめ訳をつけてくれる読解支援システム」を研究にしています。この「ユーザが分からなそうな単語を予測」という部分を追求していくと、結局、「ある人間のメンタルレキシコンを推測する」ということに行き当たるのだと思い、この用語を使いはじめました。大学での研究題目にも「メンタルレキシコン」という語を使っています。次のような代表的な参考書を読んで、勉強しています。

英語のメンタルレキシコン―語彙の獲得・処理・学習

英語のメンタルレキシコン―語彙の獲得・処理・学習

メンタルレキシコンは、第二言語周りのシステムだけでなく、自然言語処理の応用でユーザ適応をする際には重要な概念だと思っています。自然言語処理でユーザ適応をするということは、結局、そのユーザの言語や知識について何らかの仮定を置く、ということだからです。

英語の発音とARPAbet

今週末にTokyoNLP #6で発表させていただくことになりました。
で、その下準備をしていましたが、論文の内容や線形回帰よりも、音素や発音の話の比重のほうが多くなりそう…。
発音上は、母音はopennessとかbacknessの2パラメータ+円唇/非円唇ぐらいを気をつけておけばよい、とか、そういうことは話そうと思います。

で、英語の母音について調べていました。英語の母音には、方言によって色々なmerger(音を区別しないこと)があって、結局、初学者には「どの音とどの音を最低限区別する必要があるのか」が分かりにくいのです。そこで思いついたのが、「とりあえず、Text-to-speech(音声合成)の分野で区別されている音は区別して発音があるのではないか」という発想です。

早速調べてみると、音声合成をする前に、発音すべき音素をコードするための記法としてwikipedia:en:ARPAbetというのがあるらしいです。とりあえず日本語母語話者にとって一番分かりにくそうな単母音の項を見てみると…


Arpabet IPA Word examples
AO ɔ off (AO1 F); fall (F AO1 L); frost (F R AO1 S T)
AA ɑ father (F AA1 DH ER), cot (K AA1 T)
IY i bee (B IY1); she (SH IY1)
UW u you (Y UW1); new (N UW1); food (F UW1 D)
EH ɛ red (R EH1 D); men (M EH1 N)
IH ɪ big (B IH1 G); win (W IH1 N)
UH ʊ should (SH UH1 D), could (K UH1 D)
AH ʌ but (B AH1 T), sun (S AH1 N)
AH ə sofa (S OW1 F AH0), alone (AH0 L OW1 N)
AX ə discus (D IH1 S K AX0 S); note distinction from discuss (D IH0 S K AH1 S)
AE 〓 at (AE1 T); fast (F AE1 S T)

wikipedia:en:IPA_chart_for_English_dialectsなどに比べて、シンプルでとてもわかりやすい!1のあるところがアクセント位置だそうです。

日本語には母音の長短(vowel length)の区別があるので(雪と勇気の「う」の発音時間の長さの違い)、IHとIYのように、長さが明らかに違うものは日本語母語話者には区別がしやすいはずです。逆に、注意しなければならないのは、日本人には全て「あ」に聞こえてしまいがちな、AE, AH, AX, AAを聞き分け・発音し分けられるようにすることが最も重要そうである、と考えられます。

NL研の資料の買い方

日本の自然言語処理に関わる方がその研究を(ほぼ査読なしで)発表する代表的な場として,情報処理学会 自然言語処理研究会,通称,NL研があります.その他に言語処理学会の年次大会がありますが,

  • NL研は年5回ある.東京で行われる場合と地方で行われる場合がある.
  • NL研のフォーマットの方が書ける分量が多い(A4横にA5サイズに縮小した2ページを収めて計6ページ)

という違いがあります.

情報処理学会に属していらっしゃらない非会員の方でも,その論文(予稿)は,次の様にしてネットで購入できるようです.

  • ここに行く
  • 見たい年の見たいタイトルをクリックする.
  • 1件につき,1,2ページ目は,右下の「立ち読み」無料で閲覧できます.残りの4ページが欲しければ,非会員なら630円で購入できます.

実際問題として,残りの4ページまで欲しい論文はそこまで多く無いと思うので,非会員の方は,タイトルや1,2ページ目を見ながら見たい論文を絞り込み,必要な論文を随時購入したほうが安いと思います.

来年の目標

明日から来年ですが、来年の春には、とうとう生まれてから10000日目に達します。10000日目までに準備を整え、10000日目を転機に自分を良い方向に修正するのが来年の目標です。
とりあえず、ブログのタイトルを「10000日目から本気出す」に変えて、ブログのデザインも変えてみました。それではみなさん、よいお年を。