29このサイトについて本サイトは舞台に立てるロボットを目指して、私が取り組んでいるプロセスを、主として記憶のために書き連ねているものです。RSSWordPress.orgJavaでtelloを制御するtelloには、独自のプログラミングしステはあるが、UDPでコマンドを送った方が、柔軟性がある。音声認識や、画像処理などで。Javaでシステムができた。試しに動かした画像はこれだ。ドローンドローンをプロキットのドローンもある意味、ロボットの一種だが、いま、プログラムでコントロールするドローンに、強い興味を持っている。先日、おもちゃのドローンを5000円で買って、この間、操縦の練習に部屋の中で飛ばしていた。やりながら、ドローンと人間というのは、なんだか笑える気がしてきた。コントローラーを持っているだけでは、面白くない。いいのは、プログラムで動くようにすることだ。C++とか、Javaて、動かせるのがいい。簡単に見つかるだろうと思って、あちこち探したが、以外にこれが見つからない。そんなに世の中にないということは、間違いない。結局、見つかったのはこれだ。一年以上前に発売されたものだがいまだに人気があるそうだ。組み立てキットのようだが、アマゾンから出ているので、12800円と今のより、少し高いが、注文した。見たが、要は、ドローンと、wifi接続して、ポソコンなどからUDPでコマンドを送れば良いわけだ。動きを制御するコマンドだけではなく、ドローンの状態を得るためのコマンドもある。いうことであれば、Javaであろうが、C++であろうが、プログラムはなんで書いても良い。二分木をどう作るか基本的にKNPの構文解析に依存した形で作る。前は、KNPだけではなく接続詞や助詞などを考慮して二分木の構造を作っていたが、基本、KNPをベースにしその上で、他を顧慮することにする。KNPは、係り受け解析なので、それをどう使うかである。KNPは、文節、タグ、そして形態素解析の個々の要素という構造を持っている。文節とタグはそれぞれ独立した係の番号を持っている。相互に矛盾しているわけではない。その上で基本、文節の係り受けをもとにする。ある文節mから開始するとしよう。再帰構造を前提にする。mのかかり先がm+1だった場合、リストにm+1を加え、次を調べる。次ではなくて、mの係先がm+kだった場合、それまでの文節リストとかかり先をセットにして保存する。このm+1から順に調べて行って、その、最終的なかかり先がm+kよりも大きくなることはあり得る。最終的なかかり先が二つになることはない、ということて、まず、mがm+kにかかっている場合。mまでを部分知識として登録する。m+1以降もそれを繰り返して、m+kまでの部分知識が、すべて確定したら、m+kからの分とそれにかかっているすべての部分知識を含めて、一つの部分知識とする。このアルゴリズムでなんとかなりそうだが。どこまで、KNPが、文法構造を正しく捉えているかがポイントだ。Prolog二分木フォーマットの改訂:ここまできて今更感があるが、一番元々の二分木のフォーマットを変えようという気になっている。最近、11時ごろに寝て、一旦4時ごろに目がさめる。若い頃だったらありえなかったが。それから、寝ながら、いろいろ考えると、アイデアが浮かぶ。そのうちまた、6時ごろまで寝てしまう。アイデアは、新鮮に覚えているというパターン。今朝のアイデアが、二分木の作り方を変えるというもの。いいところまで追い詰めたのに、最近煮詰まった感が出てしまった。(リフレッシュするように、アマチュア無線の3級の免許を取ろうなどと考えてしまっていた。これは、9月29日に試験を受けにいく。恥ずかしく、落ちてしまいそうな気もするが。)なぜ煮詰まったのか。二分木作りのところは、見直さないといけないと思いつつ、結局どこまで行けて、何がやれるのかを見極めるように先を進んでいったが、最後の詰めで、これでは難しいな、と思ってしまって、先に行かなくなった。それで、今朝のひらめきである。気になっていた二分木の作り方をかなりドラスティックに変えるべきだということだ。「二分木構造そのものが、部分知識を表現するものでなければならない」というものである。wikipediaの一つの文章を例示する。「据え置き型の製造機械である産業用ロボットは、それらが動かない限り、ロボットと呼ばれる自動機械であり、人間社会に与える影響も旧来の自動機械と同等と考えられたが、これからの人間社会は移動するロボットからの影響を受けることが想像される」この文章から、今までのシステムで、部分知識を取り出そうとした時、少しもうまく行かなかった。これが、煮詰まりのきっかけである。今のシステムでどうなるかはさておいて、こうなるべきだという、前向きのところから考えていきたい。これをknpで構文解析して、係り受けだけ見てみよう。いままで、係り受け解析は、二分木を作る際に使っていたが、そんなに信頼していたわけではない。これを見る限り、うまく部分知識を表現している。それぞれのブロックが、一つの部分知識を表している。Aでは、「産業用ロボットというのが、据え置き型の製造機械である」こと、Bでは、「動かない限り、自動機械だ」ということ、「人間社会に与える影響も自動機械に過ぎないと考えられていた」ということ、そして、最後がこの文章の一番の要点である。「これからの人間社会は、移動するロボットからの影響を受ける」ということである。部分技を、あるnodeから以下を取り出したときに、部分知識になるように構成したいわけである。二分木の作り方が混乱していた。首尾一貫した構成を実現する。文章を終了させるパターンロボットに舞台で喋らせる時、構成した情報について、文章を短くしたい時、要約したい時が頻繁にあったが、ぶち切れのまま喋らせたりしていた。そのため、文章の終わり方については、とても気になる。これまでに示してきた、wikipediaのprolog化した宣言文での文章の終わり方のパターンを調べてみた。全体的な状況を見ると次のグラフのようになる。縦軸は、文章の頻度だ。(ただし、体言止めは、含んでいない:1割以上が体言止めという感じもあるが、文章の正規の終わり方ではないので除外した)一番多いのは、サ変2というパターンである。例としては次のようなものがある。実現(S:サ/C:抽象物)さ(V:する)れている→実現されている発注(S:サ/C:抽象物/D:ビジネス)した(V:する)→発注した成功(S:サ/C:抽象物)し(V:する)なかった→成功しなかったすなわち、サ変の名詞があって、それにするという動詞の活用形がきて、語尾がある(活用形が原型などの場合は、語尾はない)Vの右側は、動詞の原形である。jumanppが提供する。サ変名詞で終わりたい時は、文章的には簡単である。prolog二分木では、サ変名詞を確実に把握できるので、サ変名詞のあるところでは、自由に、自然に、文章を終われる。次に多いのは、動詞1という終わり方である。これは、動詞を最も単純に使って文章を終わりにさせる方法である。示して(V:示す)いる下して(V:下す)いるこなして(V:こなす)いる用い(V:用いる)られる考え(V:考える)られない言わ(V:言う)れる語ら(V:語る)れた描く(V:描く)いう(V:いう)ある(V:ある)など。jumanppは、動詞の原形を必ずくれるので、動詞が来れば、多様な形で文章を終わらせることができる。原型から、活用形を導き出す場合、原型の最後の1文字を変更するのが基本的な方法だが、「行う」が「行って」と「って」になるパターンがある。このルールが、私には複雑でよくわかっていない。データベースに動詞のパターンを登録しておくのが、一番簡単なように思える。次の「動詞2」というのは、終わりのフレーズに動詞が二つある場合だ。なくなっているなどのパターンである。いるなど、普通名詞とサ変名詞が連結しているパターンである。単純な、終句で終わるパターンは、7位と意外に少ない。これは、ほとんどの場合、ノードの値が終わりになっている場合だと思う。縦軸は、文末に現れる頻度である。みにくいが、圧倒的に「である」が多い。あとはカスみたいなものである。Wikipediaは「である」調なので、デスマス調の場合は「です」ということになる。「である」は、その前の言葉にあまり依存しないとても便利な終わりの句である。否定の時は、「ではない」、受け身の時は、「られる」とかにすればよい。prologのフォーマット上の問題が見つかって、その訂正を一旦保留していたが、先週から数日かけて、全て作り直した。prolog宣言文の数は、17,843,495個あり544個のファイルに分割されている。データサイズは合計11.3Gバイトだ。前にも書いたが、たとえば、いくつかのキーワードを持った宣言文をprologで拾い出そうとすると、一つのファイルの1秒かかる。そこで、一つ一つの宣言文が含むキーワード(名詞や動詞句など、二分木の葉になっているもの)を宣言文のIDとともにデータベース(mariadb)に登録した。すると、intersectコマンドを使って、キーワードを同時に持つ宣言文を拾い出せる。マルチスレッドを利用することを前提に、mariadbのテーブルを25個に分けた。25個のスレッド(java)で、たとえば人間とロボットというキーワードを持つ宣言文を検索させると1秒以下で、すべてのwikipedia本文から、700余の文章(宣言文のID)を拾い出す。データベースの凄さだ。(indexを張っておかないといけない)同時に持った宣言文のIDを拾いだしたら、その宣言文自体が欲しい。そこで、宣言文IDと宣言文そのものを、これまた25個のテーブルにデータベース化した。そこで、人間とロボットというキーワードを持つ宣言文IDを検索し、それを元に宣言文そのものを取り出すためにかかった時間は、1.7秒だ。宣言文IDをつかって、ベタのファイルからその宣言文を取り出そうとすると、これほど高速にはならない。1.7秒は使える範囲だ。ubuntu18.04マシンに、ファイアウォールを設定しようと思って、iptableを探したが見当たらない。ubuntuは、ufwというシステムを使うらしい。頭が古くなっているのを実感する。80/tcpこんな感じで設定する。