2020年5月29日金曜日

田植えのシーズン

 本日は5月29日(2020年)です。散歩に出かける近くの水田では、ちょうど田植えがほぼ終わったところです。さっそく、アオサギもやってきました。小魚かカエルを狙っているようです。作業していた農家の方から、余って田んぼの隅においてあったイネの苗を少しいただき、家の小さなガラスコップに入れて、田んぼアート気分です。

田植えしたばかりの田んぼへやってきたアオサギ(厚木市郊外)

ガラスコップたんぼアート(イネの苗)

2020年5月23日土曜日

植物に関する自由記述からJSONを自動生成(その3)

 前回の(その2)の続編です。

ねらい
 植物の特徴を1行で簡潔に記述した文から、その内容を反映するJSON形式テキストを自動生成する試みです。これによって、高度な検索や、植物の世界の特性の集合を求めたりすることができそうです。方式の概要は以下のとおりです。
  • 内容が簡潔に圧縮されているので、自然言語解析にとっては難しそうであるが、CaboChaによる係り受け解析をベースにJSONを生成する。
  • JSONのタグは、"葉"、"花"、"果"のそれぞれについて、type、what、howとする。
  • 係り受け解析の結果は、右端の文節を根とする木(tree)になるので、その部分木を根や葉の方向に適宜だどり、辺どおしの関係も考慮しながらJSONを生成する。
解析と生成の例
 以下において、対象となる原文はすべて、参考資料[1]にあるものを利用させていただきました。まず一例として、「シロモジ」に対する説明の原文、係り受け解析結果の要約、および、JSON(tag : value)生成結果を示します。(この例は、解析と生成がうまくできる易しい場合です。もっと難しいケースは多数あります。)
-----------------------------------------------------
【例:原文】
シロモジ:葉は3中裂し、黄色くて小さい花が咲き、丸い液果ができる。
【係り受け解析結果の要約】
0→1  葉は |  名詞-一般, 助詞-係助詞
1→5  3中裂し、 | [0] 動詞-自立, 記号-読点
2→3  黄色くて |  形容詞-自立, 助詞-接続助詞
3→4  小さい | [2] 形容詞-自立
4→5  花が | [3] 名詞-一般, 助詞-格助詞-一般
5→8  咲き、 | [1][4] 動詞-自立, 記号-読点
6→7  丸い |  形容詞-自立
7→8  液果が | [6] 名詞-一般, 助詞-格助詞-一般
8→E  できる。 | [5][7] 動詞-自立, 記号-句点
【Json(tag:value)生成結果】
<葉> type:葉, what:how:3中裂し
<花> type:花, what:黄色くて小さい, how:咲き
<果> type:液果, what:丸い, how:できる
-----------------------------------------------------

*2020-05-26現在、JSON生成法を改善して、多少、性能が上がりましたので、以下改訂してあります。

植物の一行記述33例についての解析とJSON生成
 上記方式の解析と生成の性能を調べ、その課題は何かを把握するため、約3,000行(約3,000種の植物)の記述(参考資料[1]で示されている)のうちから、33例を対象として実験を行いました。実験結果を要約すると以下のようになります。原文に軽微な変更(句読点の追加)を許容するとすれば、33件のうち、約82%(=27/33)で正常にJSON生成ができたことになります。(->詳細な結果は後の方にあります。)

(a) 原文のままで、正常にJSON生成 -> 17件
(b) 原文に句読点を追加することで、正常にJSON生成 -> 10件
(c) 原文の助詞等を置き換えることで、正常にJSON生成 -> 5件
(d) 妥当な係り受け解析結果を得るために原文の一部を書き換え -> 1件

 以上のうち、(b)は、原文に含まれている複文(主語と述語の組が複数)の区切りを、係り受け解析がうまく判断できなかったためです。複文を単文に切り分けることは、(b)のように単純に句読点を追加すれば済む場合もありますが、一般にはそれでは済まない場合も多く知られています。
 また、(c)のケースは、人間が意図した意味が伝わらないという問題です。本格的な対応としては、もっと意味解析が必要かもしれません。

感想
 上記の問題(c)(d)を扱うには、(深層格フレーム辞書を用いるような)意味解析も必要かとも思いますが、このような植物記述の分野で考えた場合は、もっと単純に意味を対応づけるための辞書を使う方が実用的とも思います。
 JSON生成アルゴリズムの不備は、試行しながらかなり改善できました。

33件の解析結果の詳細(変更しました:2020-6-2)
 上記に述べた、33件の解析とJSON生成結果ですが、ここに記載していましたが、取り止めました。もう少し完全な結果が得られた後に(全3,000件への適用結果の分析後に)改めて概要を報告したいと思います。

参考資料
[1] 渡辺 坦:植物の名前を探しやすいデジタル植物写真集
http://plantidentifier.ec-net.jp


2020年5月14日木曜日

植物に関する自由記述からJSONを自動生成(その2)

 前回(その1)の続報です。(続編(その3)はこちらです。)

改良点
 植物の特徴が自由形式で一行に記述されたテキストから、その内容を反映するJSONファイルを自動生成するJavaプログラムに関してです。今回、以下の点を改良し、適用範囲を広げることを試みました。

  • 着目する項目は、前回は"葉""花"としたが、新たに、"果""茎"を追加した。
  • 文節の考察の結果、JSONのタグ"What""How"に、新たに、"Type"を追加した。
  • 係り受け解析結果の木構造の下方、上方への辿り方の不備を是正した。
  • JSONタグの値を設定する場合、文節を構成する各単語の品詞も判断材料とした。

改訂版の実行結果の例
 今回は、前回よりも内容が複雑と思われた以下の3文をテストに用いました。前回同様、参考資料[1]から引用させていただきました。

  • ヒシ3角状の葉が水に浮き、白い4弁花が咲き、角のある核果ができる。
  • ヒメカンゾウ根茎があり葉は広線形で、黄橙色で一重の花を数輪つける。
  • トランペットフラワー茎は太く高く、葉は長楕円形で、漏斗状の大きな花が下向きに咲く。

 以下に、これらの原文に対して、自動生成されたJSONを示します。ただし、表記を簡単にするため、JSONのメタ記号({ }, [ ], " ")を省略していますが、タグとその値は忠実に生成しているつもりです。

(注)下記「ざんねんな生き物たち」をご参照ください。


 上記の3文に対する係り受け解析の結果も以下に示します。


ざんねんな生き物たち
子供向けの本「ざんねんな生き物事典」の人気が高いそうです。ちょっとざんねんなところがあるが、憎めない生き物たち。今回の係り受け解析にもそのようなものが...

 上記の2番目の「ヒメカンゾウ」のJSONタグ "花-How"の値が、"黄橙色で数輪つける"という、ちょっと不自然な結果になっています。原文は、"黄橙色一重の花を数輪つける"です。しかし、係り受け解析は、"黄橙色で"->"一重の"ではなく、"黄橙色で"->"数輪つける"と判断してしまいました。ここが「ざんねんな」ところでした。もしも、原文が、"黄橙色一重の花を数輪つける"でしたら間違えなかったのですが...

感想
 改訂版の効果をある程度確認できました。渡辺坦氏のwebページには、上記のような原文テキストが約3,000行(植物名が3,000種)程度もあります。今回の改訂版でも、恐らく、その1/3くらいしか、うまくJSON自動生成はできないと思われます。さらなる検討を進めたいと思います。
 恐らく、係り受け解析に続けて、意味解析(深層格構造)をやらないと、この辺りで行き止まりになりそうです。実は、上記のようにJSONのタグ構造を生成するために、簡易的な意味解析(に相当すること)はやっています。しかし、そのやり方では限界があるということが分かってきました。

参考資料
[1] 渡辺 坦:植物の名前を探しやすいデジタル植物写真集
http://plantidentifier.ec-net.jp


2020年5月12日火曜日

植物に関する自由記述からJSONを自動生成(その1)


自然言語処理を学んで何をしたいか

 日本語の文は表現豊かで、自由度の高い書き方ができます。ですから、その解析はとても難しそうですが、近年その研究はかなり進んでいるようです。ここでは、そのうちの、係り受け解析(Cabocha等による)[2]を利用して、植物の特徴を一行で自由記述した文の内容を、自動的にJSONファイルに変換するJavaプログラムを作成しました。

 以下の2つの例文は、参考文献[1]にあるものを使わせて戴きました。ここでは、"花"と"葉"についてのみ着目することとしました。"花"と"葉"のそれぞれについて、JSONでは、タグWhat(色や形など)とHow(葉や花の付き方等)を用意しました。

 実行結果を以下に示します。これらの例文に関する限り、うまくJSONを自動生成できたようです!



JSONの自動生成を可能にした係り受け解析
 上記のJSONファイルを自動生成できたのは、以下に示すような係り受け解析の結果を得ることができたためです。基本的な戦略は、この図で赤色(ピンク色)はWhatに対応させ、青色(水色)はHowに対応させることです。


 実際、作成したプログラムは、上図に色分けした文節を、JSONの対応タグの値にマッピングするのが主な役目でした。久しぶりに、Javaプログラムを書きました!しかしながら、一筋縄では行きません。上記の2例はうまく行きましたが、うまく行かないケースもだいぶ分かってきました。

Google Translateではどうなのか
 上記の結果を得て喜んでいる場合なのか?例えば、Googleの機械翻訳では、日本語を完全に構文解析(句構造や係り受け構造)、意味解析、文脈解析もしている筈です。そうでないと正しい英文は作れないでしょうから。以下のとおり確認してみました。まだまだ、Googleの解析には及んでいないと思いますが、上図のような構造を得て自分用のアプリを作成するには、独自にプログラムするしかない。
(1)アオヤギソウ
原文:広線形の葉が茎の下部につき、黄緑色の花が円錐状に咲く。
Google : Broad linear leaves on the bottom of the stem, yellow-green flowers in a cone.
(2)アガパンサス
原文:葉は線形で厚く、茎先に漏斗状の紫色の花が輪生する。
Google: The leaves are linear and thick, and the funnel-shaped purple flowers form a ring on the tip of the stem.

今後
 他の植物記述の文についても、順次適用して、課題を洗い出し、改良を進めていきたい。うまく、JSONファイルができれば、高度な検索や植物の特徴に関する統計解析などに使えるような気がします。

参考資料
[1] 渡辺 坦:植物の名前を探しやすいデジタル植物写真集
http://plantidentifier.ec-net.jp
[2] 杉本 徹、岩下志乃:Javaで学ぶ自然言語処理と機械学習、オーム社、平成30年9月発行

2020年5月8日金曜日

初歩の雑談対話システムをAndroidで作ってみました(その2)

 先の記事(その1)は、元々Javaで書かれた雑談応答システムを、MIT App InventorによりAndroid版にしたものです。今回は、さらに別のAndroid用の雑談対話システムです。これは、参考資料[1]にある、Therapist Botチュートリアルに従って作成するものです。

 ここでは、英語を対象としており、BOT(コンピュータ)の応答は、先の記事(その1)よりもシンプルなルールで構成されています。すなわち、以下の図に示すとおり、ユーザ入力テキストに現れる人称の変換結果に適宜修飾句を付加した文か、もしくは、予め用意された無難な文(hedge sentence)のどちらかを、BOTが出力します。ただし、応答に多様性を持たせるため、乱数による選択を基本としています。


 このチュートリアルはこのように、あまり複雑なものではありませんが、雑談対話システムの基本的な枠組みを作ることができます。そして、その後に、これを発展させることを各自が考えるように誘導しています。そのためのヒントを多数例示しています。また、App Inventorの強力なテキスト処理ブロック(例えば、replace all mappings in text preferring longest-string-first order等)に馴染む例にもなっています。

補足:
 このチュートリアルは、Artificial Intelligence with MIT App Inventorのシリーズ[2]の一つとして作成されています。これまでに公開されているのは以下の5つです。
  • Introduction to Machine Learning: Image Classification(学習済みモデルの利用)
  • Personal Audio Classifier(ユーザ自身が作る音声学習モデル)
  • Personal Image Classifier(ユーザ自身が作る画像学習モデル)
  • Rock Paper Scissors tutorial(マルコフモデルでジャンケンに強くなる)
  • Therapist Bot Tutorial(簡単な雑談対話システム)

参考資料
[1] Therapist Bot Tutorial
https://appinventor.mit.edu/explore/resources/ai/therapist-bot
[2] Artificial Intelligence with MIT App Inventor
http://appinventor.mit.edu/explore/ai-with-mit-app-inventor


2020年5月7日木曜日

初歩の雑談対話システムをAndroidで作ってみました(その1)

要旨】自然言語処理と機械学習をJavaで学ぶための優れた書籍があります。その中に、形態素解析を利用した雑談対話システム(Therapist BOTのような)作成の演習問題があります。その仕様に沿ったAndroidアプリを自作しました。具体的に作ることで、課題や発展の方向が見えてきます。

雑談対話システム
 人間とコンピュータが自然言語で対話するシステムは最近注目されています。明確な目的を持ったシステムとして、コンピュータの操作や情報検索、チケット予約や口座開設・解約、一般事務手続き等々に使われるものもあります。一方では、何気ない会話で心を和ませるといった雑談対話システムがあります。このような雑談システムは、Therapist BOT(セラピストボット)として、実際に運用され効果をあげています。

 雑談対話のルーツは、1960年代にMITで開発されたELIZA(イライザ)にあるようです。これは現代のような機械学習などにはよらずに、パターンマッチングに基づく規則で生成した応答文を返すものでしたが、その後の対話システムに大きな影響を与えたとのことです。このような背景のもとで、本記事では、自然言語処理の勉強の一貫として、雑談対話システムを取り上げます。

Javaを用いて自然言語処理の理論を理解する
 現代の自然言語処理は、機械学習と深い関係を持っています。その理論を勉強する場合に、例題をプログラムとして実際に作成して理解を深めることが重要です。そのために、ここでは図1に示したテキスト[1]を用います。多くの人々がPythonでプログラミングするのに対して、小生は、Javaを愛用しています。このテキストは、読み返すほどに深みの増す説明と、それをJavaプログラムで丁寧に補強している点が素晴らしいです。


形態素解析に基づく初歩の雑談対話システム(Java利用)
 SiriやGoogle Assistantなど、おなじみの対話システムが既に存在しますが、ここでは、自然言語処理を理解する一貫として、初歩的なものですが自作します。上記テキストには、かなり深い一連の自然言語解析が説明されています。ここでは、そのうちの、浅いレベルの解析である形態素解析を基にした雑談システムの例を使います。これは、Java言語で約360行(コメントと空白行を含む)程度のコンパクトなプログラムです。形態素解析には、MeCabを使っていますが、それ以外は独自に作成しています。その要点は以下のようです。

  • 疑問文か叙述文かを判定
  • 名詞(一般、サ変接続、固有)をトピックとして抽出
  • 質問文の場合は、5W1Hを考慮してトピックと組合せた応答文候補を作成
  • 叙述文の場合は、トピックの前後に適当な言葉いれた応答文候補を作成
  • 入力に含まれるキーワードを独自辞書で置換
  • その置換とトピックを組み合わせて応答文候補を作成
  • 曖昧で無難な言葉を乱数で決めて応答文候補を作成
  • 上記で応答文候補を作成する場合、それぞれに一定のスコアを与える
  • ただし、そのスコアにも乱数を付加して候補選択に多様性を持たせる
  • 以上のようにして、最終的にスコアが最高の応答文を採用する
  • キーワード対応辞書や付加文の強化により応答の質は向上させられる

MIT App Inventorを使った雑談対話システムとする
 上に述べたJavaプログラムの仕様に沿って、MIT App InventorでAnroid用アプリを作成しました。App Inventorには、この仕様を実現するためのテキスト処理ブロックは十分に備えられています。ここで問題は、形態素解析のMeCabがそのままでは使えないことです。しかしながら、調べた結果、幸いにも、Web用にMeCab APIが使えることが分かりました。そのうちの一つである[2]を使うことで、解決です。その部分を図2に示します。


作成した雑談対話システムの実行例
 作成したAndroid版の雑談対話システムの実行例を図3に示します。ユーザ入力とコンピュータの応答は以下の通りでした。なぜその応答になったかは、図中の説明をご覧いただきたく。

  • あなた:私の名前は神太郎です
  • BOT:私の名前はAkanです。
  • あなた:お元気ですか?
  • BOT:はい!
  • あなた:運動はいいですよ
  • BOT:なるほど
  • あなた:夏はまもなくですね。
  • BOT:そろそろ夏ですね。


 とても実用的とは言えませんが、上記の受け応え、何とか成り立っているようにもみえます。上にも書いたとおり、適用分野や利用目的に応じて、キーワード対応辞書や、付加文の補強によって、これよりは良くして行くことは出来そうです。また、今回は、形態素解析結果の情報しか利用していませんが、さらに、係り受け解析や意味解析、文脈解析など深い解析を利用することも考えられます。必ずしも甘くないように思いますが、それらについては、別途報告したいと思います。

 なお、英語を対象とした、これよりも少し単純な別の雑談対話システムの例もあります。こちらもご覧下さい。

参考資料
[1] 杉本 徹、岩下志乃:Javaで学ぶ自然言語処理と機械学習、オーム社、平成30年9月発行
[2] MECAPI - MeCab Web Service (MeCab API)
https://maapi.net/apis/mecapi

2020年5月5日火曜日

かっての同僚らとオンライン懇親会

 新型コロナウィルス対応のため、緊急事態宣言が継続されている状況で、ビジネスミーティングや学校、大学の授業もテレワーク、オンライン。そんな中でも、オンライン飲み会、オンライン懇親会なども報じられています。

 小生は退職して2年になるのですが、かっての職場の同僚から、オンライン懇親会へのお誘いがきました。グットアイディア!嬉しいですね。Zoomを使うとのことですが、やったことがありません。でも、小学校でもこれで授業をやっているそうですから、ちょっと練習して参加しました。

 かっての同僚たちと、顔を合わせながら、言葉を交わすのは楽しいことです。みなさん、あまり変わっていないようです。自分自身もそう思っているのですが。自宅ですから、自前のお酒を飲んでいる人もいました。私も、(今や高い酒ではない)ジョニ黒の瓶を写して、「私もやっています」と伝えました。

 この夜の参加者は、小生退職後赴任された方も含む14名ほどでした。途中入退出自由。以下のイメージ(イラスト)、コミPo!(商用利用可能版)で適当に作ったものですが、どこかご本人に似ている場合もあるような気がします!?


 利用したZoomですが、セキュリティ上の問題が指摘されているようですが、それを越えた利便性の高い優れたソフトウェアだと思います。Zoom社では、現在はセキュリティ保護を優先して開発を継続中と聞いています。さらなる発展を期待したいと思います。また、他にも、Google Meetなど、バージョンアップされたオンライン会議システムがあるようです。