2020年7月28日火曜日

プログラムソースリスト等を綺麗にブログに貼り付ける

 できました。(えっ、今ごろ分かったの?)

 今まで、プログラムのソースリストやデータテーブル(表)を、手っ取り早く画像にして掲載していました。その場合、かなり高解像度の画像にしないと文字が綺麗にならないので、どうしたものか、と思っていました。

 でも、少し調べた結果、テキストのまま簡単に、書式付きで(背景もつけて)貼り込むことができました。HTMLをちょっと編集すればそれが可能なのですが、それが億劫で行っていませんでした。今後、以下のようにテキストで掲載しようかと思います。

 (ただし、このwebページをスマホの画面で見た場合は、横幅サイズがうまく調整されない場合があると思います。そのような場合は、画像の方が有利です。ともかく、本格的にソースコードを公開するのであれば、GitHubを利用ということになるでしょうが、なかなかそこまでは考えていません。)

 取りあえず、以下に、今回のきれいな貼り付けの成果を。

前回記事(こちらです)にあったJavaScriptソースリスト
「植物の種類(区分)毎に、葉の特徴に関する記述をまとめる。」

 

   // “plants_real.json”は、2,965種(別名含む)の植物を記載したJSONファイル

 // 植物の種類(7区分)毎に「葉」の特徴に関する記述を纏める(集約する)

    $.getJSON("plants_real.json"d => {

        var obj = d.plants  //JSONファイルから植物の配列を取り出す

            .filter(p => p.alias == "N"//別名は除く

            .reduce((accx=>//accは集約のための配列、xは個々の植物

                if (!acc[x.group]) acc[x.group] =[]; //groupは種類(区分)

                if (x.leaf.type != ""acc[x.group].push(x.leaf.type);

                if (x.leaf.what != ""acc[x.group].push(x.leaf.what);

                acc[x.group] = Array.from(new Set(acc[x.group]));

                return acc

            },{}); //以上で、objは集約結果の配列となる。{}accの初期設定用

        Object.keys(obj).forEach(k =>//kは種類(区分), obj[k]は集約結果

            if (k != "null"document.write("●"+k+""+obj[k]+"<br>");

        });

    });


上記プログラムの実行結果

●双子葉木本:葉,奇数羽状複葉,掌状複葉,楕円状の,小葉,3出複葉の,長楕円形の,葉腋,旧葉,若葉,掌状に裂けた,3出複葉,棘が大きく,被針形の,細長い,鱗片状の,卵形の,緑白色の丸い,奇数羽状複葉の,葉柄,倒卵形の,奇数羽状複葉で棘のある,常緑樹の,羽状複葉,偶数羽状複葉,線形の,披針形の細鋸歯の,掌状複葉の,革質の,卵形で束生する,2回偶数羽状複葉,葉裏,大きな,丸い,苞葉,白い2枚の,2回羽状複葉,羽状複葉の,広卵形の,3枚の,先が3浅裂した,有毛の,葉脈,3回羽状複葉

●双子葉草本:葉,3出複葉,卵形の,2回奇数羽状複葉,茎葉,奇数羽状複葉,丸い,小葉,複葉の,羽状深裂した,3出複葉の,苞葉,茎や,楕円形の,茎や広卵形の,3小葉,羽状複葉,円心形の,円心形の薄い,葉裏,茎も,茎と,線形の,偶数羽状複葉,心形の,23出複葉,矛形の,披針形の,掌状の,へら形の,裂片が鋭くとがった,小さくて厚い,2回羽状複葉,偶数,ほとんど毛のないへら状の,根生葉,水辺に生え,頂小葉の大きい,長い,広卵形の,羽状に深裂した,葉先,掌状複葉,掌状に深裂する,数回羽状複葉,繊毛のある,上部の,233出複葉,楕円状葉,23回羽状複葉,扁平な肉質の,狭披針形の,下葉,羽状複葉の,2出複葉,大きな掌状の,楕円状被針形の,葉柄,3出羽状複葉,奇数羽状複葉の,細長い,長楕円形の,狭卵形の,掌状複葉の,倒被針形の,羽状深裂した大きい,卵円形の,3角状の,無毛に近い,束生する,偶数複葉,幅広の,葉腋,腎円形の,卵心形の柄の長い,葉身が糸状に裂けた,偶数花状複葉,掌状に深裂した,33出羽状複葉,葉身,大きく丸い,広線形の,狭長楕円形の,裏に灰白色の毛のある,卵状被針形の,茎や波状鋸歯のある

●被子植物:省略

●単子葉草本:省略

●裸子植物:省略

●シダ植物:省略

●単子葉木本:省略

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月23日木曜日

梅雨の合間のアゲハチョウ (Swallowtail butterfly)

Atsugi-shi, Japan,  2020-07-22
It's still rainy season, but sometimes it's a little sunny.
At that time, I saw a swallowtail butterfly. Enjoy this short video!


2020年7月19日日曜日

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

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

2020年7月5日日曜日

Beautiful mountain view comes automatically to your smartphone

revised [Version2, 2020-7-5] [Version1, 2019-12-19]

Abstract
The purpose of this project is to create an application that uses AI (artificial intelligence) to determine that a mountain is now in a beautiful landscape, and automatically notify it to the smartphone. You can enjoy the scenery with a live camera even in a distant mountain. However, the mountains are often covered with clouds, and the weather changes over a short period of time. Therefore, there will not be many opportunities to see the beautiful scenery. The smartphone app described below will automatically notify you when a photo that is so beautiful that you can see it up to the top of the mountain is obtained. Wouldn't it be fun if you received such a notification while drinking coffee?

Outline of the project
The weather in the mountains changes in a short time. Therefore, the scenery is not always beautiful so that you can see the summit. Here, we have created an app that automatically stores only the photos in which the mountain summit is clearly visible. As an example, this app recognizes the scenery of Rishiri mountain that is towering in northern Hokkaido of Japan in real-time and saves good photos. This app incorporates a trained model of this mountain images, but of course, it is easy to replace them with your favorite mountain images. 

Preparing mountain images
For image recognition, we used MIT's Personal Image Classifier [1]. First, we should classify many photos of this mountain into four categories, as shown in Fig1, depending on how they look. For this purpose, we quote images of a live camera [2] installed at the foot of the mountain. Get the image at appropriate intervals and give it a category label, as shown in Fig.1 and Fig.2. For each label, it is good to have more than 10 images. Enter them into MIT's Personal Image Classifier via your PC's web browser.

Fig.1 Classification into four categories

Fig.2 Preparing images for classification training

Training of the recognition model
When the images are ready, perform training as shown in Fig.3. Training takes place on the Neural Network. Adjust the network structure and some hyperparameter values if necessary. At the scale of this example, training usually ends in tens of seconds. Then download the trained model to your PC and use it in the App Inventor program as shown below.

Fig.3 Train our own model using MIT Personal Image Classifier

Using the trained model in App Inventor
The extension (named personalimageclassifier.aix) for using the downloaded model in App Inventor can be obtained from the reference [1]. The usage is very simple as shown in Fig.4. First, set the downloaded model to the Classifier properties, and then give the image you want to recognize to the block for classifying. As a result of recognition, the degree to which the image should be classified into each label is shown. That is, you get a list of label/confidence pairs. Finally, the image is classified into the label with the highest confidence value.

Fig.4 Blocks of the Personal Image Classifier

Getting the weather forecast
Before using this app, it is better to check the weather forecast for this mountain. If the weather is too bad, you can't expect a good picture. Press the button shown in Fig.5 to automatically display mountain weather up to 6 hours ahead. The weather forecast requires parsing a JSON file from OpenWeatherMap [3]. So we use our own JSON Decoding Extension (named FoYoJSON.aix) [4]. Fig.6 provides an overview of it. In order to use OpenWeatherMap, you need to get your own API key.

Fig.5 Checking weather forecast

Fig.6 Getting and decoding weather forecast JSON file

Running the app
An example of running the app is shown in Fig.7. In this case, it was recognized as "Cloudy but looks good" because there are many clouds but the mountainside looks good. Such a case is normal and it is rare to see it well up to the top.

Fig.7 Get an image and then recognize

Automatic notification of good scenery
If you are lucky, you will encounter a scene where you can see the summit as shown in Fig.8. In such a case, the recognition results in "Clear enough to see the summit". In that case, You can know that in two ways. One way is to feel the vibration of your smartphone, another way is to receive an e-mail automatically. If you choose the latter, the recognized image is automatically sent to the registered mail ID. Whichever you choose, if you have a PC nearby you will be able to enjoy the larger, clearer images immediately on your PC screen rather than your smartphone.

Fig.8 Automatic notification of beautiful scenery via email

Probably the easiest way to send emails automatically without human intervention is to use Taifun's extension [5] shown in Fig. 9 but note that it is a paid extension. 

Fig.9 Using an extension to send emails via SMTP without user interaction

Notice
(1) If the live camera image of your choice has a high resolution, you may need to reduce the resolution and pass it to the image classifier.
(2) To get and display the weather forecast, you need your own API Key for OpenWeatherMap. 
(3) If Error_908 is displayed when running the app, please allow access to External_Storage on your Android settings.

References
[1] MIT's Personal Image Classifier
https://appinventor.mit.edu/explore/resources/ai/personal-image-classifier
[2] Live camera at Rishiri Town Hall (in Japanese)
http://www.town.rishiri.hokkaido.jp/rishiri/
[3] OpenWeatherMap
https://openweathermap.org
[4] JSON Decoding Extension by FoYo
http://sparse-dense.blogspot.com/2019/01/a-json-decoding-extension-for-app.html?m=0
[5] Taifun's mail extension (paid)
https://puravidaapps.com/mail.php

2020年7月2日木曜日

係り受け解析は格フレーム辞書に強く依存するらしい

【要旨】3つの係り受け解析器CaboCha、KNP、GiNZAを試用してみて、素人ながら分かってきたことが少しあります。それをここ簡単に書き留めておきたい。

3種類の日本語係り受け解析器
 十分使い込んだとは言えませんが、これまでに、以下の3つの係り受け解析器を利用させていただきました。いずれも、なんらかの自動構築の格フレーム辞書を利用していると思われます。(その具体的な違いは小生には分かりませんが。)

 ・CaboCha(参考資料[1])
 ・KNP (参考資料[2])
 ・GiNZA(参考資料[3])

2つの例文についての解析結果の比較
 今回は、以下の2つの例文について、3つの解析器の解析結果を比較してみます。

例文(ア):葉は柄の長い卵形である。
例文(イ):葉は柄の長い卵形である。


 まず、例文(ア)に対する結果をみます。KNPは、「葉柄の長い」という係り受け関係をきちんと捕らえていますが、CaboChaとGiNZAはいずれも、「長い卵形」と判断しており、妥当ではありません。


 次に、例文(イ)です。これは例文(ア)に出現する"葉"が"虎"に変わっただけです!それだけの違いであれば、係り受け解析結果は変わらないのでは?と思いませんか。結果はどうでしょうか。(ア)の場合の判定結果(○×)が逆転してしまいました。すなわち、KNPは、「虎柄の長い」という不自然な係り受け関係を採用してしまいました。


格フレーム辞書が解析精度を左右する
 上記の解析は、一例(2つの例文のみの)に過ぎません。しかしながら、人間が理解するのと同じく(自然な)係り受け関係を見つけるには、格フレーム辞書(詳しくは参考資料[4][5]を参照)が重要な役割を果たしているようです。参考資料[5]には、「Webから自動構築する膨大な格フレーム辞書は、蓄積が高まれば効果が出てくる反面、どうしても雑音も入ってしまうので、結果的に解析精度は頭打ちになるだろう」という趣旨の記述があります。共感できるように思います。

Google翻訳はどうなっているか
 最後に、上の2つの例文をGoogle自動翻訳(英訳)にかけてみました。妥当な英文を生成するには、適切な係り受け解析が必要なはずです。結論として、2例文とも、妥当な英文になっています。このことから、相当に優れた格フレーム辞書を使っていることが推察できます。

 Google翻訳結果:
例文(ア):葉は柄の長い卵形である。
 -> The leaves are oval with long petioles.
例文(イ):葉は柄の長い卵形である。
 -> The leaves are long ovals with a tiger pattern.

参考資料
[1] CaboCha/南瓜: Yet Another Japanese Dependency Structure Analyzer
[2] 日本語構文・格・照応解析システム KNP 
[3] GiNZA - Japanese NLP Library
[4] 杉本徹、岩下志乃:Javaで学ぶ自然言語処理と機械学習、オーム社、平成30年9月発行
[5] 山本和英:箱庭言語処理のための格フレーム辞書構築の意義

2020年7月1日水曜日

Thank you, AppyBuilder, for a long time!

In my long-time development of smartphone apps, MIT App Inventor and its derivatives, AppyBuilder, and Thunkable, have been very useful. Among them, AppyBuilder completely stopped its service yesterday (2020-6-30). AppyBuilder has continued to offer a uniquely designed GUI and new features.  I would like to express my gratitude to Hossein, who played a central role in this, and to the colleagues who had useful discussions in the community. My first Extension program (with JAVA) was created using the CodeEditor published by Hossein. As many know, AppyBuilder is already on a new path as Kodular. I look forward to further development in the future. Finally, to commemorate, here are some screenshots of some of the apps I've developed so far with AppyBuilder.


I am very pleased that AppyBuilder's CodeEditor is still available in Kodular.  Kodular says "If you are an advanced user, why not code in Java and create amazing Extensions for the Creator?"