ラベル JSON の投稿を表示しています。 すべての投稿を表示
ラベル JSON の投稿を表示しています。 すべての投稿を表示

2020年7月27日月曜日

今さらJSONをJavaScriptで検索?なんて言わないで

【要旨】植物に関する自由形式記述からJSONファイルをJAVAを用いて自動生成しました。その結果のJSONの検索プログラムを、今回はJavaSriptで書きます。初心者の方にとって、ご参考になる点があれば幸いです。

■JSONを扱うならJavaScriptを使うのが普通?
 これまで、日本語の係り受け解析(MeCabとCaboChaによる)を使ってJSONを自動生成するプログラムをJAVAで作りました。その流れで、結果のJSONを検索するプログラムもJAVAで書いてきました。そこでは、ラムダ式とストリームが有効に働きました。

 しかし、JSONは元々JavaScriptと相性が良く、特にwebアプリにする際はJavaScriptの方が何かと便利かも知れない。そこで、今さら、という思いもあるのですが、いくつかの形態の検索をJavaScriptで作成してみました。具体的な方法はいくつかあるのですが、今回はjQueryを利用します。結論としては、JAVAの場合とほぼ同様の書き方でできました。

 JAVAで実施した場合の記事は以下にあります:
(対象としたJSONファイルの説明はこの記事の後半にあります。)

■JavaScriptによる検索(上記JAVAの場合の3例に対応)
 以下にソースコードを示します。JAVAの場合と同様に、.filter、.map、.reduce、.forEachなどを使っています。従来型の書き方と比較すると、このような検索をするのに、明示的なforループが全然出てきません。(テキストで綺麗に表示する方法が分からないので、画像にしてあります。)出力は、上記のJAVAの場合とほぼ同じ(形式が若干異なるが)になりましたので、省略します。

↑葉が"倒披針"で、花が"白"または"紫"の植物
↑掲載されている植物の果実の種類(type)を重複なく列挙する
↑植物の種類(区分)毎に、それに属する植物の葉の特徴を纏める

 こんな感じでJSONを検索できるので、フォームやボタンをつけて、ユーザフレンドリーな検索画面は作れそうですね。

2020年7月19日日曜日

植物の自由形式説明文からJSON形式テキストを自動生成(まとめ)

 これまで、植物の自由形式説明文からJSON形式テキストを自動生成して、多様な検索を可能とする試みについて書いてきました。8回くらい連載してきたと思います。今回は、これを分かりやすく(ポスター形式で)纏めてみました。

2020年6月26日金曜日

日本語係り受け解析を有効活用するために(その2)

 前回の(その1)では、約3,000件の短い文について、係り受け解析とJSON自動生成を試みました。そのノウハウに基づき、今回は、やや長めの植物記述文について検討します。

■国内希少野生動植物種:ムニンノボタン
 国内の希少植物ムニンノボタンについてです。小笠原諸島父島にだけ生育する日本固有種で、平成16年国内希少野生動植物種に指定されています。その葉や花や果実の特徴を図1に示します。図中に示したWebサイトから引用させていただきました。


■ムニンノボタンの説明文
 参考資料[1][2][3]を基に、小生が作成した説明文を以下に示します。少し長いですが、その葉や花や果実の特徴を記したつもりです:

「ムニンノボタン:http://www.ogasawara-syokubutusi.com/koyuusyuZUKAN/koyusyuZUKAN/muninnobotan.htm:明瞭な3本の脈がある葉は両面にまばらな剛毛をつける。4枚又は5枚の花弁を持つ白い花が7月から8月頃に次々と咲く。小笠原が涼しくなる頃に直径1センチほどの丸い果実が実る。」

■係り受け解析(CaboChaによる)の結果
 上記の説明文を入力として、CaboChaによる係り受け解析を実行した結果が図2です。全体が木構造(tree)となり、最後に出現する述部「26 実る。」が根(root)となります。文の順序を反映して、述部「8 つける。」は「18 咲く。」に、そしてそれはさらに根に係ります。


■JSONテキスト生成の方法
 上記の解析結果を基に、図2のノードのうち、黄色く表示した「葉」「花」「果」について、それぞれ、タグtype, what, howをもつJSONテキストを生成します。その詳細手順は(例外的処理も必要ですが)省略しますが、基本的に表1のようにノード(文節)を連結し、タグの値として設定します。色分けは、図2に対応しています。なお、実際のJavaプログラムは、先祖(predecessor)、あるいは子孫(successor)を辿り集約する再帰的な構造になります。プログラミングの演習問題としてもよいかも知れません。


 例外はありますが、概ね、タグtypeには種類等が、whatには色や大きさや形状が、そしてhowには配置・接続状況や出現時期等が対応するはずです。

■JSONテキストの自動生成結果
 上記のようにして、JSONテキストを自動生成した結果が図3です。「葉」「花」「果」に関する3つのタグの値(連結したテキスト)は、いずれも妥当であることが確認できました。


■まとめ
 このような類いの記述からJSONテキストを自動生成することにより、原文のコンピュータ処理(種々の検索やグループ化等)がかなりしやすくなるはずです。その一例を以下に示します。参考資料[4](掲載植物約2,100種)から、ムニンノボタンを検索してみます。実際には、参考資料[4]にある一行記述約3,000件をJSON化したもの(現時点では未公開)を使います。以下のようなキーワード検索で一発でヒットしました!

●検索クエリ(葉の3本の脈と、白い花がポイント)
        jsonStream  //植物オブジェクトのストリーム
        .filter(p -> bQ(p,"leaf","3") && bQ(p,"leaf","脈")) 
        .filter(p -> bQ(p,"flower","白")) 
        .forEach(p -> pP(p));  //ヒットした植物の表示
[↑詳細については、過去記事をご参照ください。]

●検索結果(以下の1件のみヒット)
ムニンノボタン(双子葉木本)葉は長楕円形で3脈明瞭で、白い花が咲き、丸い蒴果がつく。


参考資料
[1] 新宿御苑 希少!ムニンノボタンの花
[2] 環境省 自然環境・生物多様性 ムニンノボタン
[3] 小笠原植物誌 ムニンノボタン
[4] 渡辺 坦:植物の名前を探しやすいデジタル植物写真集


2020年6月19日金曜日

植物に関する自由記述のJSON化とJavaラムダ式とストリーム(B)

前報(A)の続編です。

(2020-6-21, [検索例(その3)]を追加しました。)

■今回の進展
 約3,000行の自然言語による自由形式記述(参考文献[1]にある、植物の一行記述)から、その内容を反映するJSONテキストを自動生成しています。原文に対して係り受け解析を行い(CaboChaにより)、それに基づいてJSONを生成します。係り受け解析結果とJSON生成結果の妥当性検査と、それにもとづいた原文の一部変更という作業を続けてきましたが、このほど終了しました。
 まだまだの状態(JSON自動生成のバージョンはVersion 0.5)ですが、一通りできましたので、以下のとおり、再度いくつかの検索を行ってみました。

■自動生成JSONテキストに基づく植物の検索例
 最初の例は、「葉が"倒披針"を含み、花が"白"または"紫"を含む植物」です。検索する主要部は下図のように、Javaの1ステートメントですみます。図中で、jsonStream1は、自動生成したJSONファイルをストリーム化したものです。メソッドbQやpPは小生作成のものです。妥当な検索結果が得られているはずです。

 
 次の例は、「果実のタイプ(type)」を列挙するというものです。上記のその(1)では、.filterと.forEachを使いましたが、ここでは、.mapと.collectを使っている点が違います。概ね妥当(係り受け解析結果の解釈に一部少しの不具合がありますが)な結果のようです。すなわち、このデジタル植物写真集に現れる果実のタイプを概ね列挙しているはずです。


 最後の例は、植物の区分(カテゴリ)毎に"葉"の特徴の記述を集約したものです。多少、処理は複雑にはなりますが、JavaのStreamを処理する強力なgroupingByメソッドのおかげで、見通しのよいコードが書けます。



■今後は...
 以上のとおり、植物の葉、花、果実に関するいろいろな検索が少し楽にできるようになったと思います。一方、現状では「穂」や「樹皮」や「茎や根」に関しては、まだJSON生成の対象としていません。今後検討したいと思います。

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

2020年6月14日日曜日

植物に関する自由記述のJSON化とJavaラムダ式とストリーム(A)

本記事は、(その3)の続編ですが、少しタイトルを変更しました。

■今回の問題設定
 参考資料[1]には、植物を見つけるための1行記述が2,965行(ただしこのうち849行は別名)掲載されています。すなわち、実質約2,100種の植物が掲載されています。そのうちの2例を図1に示します。ここで、例えば、「葉に"楕円"を含み、花に"白"を含む植物」と、そうではなく「果に"楕円"を含み、花に"白"を含む植物」を見つけたいとします。


 単にキーワードとして"楕円"や"白"を含む行を探索するのでは、明らかに妥当な結果が得られません。そのため、自由記述文に形態素解析と係り受け解析を施し、それを基に適切にJSONテキストを生成し、それを使って探索すべきということになりました。

■係り受け解析とそれに基づくJSON化は容易か?
 上記のようにして、係り受け解析結果をJSON化することは、実際に行ってみるとそう簡単ではありませんでした。それは、係り受け解析結果が、原文の意味とは異なるケースが少なからずあるからです。その多くの場合、原文に句読点を補う(1文に含まれる複数の単文の区切りを明確にする)こと等で解決しますが、時にはどうしても原文を変更せざるを得ませんでした。その作業は、1行づつ人手で確認しながら進める必要がありました。約3,000行ありますので、1日100行づつ根気強く、確認変更作業を進めています。約1ヶ月かかりますが、まもなく完了します!

 自由に書かれた文の自然言語解析には色々な困難があります。係り受け解析も、簡単なルールだけでは処理仕切れず、機械学習を行っているはずです。人工知能を搭載して、華々しく街へ繰り出した自動運転車もすでに死亡事故を何件か起こしています。学習データの周到な準備は必然ですし、人手による評価修正のフィードバックが必要な状況は続くでしょう。今回のように、3,000件くらいやってみてようやく、自然言語処理の本質が少し見えた来たような気がします。

■Javaで自然言語解析する良さがここに現れた
 このように、まだ試行途中なのですが、これまでの作業結果をもとに、上記で設定した問題をやってみました。すなわち、以下の探索を可能にするJavaプログラムを作成しました。
 (1)葉に"楕円"を含み、花に"白"を含む植物
 (2)果に"楕円"を含み、花に"白"を含む植物


 詳しいことは略しますが、図2において、jsonStreamは、生成したJSONテキストをストリーム(stream)化したものです。このストリームの中味は、JSONオブジェクトです。そうなると、ラムダ式を使ったfilterや終端処理としてのforEachの出番です!Javaを使った自然言語処理の良さがここにも現れた気がします。

■生成したJSONテキストの概要
 未完成ですが、図3のようなJSONテキストが、係り受け解析結果から自動生成されましたので、ご参考までにその一部をご紹介します。(このJSONテキストは、整形すると全体で約55,000行になります。小生の研究用に生成したものですので、当面、公開はしません。)


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

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年3月2日月曜日

Decoding JSON by using new Dictionary Blocks

This article demonstrates the use of new blocks called Dictionaries [1] in MIT App Inventor. These blocks were announced in the releases nb181c and nb182 (February 18, 2020) and are mainly used for encoding and decoding JSON files.

By the way, I previously developed a JSON Decoding Extension. Examples of its use are shown below:
Another example using JSON Decoding Extension

In the following, I use the new Dictionaries to decode JSON file for the same example. This app displays the weather forecast using OpenWeather [2]. Here, I show the weather forecast for Sapporo City in Japan every 3 hours up to 5 days ahead. Fig.1 shows an example of JSON text output from OpenWeather. Some parts are folded in the figure, but if all are expanded, there are 1,341 lines.


Fig.2 shows an application that takes all the values for tags surrounded by a red frame in this JSON text and displays them on the smartphone. Namely, values for the city name, time, temperature, and weather are displayed. To use OpenWeather in this application, you need to obtain your own API Key.


This application uses Dictionaries blocks to decode JSON text. First, get the city name "Sapporo" as shown in Fig.3. The JSON text obtained from OpenWeather is processed by a web block, and the result is made into a list structure. (global jsonL). Next, the city name is obtained by the "get value at key path" method of the Dictionary block.


Next, to extract all the weather forecasts (time, temperature, description) every 3 hours, use the procedure shown in Fig.4. First, traverse the array that is the value of the "list" tag by specifying "walk all at level". The resulting list (global subList) is used in the subsequent blocks. For example, to get all the temperatures and put the result into a list structure, use the "list by walking key path" method. At this time, the element given as an argument is a list of (walk all at level, main, temp). Here, the order of the list elements is important. It is necessary to carefully specify the order while looking closely at the hierarchical structure of the JSON file. I think Fig.5 will help you understand it.




As a result of the above tests, I found that the new "Dictionaries blocks" can efficiently decode JSON files, similar to the "JSON Decoding Extension" described above.

References
[1] MIT App Inventor Dictionary Blocks
http://ai2.appinventor.mit.edu/reference/blocks/dictionaries.html
[2] OpenWeaterMap API guide
https://openweathermap.org/guide

2019年1月19日土曜日

A JSON Decoding Extension for App Inventor (2)

[Dec.6, 2019] For your convenience, another example is shown below:
https://sparse-dense.blogspot.com/2019/12/another-example-using-json-decoding.html

In the previous article, I introduced a JSON Decode Extension to easily extract the necessary information from the JSON file received from a Web service. This time, in order to test this Extension, I created a simple book search application. There are many applications of this type, but the concern here is how easy it is to decode JSON files.


Results from the book search app
The created application is as shown above. It shows the search results of one English book and two Japanese books. Giving a few keywords, Google Book Search searches for books and returns the results in JSON text as shown below. In this example, I set to receive only one book out of hit books.


JSON text sent back from the web service (a part)
For example, in the first search, "Galois" and "Groups" were given as keywords. The resulting Json text is shown above. "title", "authors", "publishedDate", "thumbnail" and "description" are extracted and displayed from this data. The program is shown in the figure below. This is all of the source program. Therefore, it can be said that this is made quite compact.

Complete App Inventor source program of the book search

However, there is still room for improvement. For example, the current Extension receives the following list individually as a search instruction string.

query for title -> "items,volumeInfo,title"
query for authors -> "items,volumeInfo,authors"
query for publishedDate -> "items,volumeInfo,publishedDate"
query for thumbnail -> "items,volumeInfo,imageLinks,thumbnail"
query for description -> "items,volumeInfo,description"

This is a little inefficient. The values ​​of tags at the same hierarchical level should be collectively received as follows. In the near future, we plan to revise the extension so that we can respond to this. That way, you can make this application even easier.

query for several items -> "items,volumeInfo,[title,authors,publishedDate,description]"
query for thumbnail -> "items,volumeInfo,imageLinks,thumbnail"

2019年1月18日金曜日

A JSON Decoding Extension for App Inventor (1)

[Dec.6, 2019] For your convenience, another example is shown below:
https://sparse-dense.blogspot.com/2019/12/another-example-using-json-decoding.html

[This Extension and  its doc are available. Please see the bottom of this article.]

JSON format is commonly used when receiving data from Web services, etc. With App Inventor, JsonTextDecode in the web block can convert JSON to list structures. Then, the conversion result can be manipulated by the selectItem and lookUpInPairs of the list block. However, as Evan W Patton (MIT) pointed out in the paper [1], these list processes are generally very complicated. And he also suggested a more readable and compact Extension block to alleviate this. 

I independently developed an Extension for JSON decode based on his new block idea. This Extension might be intuitive and easy to understand because it can hierarchically acquire necessary information with the tag names (properties) without using complicated operations on nested lists. The outline is shown in the figure below. (please enlarge and see the figure.)




This Extension takes two arguments. One is JSON data that was converted into list structure. The other is a search instruction list for hierarchically specifying the value of a specific tag (property). In this example, JSON text holds the values ​​of four kinds of sensors as "healthData". In the above figure, the name of the third sensor is specified. Note that in the query list, a number such as "3" indicates the element index of the JSON array structure.

Query List : John, healthData, 3, sensor
Result : Systolic pressure

JSON data used here is a modified version of the health data published in the following document [2]. The following figure shows the part of listing up all four sensors and their values ​​using this Extension. I think that it is written concisely. Operations for complicated list processing are not appeared here.


Collecting values of the four sensors



An example of running this application is shown below. For details, please see the files shown below.


Result of the test program on Android


Within this Extension, the list structure is iteratively processed using the function of YailList [3]. I think that YailList makes somewhat relaxation of complicated data type conversion (casting)  in JAVA. This Extension is still in beta. Although some of the JSON structures have been tested, all the structures are not covered, so bugs may be included. However, it is shown below for your reference. It was tested with Nexus 6 (Android 7.1.1). This extension was created using AppyBuilder Code Editor [4].

References

[1] JSON Interoperability in MIT App Inventor
https://2018.splashcon.org/event/blocks-2018-papers-json-interoperability-in-mit-app-inventor
[2] http://georgepavlides.info/ehealth-made-simple/
[3] http://3nportal.com/AIBridge/API/com/google/appinventor/components/runtime/util/YailList.html

[4] AppyBuilder Code Editor
http://Editor.AppyBuilder.com