NAOの認識コンセプトの上限

サリーやマリーが、即興漫才や謎かけのお題を取得するのは、音声認識機能を使うが、クラウドを全く使わないので、全てローカルでやっている。googleのクラウドなんかも使えなくはないのだが、テレビのスタジオやライブの舞台にネットが繋がるとは限らない。テレビの収録では、ほぼ期待できない。そういうことがわかっているのに、クラウドでしか音声認識ができないというのは、馬鹿げた戦略である。

ローカルでNAOがお題を認識するためには、qichatのconceptを使う。この夏までは、コンセプトに2千数百個を入れて、お客さんのお題に対応していた。少ない。そこで、システムを変えて、日本語wikipediaや数千万のツイートを使って、自力でネタをその場で生成するシステムに変更し、お題の認識可能性も8000語に増やした。それが、10月の初め。

さらに今日、AI的手法で、ウィキペディアやツイートから取得した関連語20000語を識別させようと入力したら、認識のための音素にコンパイルするのに3分以上かかったが、できたのだ。ちゃんと認識する。

NAOのコンピュータは相当古いが、ネタに必要な自作ライブラリやスマホからコントロールするためのHTML5関係のファイルしか入れていないので、メインメモリにもディスクにも比較的余裕があった、ので可能になったのではないかと思っている。

今、実際のネタ作りは、同じローカルネット内のパソコンにお題を送って作成させている。インターネットにつなぐ必要はなく、サリーとマリーとパソコンがローカルネットに繋がっていれば良いので、閉鎖空間でも対応できる。

何れにしても、今日はNAOが2万語以上も識別可能性を持っていることにただ驚愕した。下手すれば、メモリのある限り認識するのではないか。上限が推測できない。まだまだいけそうな気はする。

(その後、2万3千語あたりが、実質的限界であることがわかってきた。それ以上にすると、コンピュータの実行速度が低下する。メモリの誓約だと思われる 2018年11月24日追記)

日本語wikipediaにおける助詞・助動詞の使用頻度

先のいくつかの記事で示しているように、ロボットが知識的文章を短く語る時に、削除した語を繋ぐ助詞をAI的に選択させようとしている。(体言1:名詞・動詞)+(助詞1:助詞・助動詞)+(体言2:名詞・動詞)+(助詞2:助詞・助動詞)の語の並びの中で、体言1、体言2、助詞2が与えられた時に適切な、助詞1を選択させたい。これができれば、うまく、文章を短くできるだろうということである。

そこで、この並びを、日本語wikipediaの前文から拾い出して、それを元に、ディープラーニング用の学習データを作ろうということである。

4語対は、6千万個取れて、語は、word2vecのウェイトベクトルであらわすのだが、そのベクトルを取れる語は、さらに半分以下になってしまう。また、助詞、助動詞部分のパーターンがとてつもなく大きくなってしまう。「の」とか「を」などはたくさんあるが、全体で1回しか現れないようなものも拾ってしまう。これは、広い方のアルゴリズムにも依存するのだが。

そこで、いったいどのような助詞、助動詞が、どのような頻度で現れているのかを調べてみた。

まず、助詞2(ニューラルネットの入力になる)は次のようになっている。

の 	4848543
を 	3418017
に 	3153274
が 	2271523
は 	1676994
と 	1359190
で 	1134953
た 	833487
な 	515517
から 	481586
や 	449712
も 	403445
て 	391692
である 	384000
として 	321609
ている 	278220
には 	264654
では 	242007
ていた 	141653
によって 	117531
であり 	109701
により 	109549
であった 	107166
による 	101919
へ 	97715
でも 	97698
との 	95020
という 	95008
まで 	94623
への 	88007
にも 	87645
ない 	80116
での 	77605
たが 	71719
だった 	71462
など 	69269
ており 	69104
だ 	68336
ず 	64151
などの 	62250
より 	56385
とは 	53537
において 	50758
たと 	47488
からの 	46761
における 	45079
について 	38801
ば 	34365
たり 	33421
に対して 	32896
なかった 	32558
はと 	31786
としては 	31599
か 	31034
に対する 	30519
であると 	30483
としての 	30440
うと 	30412
とも 	29750
とともに 	29742
ていたが 	29645
だが 	29500
などを 	28746
までの 	28607
ながら 	27353
と共に 	26439
へと 	25588
に関する 	25518
だと 	25209
よりも 	24233
であるが 	24219
などが 	23941
ではなく 	23687
については 	23225
であったが 	21177
ているが 	20375
にて 	20046
てきた 	19284
でいる 	19168
からは 	19166
ても 	18992
ていない 	18033
などで 	17049
に対し 	16993
といった 	16725
だったが 	16552
をと 	16238
ていく 	15419
などに 	15401
ていると 	15107
てしまう 	14659
までに 	14412
にと 	14395
においては 	13755
でいた 	13566
ずに 	12898
のみ 	12697
なく 	12433
たものの 	12417
にかけて 	12292

明らかに、代表的助詞型を圧倒している。だから、全部を対象にすることはない。だいたい、上位128個くらいの使い方がわかればそれでいいのではないかと思う。入力に関しては次のようになっている。

の 	6087401
は 	2794515
に 	2311801
を 	1850357
が 	1667993
で 	1144968
と 	1039936
た 	1026311
な 	563759
や 	531865
から 	515033
て 	502233
には 	461876
では 	405320
も 	340662
である 	297177
として 	239221
ている 	200314
という 	145218
であり 	141251
ていた 	140480
との 	135622
により 	135543
による 	124273
への 	116794
での 	114556
たが 	110351
によって 	100663
まで 	99795
などの 	99002
ており 	98666
など 	95691
でも 	91841
ず 	91712
とは 	87425
であった 	78465
ない 	76015
にも 	73529
より 	69404
だ 	67224
において 	65830
からの 	63813
における 	59617
だった 	59331
ば 	53503
へ 	50134
としての 	44902
に対する 	40913
に対して 	40079
だが 	39554
としては 	38818
に関する 	37624
について 	37003
ていたが 	36863
までの 	35317
とともに 	33629
からは 	33043
ながら 	32942
たり 	31465
であるが 	31366
については 	30835
と共に 	30434
か 	28826
はと 	28675
ではなく 	27939
なかった 	27507
といった 	26896
などを 	25960
に対し 	25781
であったが 	25642
よりも 	24764
においては 	24509
ているが 	24095
ても 	22715
にかけて 	22410
にて 	22061
とも 	20988
だったが 	20078
てきた 	18660
までは 	15710
はの 	15630
などで 	15530
たものの 	15429
などが 	15169
うと 	14569
へと 	14314
までに 	14160
にとって 	13547
ていない 	13388
たという 	13324
でいる 	12949
ずに 	12844
についての 	12823
のの 	12695
でいた 	12154
ので 	12077
ほど 	11709
のみ 	11541
であると 	11315
だと 	11167
はという 	11122
がと 	11042
をと 	11024
ていく 	10883
てしまう 	10794
などに 	10719
においても 	10605
にと 	10454
を通じて 	10373
たと 	9804
だけでなく 	9448
ての 	9116
しか 	9065
にの 	9027
によっては 	8952
かの 	8682
であるという 	8620
に関しては 	8216
てしまった 	8172
ほどの 	8126
ていて 	8058
はなく 	8000
からも 	7909
ては 	7779
てくる 	7631
てから 	7518
にという 	7329
つつ 	7309

上位グループの順序は微妙に変わっている。助詞の位置が影響しているのだ。が、上位グループのメンバーはあまり変わらない。

助詞推定AIの改訂(2)

学習データ作成時に、日本語wikipediaからのデータの体現部分はword2vecでウェイト化する。それを、これまで、mariadbに載せたウェイトにアクセスする形にしていたが、そうすると、アクセスのための時間がかかって、マルチスレッドでやっている意味がないほどに、時間がかかった。何しろ、6000万を超える4対語である。プログラムを45スレッド、CPUは24スレッドで処理したのだが、数スレッドしか実際に稼働しなかった。

そこで、元々のword2vecのバイナリファイルから、ウェイトを冒頭に全て読み込んで、データベースへのアクセスを不要にしたら、一挙に処理速度があがった。数十倍早くなったと思う。当初は、十数時間かかりそうだったのに。

助詞推定AIの改訂(1)

ロボットが知識データを言い換える時に、助詞を適切なものに切り替える必要があり、前後の体言や助詞からそれを推計するシステムを作ったと、先の記事で書いた。そのシステムを、いざ、即興漫才システムに組み込もうとした時に、いくつか問題が起こって、最初のデータから作り直すことにした。

まず、助詞だけにして助動詞を対象から外していたのを、加える必要がある。名詞や動詞が連続する場合、1語として扱えるようにする。助詞、助動詞も連続して現れる可能性があるので、それも対応する必要があった。

データ作成は、まず、日本語wikipediaから、元データを作成する。基本的に、文章の中にある、

体言1(動詞、名詞) → 助詞2(助動詞も)→ 体言3→ 助詞3(助動詞も)

という4つの語の流れを拾ってくる。例えば、次のようなものである。

肥満::は::一般的::に
一般的::に::正常::な
正常::な::状態::に
状態::に::比べ::て
比べ::て::体重::が
体脂肪::が::過剰::に
過剰::に::蓄積し::た
蓄積し::た::状況::を

ある生存中::の::当事者同士::が
当事者同士::が::有効::に
有効::に::成立し::た
成立し::た::婚姻::を
婚姻::を::婚姻後::に
婚姻後::に::生じ::た
生じ::た::事情::を
事情::を::理由::として
理由::として::将来::に
将来::に::向かっ::て
向かっ::て::解消すること::を

ペットボトル::は::合成樹脂::の
合成樹脂::の::一種::である
一種::である::ポリエチレンテレフタラート::を
ポリエチレンテレフタラート::を::材料::として

パンダ::は::ネコ目::に
ネコ目::に::属するジャイアントパンダ::と
属するジャイアントパンダ::と::レッサーパンダ::の
レッサーパンダ::の::2種::に対する
2種::に対する::概念上::の
概念上::の::総称::である

この助詞1を体言1、体言2、助詞2から推計しようというのである。後者をword2vecのベクトルデータを用いるなどして入力データに変換して、出力が助詞1のいずれかに推計する。

上記の4語のデータを、日本語wikipediaデータについて、すべてやる。日本語wikipediaデータは、word2vecの時に使用下処理済みデータを用いる。

24スレッドをフル稼働させるプログラムにしたら、10分程度で、全データを処理終えて、4つの語の組み合わせを、63,600,830個拾い出してきた。6千万個以上である。すごい。データは、2ギガくらいのファイルに保存んした。

スティックコンピュータにミニディスプレイをつけた

ミニディスプレイをつけた。解像度は、高くても対応できるのだけれど字が小さくて見えなくなるので、800X600にしている。キーボードとマウスは、その両者ついているbluetoothのミニパッドがつながる。

あとは、sshを有効にして、パソコンからコントールできる。

Intelのスティックコンピュータを購入した: BOXSTCK1A8LFC

ネタの会場に、ロボット二台と、パソコンも運ぶというのがとても面倒だ。サリーとハルのときは、ハルにネタデータの作成機能が入っていたので、ロボット二台のことだけを考えればよかったが、サリーとマリーになってから、ネタ作りコンピュータを会場まで持ち込まなくてはならなくなった。とても面倒。

そこで、もっとシンプルなコンピュータはないかと探すと、スティック型コンピュータというのが安く手に入る。次のような代物を購入した。


インテルの「Intel Compute Stick スティック型コンピューター LinuxUBUNTU搭載モデル BOXSTCK1A8LFC」という名前で、アマゾンで売っているもので、7000円弱の値段だった。まあ、試してみようという意味もある。

もう少し値段が高くて性能のいいスティックコンピュータもあるが、ウィンドウズが入っているので、linuxに入れ替えなければならなくなる。購入したものは、ubuntu-14.04だいぶ古いが、linuxなので、入れ替えが不可欠というわけではないので、これにした。(というか、ネットワークに繋ぐと、400数十メガバイトのアップデートがあるというメッセージが出てくるが、何気にやってみたら、途中でフリーズして、工場出荷時に戻さなくてはならなくなった、笑)

なお、工場出荷時に戻すためには、説明文にもなかったが、電源切った状態で、電源ボタンを押したままで電源コンセントをつないで通電する。しばらくでubuntuの初期化用のページが表示される。

ちょっと動かしてみると、CPUはそれほど悪くはない。印象としては、raspberrypi よりも少しいい感じがする。微妙だが。ただ、ストレージが、ubuntuの工場出荷時のものをストレージの一部に保存していて、いつでも戻せるようになっているぶん、実際のシステムとして使えるのは、10Gもないような感じで、そのままでは使い物にならない。

メインメモリも1Gでは弱い。

マイクロSDカードがさせるので、それを使うことにした。64ギガのものを用意した。昔の癖みたいなもので、fdiskでパーティションを設定して、と思っていたら、partedを使えと言われてしまった。使ったことがないが、使うと、結構便利だった。まあ、それで、全体を一つのパーティションにした。

ここを /altでマウントしてとか思っていたのだが、何しろ、システムの余裕が殊の外なく。ちょっとしたアプリを入れても、容量がなくなり、システムダウンになってしまう。そのほかも含めて、トライアルエラーで、5,6回は、工場出荷時に戻した。その度に1時間以上時間をロスしている。

そこで、こんなことは今までやったことはないのだが、一番システム的に容量を取っている /usrをmicroSDに載せるしかないと思った。/usrを64Gにおけば、まあ、だいぶ余裕が出てくる。ただ、手続きが面倒だ。

まず、/usrにあるものを全部、 cp -rpfa /usr/* /alt でsdに移した。これで、完コピになっているかといえば、多分なっていないんじゃないかと思うが、まあ、他にやり方がわからないのでそうした。

さらにマウントテーブル /etc/fstab に partedで作成したパーティションを/usrにマウントする手続きを記載しなければならない。以下の通りだ。

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#              
# / was on /dev/mmcblk0p3 during installation
UUID=a5973b07-3927-4d2c-8e88-da8c9f63f97d /               ext4    errors=remount-ro 0       0
# /boot/efi was on /dev/mmcblk0p1 during installation
UUID=59AE-C1C8  /boot/efi       vfat    defaults        0       1
# swap was on /dev/mmcblk0p4 during installation
UUID=b6e64128-dd57-461e-9904-43ac60967745 none            swap    sw              0       0
UUID=fb8aede3-36bd-4659-abb7-b7f8f03c7148 /usr ext4 defaults 0 0

最後の行が、付け加えたものだ。UUIDは、パーディションの固有IDだが、取得は次のようにする。/dev/mmcblk1p1と記載されているものは、今回作成したパーディションである。デバイスmmcblk1の第一パーティションの意味。

$ sudo blkid /dev/mmcblk1p1
/dev/mmcblk1p1: UUID="fb8aede3-36bd-4659-abb7-b7f8f03c7148" TYPE="ext4"

あっさり、現在の /usrは削除した。どうせ、何度も何度も工場出荷時に戻しているので、うまくいかなければまたそうすればいい。という、いい加減さ。

これで再起動したら、うまいこと/usrは、microSDにマウントされていた。現時点でのファイルシステムの使用状況は次のようになっている。/usrには、emacsやnetbeans、mariadbなど、apt-get install で重たいアプリをインストールしたが全然余裕である。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/mmcblk0p3   4954848 1992248   2687864  43% /
none                   4       0         4   0% /sys/fs/cgroup
udev              448532       8    448524   1% /dev
tmpfs              92712     732     91980   1% /run
none                5120       0      5120   0% /run/lock
none              463540      76    463464   1% /run/shm
none              102400      32    102368   1% /run/user
/dev/mmcblk0p1     48698    4546     44152  10% /boot/efi
/dev/mmcblk1p1  61256732 4974448  53147564   9% /usr

最後の行に、/usrの 使用状況が記載されている。圧倒的なストレージの余裕感がある。邪道だが /usrの下に、私が所有者になっているフォルダーも用意して、ストレージを使うようなファイルはそこに置いている。

ストレージは以上だが、アプリでも手間取った。何よりも、javaを入れなければならないのだが、まあ、netbeansを入れることによって全てクリアしようとしたが、これがなかなか入らない。まあ、java開発環境が有料化するという大きな変わり目ということもある。いや、関係ないか。古いjdkでもいいのだ。sudo apt-get install netbeansとしてもさっぱりうまくは入らない。(本来は、jdkそのものじゃなくて、実行環境のjreだけでいいのだが、もしものためにnetbeansも入れたという感じ)

jdkとnetbeansをそれぞれのダウンロードサイトから入れようとしたのだが、理由がわからないままにうまくいかない。結局、以下のサイトを参考にして、ほぼうまくいった。
https://websiteforstudents.com/how-to-install-netbeans-on-ubuntu-16-04-17-10-18-04/

ubuntuのバージョンが上記サイトが想定しているものより、一段も二段も古いのだが、ほぼ、そんな感じでインストールできた。

ぞれでも、エラーが発生したのは、netbeansの起動時にjdkのフォルダが見つからないことだった。そこで、

/usr/local/netbeans-8.2/bin/netbeans --jdkhome /usr/lib/jvm/java-8-oracle/

と--jdkhome を指定してやれば、全てうまくいった。これは、環境変数JAVA_HOMEを指定すればいいはずなのだが、なぜかうまくいかないので、これを書いたシェルスクリプトで起動させることにした。素人か!(笑)

あと、mariadbも入れて、ただ、データのフォルダが/var/lib/mysqlになっているので、それを/usr配下に変更する必要があった。これは、/etc/mysql/my.cnfの

datadir        = /var/lib/mysql

を変更し、そこに cp -rfp で元データを丸ごとコピーするだけで済んだ。他のところは、特に容量を取らないのでそのままにした。というよりも、socketの位置などを変えたら、なんだかおかしくなった。私の場合は必要ない。

(追記:実際使ってわかったことで、1ギガとかでっかいデータを入れると、ログもまたとてつもなくでかくなるので、/var/lib/mysql 以下のログフォルダも、新しいmicroSDの場所に移さなくてはならなかった!my.cnfの該当箇所を変更。そうしないとrootパーティションを使い切って動きが取れなくなる)

mariadbのインストールは以下のサイトを参考させてもらった。
https://qiita.com/cherubim1111/items/61cbc72673712431d06e

私のubuntuは14.04で上記のは、18.04で相当違うのだが、ほぼ、その通りにできた。

NAOのUSBをストレージとして使う

NAO2台で、即興漫才はできるようになったが、HALと違って、NAOはCPUもストレージもパワーと容量がない。現在は、ノートパソコン(MAC)を持ち込んで、即興のネタ作りはそれにやらせる形になっているが、ロボットを3台扱うような面倒くささがある。

そこで、CPUパワーはどうしようもないが、NAOのストレージを頭にさせるUSBにできないかと思っている。頭にUSBをさせば醜いが、なるべく短くして、リボンでも飾れば、なんとかなるのではないかと思う。

今、NAOを今日のオーディション用にパッキングしてしまっているので、試せないが、
https://medium.com/@heatherkemp_89938/interfacing-nao-robots-with-the-arduino-in-depth-tutorial-284ecba0b0aa
に手続きが書いてある。全体が面白い記事だが、USBマウントのところだけメモしておく。

(1)NAOにrootユーザーとしてログインしておく。
(2)USBをマウントするフォルダを作っておく(フォルダ名は任意)

# mkdir /mnt/usb

(3)ブロックIDを確認する

# blkid /dev/sdb*
/dev/sdb1: UUID=”04D9–7E06" TYPE=”vfat”

(4)フォルダをマウントする

# mount /dev/sdb1 /mnt/usb

以上である。まだ試していない。

Macのmariadbが動かなくなって

デスクトップMacのmariadbが

Can't read dir of '/usr/local/etc/my.cnf.d'

というエラーを吐いて動かなくなった。確かにそんなフォルダはない。え〜、突然!と思ったが、その前にtelnetをインストールするのにbrewをいじっていた。多分、

$ brew prune

コマンドなんかをやったからのように思うが、よくわからない。結局,

$ brew install mariadb

とやっても、すでに入っていますよと言われ、

$ brew update mariadb

で、バージョンアップしたら、治ってくれた。バージョンが最新だったらどうなったんだろうと思う。

ディープラーニングによる日本語の助詞の選択(2)

先に助詞の使い方を学ばせたAI(ディープラーニングさせたニューラルネットワークというのが長いので、単にこう言うことにする)に与えられたフレーズの中の一つの助詞を選択させた。その一部を下に示している。助詞そのものは、160フレーズくらい取り上げているが、実際には、データの少ない、稀にしか使われない助詞は、AIはほとんど選択しない。

4語のフレーズである。[ ]で表しているのが、実際に使われていた助詞。その次の ( )の中に、AIが推定した助詞と、そのスコアが示している。上位3位までが記載している。結構外しているが、言葉として悪いとまでは言えない。

外国人が日本語を話すとき、違和感のある助詞を使うことが結構あり、それが外国人らしいわけだが、そう言う違和感が少ない方がいい。

まあ、このシステムも使えるのではないかと思っている。100万フレーズで学習させたが、データは、1000万以上あるので、それを使えば、もう少し改善するかもしれないが、何しろ学習時間がかかる。

No.10 ソ連 [ の ] (は:0.3630, が:0.1074, と:0.0657)イスラエル の
No.11 部門 [ は ] (は:0.4477, も:0.0971, が:0.0948)これ に
No.12 伊能 [ の ] (の:0.9223, が:0.0109, と:0.0103)収益 は
No.13 旭天鵬 [ において ] (の:0.5412, が:0.1425, は:0.1016)断髪式 で
No.14 配置 [ は ] (は:0.2043, の:0.1557, が:0.0794)M16 と
No.15 全国野球振興会 [ を ] (を:0.7053, で:0.0437, が:0.0365)務め て
No.16 系統 [ が ] (の:0.5002, は:0.1054, と:0.0645)ナビ の
No.17 上 [ で ] (の:0.2693, で:0.1684, や:0.0647)電波 の
No.18 1954年 [ に ] (に:0.3260, は:0.1242, の:0.0659)パリ国立高等音楽院 に
No.19 右派 [ の ] (の:0.8765, や:0.1142, による:0.0180)政治家 など
No.20 冬期 [ と ] (と:0.4136, は:0.1240, に:0.0923)なる が
No.21 これら [ の ] (の:0.9499, は:0.0109, という:0.0054)培養皮膚 は
No.22 標準 [ の ] (の:0.7044, は:0.0623, で:0.0341)圧縮比 が
No.23 仁王 [ は ] (の:0.2422, は:0.2047, が:0.0913)運慶 の
No.24 愛知県がんセンター [ の ] (の:0.7821, を:0.1101, が:0.0507)研究所 に
No.25 ジェーン [ は ] (の:0.5065, と:0.1337, は:0.1181)アルティメッツ の
No.26 偽名 [ として ] (を:0.8573, で:0.0346, も:0.0249)使っ て
No.27 旅客 [ は ] (の:0.2721, は:0.2641, が:0.0778)大都市近郊区間 を
No.28 幕府 [ は ] (の:0.1775, は:0.1584, が:0.1229)金 の
No.29 恩師 [ の ] (の:0.8917, を:0.0346, が:0.0148)薦め で
No.30 男女共同参画社会基本法 [ の ] (の:0.9504, は:0.0108, による:0.0105)規定 による
データスキップ = 信用格付業者::は::証券取引等監視委員会::が
No.31 139 [ の ] (は:0.3732, の:0.1103, で:0.0970)アメリカ人 の
No.32 段ボール箱 [ の ] (の:0.8884, や:0.0135, を:0.0119)応用 で
No.33 高 [ で ] (の:0.8250, で:0.0346, は:0.0272)火入れ が
No.34 山下敬吾 [ に ] (の:0.5780, と:0.0956, は:0.0678)1敗 の
No.35 大半 [ は ] (の:0.5944, は:0.1356, に:0.0576)ミヤコーバス が
No.36 アリーナ [ は ] (の:0.3456, は:0.1212, と:0.0864)パフォーミング・アーツ・センター が
No.37 料金 [ は ] (は:0.3200, が:0.1131, の:0.1130)30万円 と
No.38 龍造寺隆信 [ の ] (の:0.9836, による:0.0049, も:0.0040)死後 は
No.39 違法 [ の ] (の:0.6740, を:0.0612, が:0.0483)経営 に
No.40 観光道路 [ の ] (の:0.8684, という:0.0395, や:0.0193)性格 も
No.41 ala [ が ] (は:0.2413, の:0.1734, が:0.1581)最大 の
No.42 ストレイト [ を ] (は:0.6187, の:0.0653, を:0.0452)標的艦 と
No.43 夫 [ の ] (は:0.4473, が:0.1373, と:0.0572)ロバート・ロペス と共に
No.44 恩師 [ の ] (の:0.8946, を:0.0244, という:0.0132)薦め も
No.45 反射 [ の ] (の:0.2507, は:0.2121, を:0.1552)前部 に
No.46 肉 [ と ] (が:0.3772, を:0.1449, は:0.1141)驚く ほど
No.47 1985年 [ の ] (に:0.3914, は:0.1182, の:0.0777)ベストセラー と
No.48 持つ [ を ] (を:0.6830, の:0.2856, が:0.0529)筆頭 として

ディープラーニングによる日本語の助詞の選択(1)

ディープラーニングで、名詞と名詞(ないしは動詞)をつなぐ助詞を選択させる試みの中間報告となる。数量的な結果はある程度出たので、メモがわりに書いておこうということである。

すでに示してある、名詞+助詞1+名詞/動詞+助詞2というフレーズのうち、助詞1以外の語から、助詞1を選択するというのが問題である。日本語ウィキペディアから1200万個くらいのこの4語のデータを作ったのだが、このうちの100万語を使って、自己符号器型のディープラーニングニューラルネットを学習させた。

ネットワークのトポロジーは、 563 500 400 300 156 となっている。左から入力ユニット(名詞二つのword2vecベクトル、200x2プラス、選択された助詞2、163個の広い出された助詞のうち、使われたものだけが1になっている。これらが入力データ)で、一番右が出力ユニット数(拾われた助詞1の総数163個のうち、実際に使われていたものだがけが1になっているベクトル)

テストはまだ行っていないのだが、データに対して、どれほどの答えを出しているのかを調べてみた。

結果は、10万個のデータに対して、53.6%の正解を示していた。正解は、選択肢の中で、最大出力が解答と同じである場合である。

じっさい、これには正しい答えというのは、あるようでない。「の」が「は」に変わっても大して意味が変わらないこともあるだろう。他の三つの語が同じでも、助詞はいろいろに変わりうるからだ。

政界のユニットが出力している値のヒストグラムは次の図のようになる。横軸が回答ユニットの出力値の幅で、縦軸がその範囲にある頻度である。

結果をパラパラ見る限り、使えそうな気はしている。教師データを100万個から500万個くらいにあげれば、もっと言いあてるようになると思う。1000万個まで行きたいが、とてつもなく時間がかかってしまう(ただ、この間、ディープラーニングのアルゴリズムやクラス構成、プログラム自体を改良していたのは、教師データを引き上げても、かかる時間以外の、メモリーなどで対応できるようにするためだったのだが)

まあ、まあ、こんなもんだなと言う感じである。実際、どのような文脈で、どのような助詞が選ばれるかについてテストした結果は(まだテストしてないが)、次の記事にする。