2018年10月28日日曜日

私には嬉しい「Javaで自然言語処理」

 機械学習全般に、そのソフトウェアの多くにはPythonが使われており、この分野ではそれが必須となっているようです。確かに、行列や数値計算やグラフ出力などで強力な機能を備えており、簡潔にプログラムを記述できます。ですから、私もPythonを使って学んだり、プログラムを書いたりしています。

 しかし、一方では、長年使ってきたJava言語の魅力は捨てがたいものがあります。そんななかで、小生が最近取り組んでいる「自然言語処理と機械学習」をJavaで学ぶという書籍が発売になりました。内容はとても精緻に書かれている印象があります。当然ながら、広く使われているMeCab、CaboCha、LIBSVM、word2vecなどのツールやライブラリも、Pythonの場合と同じように、Javaと連携しています。私にとっては、とても嬉しい書籍なので、これも学びます。

私にはうれしい書籍が発売になった

2018年10月27日土曜日

自然言語処理をMATLABで楽しむ(その3)

 単語のベクトル表現により、単語間の加算や減算ができることを利用します。

 前回(その2)では、日本語Wikipediaの全文の全単語のベクトル表現化を行って、指定した特定の植物に最も類似する植物を見つけました。うまく行った例を5つ示しましたが、失敗の場合もあります。失敗のパタンはいくつかありますが、同音異義語もその一つです。

 同音異義による類似検索失敗の例を以下に示します。「サワラ」という植物に最も近い類似語として、魚の「オヒョウ」が出力されました!「サワラ」という魚がいるためです。

植物の「サワラ」の類似語検索の結果です。ウヒョゥ!困りました。


 ここで思い付いたのが、以下の類語検索例です。「男ではないが、王子のように振る舞う女の類義語」または「男で王子のような人は、女ではどんな人」を検索するには、以下のように、単語(ベクトル)間の加減算を使えばいい。

  most_similar(positive = [ '王子', '女' ], negative = '男' )
  →  (‘王女',  0.6557) good !

 これに習って、植物の(魚ではない)「サワラ」の類語検索をします。つまり、「魚のサワラのようなのは、植物ではどんなの」を探します。

  most_similar(positive = [ 'サワラ', '植物' ], negative = '魚' )
  →  (‘コナラ',  0.7683) good !「コナラ」は植物!

 この検索結果を、画像でも主観的に確かめてみます。以下のとおり、まずまずです。


2018年10月26日金曜日

自然言語処理をMATLABで楽しむ(その2)

 テキストで表現された植物の特徴事典から、類似植物を見つけられるか?

(最後の方に、「類似度」とは何かについて追加しました。)

 これをやってみたいと思います。ここでは事典として、植物に限らず、広く社会科学、工学、理学、医学等の膨大な用語を解説している「日本語Wikipedia」を用います。そのテキスト全文(公開されている)から全ての単語(名詞、動詞、形容詞など)を切り出し、それを多次元(ここでは次元削減後の100次元)ベクトル表現したものを用意します。それらベクトル間の類似度で、単語どうしの類似性を判断します。以上は、現代の自然言語処理の定番のやり方なのであります。

 日本語Wikipedia全文のテキストは、xml形式の圧縮版で2.75GBあります。その中の全単語をベクトル表現化したものは、どこかで公開されているかも知れませんが、今回は自分で全部作ることにしました。解凍、テキスト化、形態素解析を行い、分かち書きの結果をWord2Vecでベクトル表現化しました。それら全体に要したパソコン(Core i7, 3GHz)の処理経過時間は、実に約5時間でした!(その間は、コーヒータイム&クラシック音楽鑑賞なので問題なし。)

 その結果何ができるかと言いますと、例えば、テキストとして与えた、植物名「クヌギ」に対して最も類似度の高い言葉(恐らく植物名になる)を見つけられます。結構うまく行った類似検索結果を以下に5つ示します。
  • 「クヌギ」に最も類似するもの→「コナラ」(accuracy 0.90)
  • 「リンドウ」に最も類似するもの→「キキョウ」(accuracy 0.87)
  • 「ホタルブクロ」に最も類似するもの→「ムラサキケマン」(accuracy 0.88)
  • 「カラマツ」に最も類似するもの→「アカマツ」(accuracy 0.94)
  • 「サワグルミ」に最も類似するもの→「アカガシ」(accuracy 0.88)

 繰り返しになりますが、この類似度検索は、テキストで書かれた情報だけを使っています。画像などでの判断は全く行っていません。ですから、この類似度判定結果が妥当かどうかを、主観的に画像による形態比較で判断してみます。以下がその結果です。Very Goodではないでしょうか。

 これらの画像は、以下のURLにあるものを使わせていただきました。
 渡辺 坦 氏による「植物の名前を探しやすいデジタル植物写真集」
 



  まとめとして、日本語Wikipedia(このテキスト情報だけ)を使って、指定した植物名に最も類似すると思われる植物名を特定できました。もちろん、いつもうまく行くとは限りませんが、上記の5題の結果は、いくつかの可能性を示していると思います。

-------------------------------
 ここまで来たところで、「類似度」とは何かを確認したいと思います。上記と同じ、Wikipediaを使った「夏」と「休暇」の類似語検索結果は以下のようになりました。

  • 夏 → 春(0.90)、冬(0.88)、秋(0.87)
  • 休暇 → 休養(0.69)、休み(0.69)、育休(0.67)

 これは、現代の自然言語処理(単語のベクトル表現化)で主流となっている「分布仮説」が使われているためと思われます。すなわち、「単語の意味は、その周囲に出現する単語によって形成される」ということです。ですから、例えば、「夏」と「冬」は全く違うじゃないかと思うかも知れませんが、両者は文章の中で共に近傍に出現するか、あるいは良く似た文脈に出現する確率が高いことを示しています。また同様に、「休暇」と「休養」が別々に出現する文章があった場合、それらの文章は同じような文脈で使われることが多い。すなわち、「休暇」と「休養」のまわりに出現する単語は似ている、と考えられるのです。
 上記の植物の説明文において、植物学上の分類や葉の形状や花の色、等々に関する多数の単語の出現具合が似ているかどうかで類似度が決まるはず。このような背景を踏まえて結果を眺める必要がありそうです。

2018年10月21日日曜日

自然言語処理をMATLABで楽しむ(その1)

(最後の方に、Word2Vec Word Embeddingを追加しました。)

 現代の自然言語処理は、機械学習(Deep Learningを含む)が重要な役割を担っているようです。しかし、この記事は、難しいことを言うのではなく、楽しんでみようというつもりで書きます。ここでは、MATLABを使います。というのも、その最新版(R2018b)のText Analytics Toolboxでは日本語対応の機械学習機能も提供されているからです。もとのテキストの前処理や、解析結果のビジュアル化なども含んでいます。
 何か実際のまとまった日本語のテキストデータを対象としたいですね。ここでは、以下のWebサイトを利用させていただきました。

植物の名前を探しやすい デジタル植物写真集(作成:渡辺 坦 氏)
http://plantidentifier.ec-net.jp

 植物の名前を探し出して、その説明を見つけるためのサイトです。「大まかな特徴から細かな特徴へと段階的に見て探す」、「花の色によって探す」、「葉の形状によって探す」等々などが提供されています。豊富な写真も掲載されています。また、「植物の名前で探す」のセクションには、約2,500の植物それぞれについて、その特徴が1行で簡潔に記述されています。葉の形状や花の色などを含めて、特徴が自由形式で書かれています。JsonやXmlなどのフォーマットではなく、まさに自然言語の様式なのです。具体的には、以下のような記述が約2,500行あります。
 
 ... 前省略
 ムキュウギク: ゲンペイコギク の別名
 ムギワラギク: 葉は被針形で、花茎先に盛り上がった総苞片が開く。
 ムクゲ: 先が3浅裂した葉が互生し、紅紫色の5弁花が咲く。
 ムクノキ: 葉は長楕円形で、丸い核果が黒紫色に熟す。
 ムクロジ: 偶数羽状複葉、花は黄緑色で、飴色の袋に黒い核がある。
 ムサシアブミ: 3出複葉が2枚あり、あぶみ状の仏炎苞が出る。
 ムシクサ: 葉は狭被針形で、葉腋に白い4弁花が単生し、蒴果がつく。
 ムシトリナデシコ: 葉は長卵形で花は薄紅色で萼筒が長く花下の茎が粘る。
 ムシトリビランジ: 根生葉は線形で、紅紫色で花筒の長い5弁花が咲き蒴果がつく。
 ムシヨケギク: 葉は羽状に細裂し、舌状花は白く筒状花は黄色い。
 ムスカリ: 葉は細長く、ブドウの房のように青く丸い花がぶら下がる。
 ムツオレグサ: 淡緑色の小穂のついた枝が花茎に密着し細長い花序となる。
 ムニンノボタン: 葉は長楕円形で3脈明瞭で、白い花が咲き丸い蒴果がつく。
 ムベ: 葉は革質の掌状複葉で、楕円形の液果は割れない。
 ムユウジュ: 羽状複葉の小葉は長楕円形で、赤橙色の花が散形状に咲く。
 ムラサキ: 根は暗紫色で太く葉は被針形で、花冠の5裂した白い花が咲く。
 ... 後省略


 MATLABのText Analytics Toolboxでこのテキスト全体を解析してみます。まず、単語の出現頻度解析です。原文を一定の前処理を行って整形したあと、形態素解析して単語を切り出し、単語をベクトル化し、と言う手順を含みます。その結果として得られたWord Cloudが以下の図です。この結果は、単語間の相互関係には関知せず、単に単語の出現頻度の高いものを大きく表示しただけです。しかし、これだけでも、このテキスト全体の概要をよく表していると思います。

2,500の植物の特徴記述における単語出現状況 - Word Cloud

上の左図からは、「花」や「葉」や「...状」を主題として書かれたテキストであることが分かります。また、右図には、左図に項目に関する色や大きさについての形容詞が示されています。これらの図だけでも、約2,500行の文書に対するある種の要約になっていると言えるのではないでしょうか。

 次に、もう一歩踏み込んで、この文書全体を解析します。トピックモデルというやつです。難しそうですが、LDA(Latent Dirichlet Allocation)という手法が、関数呼び出し一発で使えるようになっています。これは、文書のなかから自動的にトピックスを見つける(潜在的な意味を見つける)というものです。MATLABでは、"An LDA model discovers underlying topics in a collection of documents and infers word probabilities in topics"と書かれています。 さっそくやってみます。もちろん、トピックスのキーとなる単語などは全く指定していません。結果は以下の通りでした。(幾つかのパラメータにより変動します。)


LDAにより自動的に発見(抽出)された3つのトピックス

 先に示したWord Cloudで出現頻度の高かった「花」、「葉」、「...状」を中心としたトピックスが示され、それぞれを形成する単語の出現頻度(確率)が示されています。例えば、「花」と「葉」のトピックスはちょっと微妙ではありますが、花の色や葉の形状がおぼろげながら纏められているようです。また、「...状」のトピックでは、葉や枝の付き方などの状況がある程度示されているように思われます。応用としては、これらのトピックスにある値(特性を表す単語)を手がかりに、特定の植物の特徴を与えて検索することに繋がるかも知れません。

 さらに奥へ進んでみます。Word2VecによるWord Embeddingです。だんだん、混沌とした未知の領域に入って行く感がありますが、可能性は感じ取れます。下図のように、形態素解析後の有効な単語(word)をベクトル空間へ埋め込みます。この場合のベクトル空間の次元は、形態素解析後の語彙の数になり、単語のベクトル成分は、その単語の周りにくる他の単語の出現確率を反映しているはずです。埋め込み結果の一例を以下に示します。(拡大してご覧下さい。)


 100次元ベクトルを、t-SNEによる2次元scatteringでプロットした図なので、近くに見える単語のベクトルが必ずしも近い(良く似ている)とは言えませんが、それらのベクトルの成分(単語の出現確率)のいくつかは近いはずです。一例として、図の赤枠内にある、近くにある3つの単語に関して、その出現元の文を示します。

 マルバアオダモ: 奇数羽状複葉の小葉は卵形で鋸歯不明瞭、花は白く果実は披針形。
 ハマクサギ: 葉は広卵形で、花は白→淡黄と変わり、丸い核果が黒紫に熟す。
 ギンバイカ: 葉は卵形で芳香があり、長い雄しべが多数ある白い5弁花が咲く。

確かに、3つの植物の葉の形状(卵形)と花の色(白)に共通的な記述がありました!とりあえずGoodですね。
これら3者の写真(Wikipediaより引用)も確認します。主観的にも、上記の結果は納得できそうです!


2018年10月14日日曜日

Java(JDK)有償化で大学等での教育研究に支障はあるか

 Java(JDK)の有償化が話題になっています。大学等での、Javaプログラミング教育、研究への適用に支障があるでしょうか。当方の検討、実証結果(Windows10の場合)を示したいと思います。(誤解や独断、偏見もあるかも知れませんが、ご容赦ください。)



 結論:特段の問題はありません。Java 有償化の後も、無償のままで(アップデートも提供され)、使い続ける道があります。当方で現在使っているJavaの教科書(立木・有賀「すべての人のためのJavaプログラミング」第3版)のJava 例題、練習問題のソースリスト(総計約300 件)はそのまま、コンパイル/実行できます。当方で実証済みです!具体的には以下のとおりです。

 検討の経緯の詳細は下記にあります。
https://www.i.h.kyoto-u.ac.jp/users/tsuiki/javaEveryone3/link.html
(ここに掲載されている「本書を解説した文章」の「付録」をご覧ください。)

 要点は以下のとおりです。

  • すでに、Eclipse の最新版(Pleiades Eclipse 2018-09 版)には、オープンソースのAdoptOpenJDK11 が組み込まれています。このJDK はOracleJDK11 とほぼ同等です。すなわち、本書の例題等は(GUIのためのJavaFX 以外は)全てそのままコンパイル、実行できます。
  • JavaFX は、OracleJDK にはバンドルされていたので、そのまま使えたのですが、AdoptOpenJDK にはJavaFX は含まれていませんでした。しかし、ご安心を。これにもオープンソースのOpenJFX というのがあります。少しだけ手間がかかりますが、これをAtoptOpenJDK11 に組み込みました(add-modulesの設定が必要)。
  • その結果、JavaFX の利用も含めた本教科書の例題等(総計約300 件)は、問題なくコンパイル/実行できるこことが確認できました。
  • このAdoptOpenJDK11 は、2018 年9 月〜2022 年9月までのLTS としてアップデートの無償提供がなされます。その後の、JDK12 以降も同様であるとのことですから、安心してJava の教育、研究への活用に使えるでしょう。

2018年9月28日金曜日

稲刈り直前のたんぼの小さなカエル

 すっかり少なくなってしまった近所の田んぼを散歩。稲刈りがだいぶ進んでいます。しかし、まだ稲穂がたわわに実ったままのところもあります。その稲穂の間に、とても小さな(全長が稲穂の米粒3個くらいの)カエルを見つけました。なにかほのぼのとした気持ちにさせてくれます。

全長が稲穂の米粒3個くらいの小さなカエルを見つけた

 この写真を例によって、スマホのアプリ(Microsoft Visual Recognition呼び出し)にかけてみました。見事な認識結果でした!稲の葉や稲穂もたくさん写っているのに、葉の色に似たこんな小さなカエルを見つけています。a green frog on a leafという認識は、これを見た人間の認識と変わらないように思います。恐らく、ほとんどの人は、この写真をみた場合、稲穂や葉っぱに目を向けるのではなく、「わあー、小さなカエル!」と驚きを持って見るはずですね。



2018年9月22日土曜日

北海道の大地震の被害とITによる支援

 北海道の大地震(2018-9-6発生)では、懸命な救助、救援活動も届かず、土砂崩れなどで多くの方々が亡くなった。心より哀悼の意を表します。また、大規模停電や液状化などで非常に大きな災害を受けられた方々にもお見舞い申し上げます。

 このような状況では、地図情報提供(デジタルマップを含む)、ドローンによる映像分析、情報通信の確保などは特に重要と思われます。これらのITは、今回ももちろん相当に利用された訳ですが、今後さらに、即応性や幅広いニーズへの適応性などの面で一層の改善、進展が望まれると思います。

 札幌市清田区にある大きな市営霊園である里塚霊園(約2万6千区画)のお墓の約20%が、この地震のために倒壊したり、倒れかかっているとの情報がありました。(個人的な事項ではありますが)私の家のお墓もこの一区画にあります。しばらく、行っていないので、心配でした。

 札幌市では、個々の区画の墓石の状況を調査して、市のホームページに掲載しています。これはありがたい行政サービスです。そこには、被害の確認された区画番号とマップが載っていました。それだけだと、場所の具体的なイメージを持てませんでした。そこで、さらに、下図のようなGooge Maps(Google Earth)をズームアップして照合した結果、私の家の墓の区画位置を具体的に突き止めることができました。幸い、被害が確認されたリストには載っていませんでした。

札幌市清田区の里塚霊園(約26,000区画)Google Maps
一例:区画番号図面があれば、Google Mapsを拡大して照合できる
(この画像は大震災の前のもので、特定のお墓を写したものではありません
)

 お墓は、通常は穏やかな場所ですから、Google Mapsを更新する必要性は低いわけですが、このような大災害が発生した場合は、局所的にドローンを飛ばして、マップ映像を提供してもらえたら非常にありがたいと思いました。より進んでは、ドローン運営会社が、一般市民に対してオンデマンドで映像を提供してくれるサービスがあるといいと思ったりします。プライバシーや関連法令が立ちはだかっているのかも知れませんが。

2018年9月17日月曜日

Javaは無かったが、特異値分解はあった

 現在では、分からない用語やあやふやな事項を調べるのに、webは欠かせません。手っ取り早く、Wikiペディアを利用する人も多いようです。しかし、今から20年〜30年前は、紙の書籍や辞典が重要な位置を占めていました。(今でもその事は失われていないと思います。)情報科学の分野では、当時の日本の研究者の英知を結集して編纂された岩波の情報科学事典(1990年)が有名でした。

1990年5月発行(全1171頁、今では珍しいしおり紐2本付き、定価7000円)
 今やAI(人工知能)の全盛期。しかし、それはこの辞典に載っているような知識や技術の上に築かれているにちがいない。最近、Deep Learningのうちの自然言語処理を学んでいて、単語に関する共起行列、PPMI行列がでてきた。その次元削減のために行列の特異値分解(Singular Value Decomposition)が重要な役割を果たしている、と。この特異値分解、大学で学んだはずだが、その後ご無沙汰していて、今となっては曖昧な記憶しか残っていない。そこで、それをこの辞典で引いてみました。情報科学の重要な事項として記載されていたその内容は、簡潔で的確であり、(とりあえず)自分を納得させました。具体的な計算法などは、必要に応じて、さらに別の数学書で調べればよいのです。(どの環境でも特異値分解ライブラリは用意されているので、その必要はないかも知れないが。)

 ところで、1990年と言えば、まだJava言語は世の中にでていなかった。Java 1.0のリリースは1996年のはずですから。念のため、この辞書を引いてみましたが、やはり何も出ていません。実用プログラム言語の「用語の木」のノードには、Fortran、Cobol、Algol60、Algol68、PL/1、Pascal、C、C++、Lisp、Prolog、Smalltalk等々の懐かしい言語ばかりが並んでいました。

 情報科学の進歩は著しい。もしも、この辞書の改訂版が出るとすれば、Javaも当然、掲載されるでしょう。「特異値分解」も脱落することは無いだろう。その他の普遍的な知識や技術も同様に永遠であろう。ただし、その後の新興技術の進展は質的にも量的にも半端じゃないので、辞典の改訂には想像を絶するエネルギーを要するであろう。

2018年9月11日火曜日

英文記事も増やしていきたい

ブログを書いていると、やはり、どのくらい読んでいただいているか気になります。そして、時としてコメントを戴いたりするととても嬉しいです。誰に向けて記事を書いているのかというと、一定の想定もありますが、そうでない場合も多いです。自分の感心事と自分の知識を整理する機会として利用している、といったところでしょうか。

ところで、Deep Learningや先進的なプログラミング関連の話題は英語で入手することが多いです。ですから、これらに関しては、私としても(拙いものながら)英文の記事を増やすことを心がけています。その方がより広い読者を得られるはずだからです。以前よりは、英文記事を増やしました。その効果は確かにありました。

外国からのアクセスがだいぶ増えてきました。下記は、このブログへの最近の1週間(2018/09/04〜2018/09/11)のアクセス(ページビュー回数)状況です。(今週は偶然、特別に増えたのかも知れませんが)米国や欧州からもアクセスが増えてきたようです。少し前に書いた記事に対してもアクセスが増える場合があります。最近では、micro:bit、AI、App Inventor関係の記事を読んで戴いているようです。

今後、さらに適切な題材を考え、より正確で明快な英文になるようにブラッシュアップして掲載していきたいと思います。

本ブログへのアクセス状況(直近の1週間分)

2018年9月10日月曜日

Rainbow in the sky, that's right !

I saw a rainbow after a long absence. On this day when the rain stopped, a rainbow appeared, drawing a large arc near my house. Rainbow will be taken as a good sign in any country. It will not be a bad sign at least.

A picture taken with a smartphone camera

Anyway, I took a photo with a smartphone, but the whole sky is cloudy and the rainbow is not so clearly visible. It is as the picture above. If you would like to add a title to this picture, how would you describe it? Perhaps it will be "a rainbow in the sky" etc.


Then, how about image recognition by modern artificial intelligence? The result of recognizing this picture by calling Microsoft's Image Recognition via a smartphone is shown below. This application was created using Thunkable (Thunkable Classic for Android). The result is very brilliant. This recognizer should recognize images in Deep Learning's CNN (Convolutional Neural Networks) and then generate captions using LSTM (Long-Short Term Memory).

Recognized by a smartphone app as "a rainbow in the sky" 

Next, I tried using another image recognizer, the IBM Watson services. This is not a smartphone application, but I ordered from the command line as follows. Recognition results obtained as text (Json format) are as follows. In this case, classification of the image is done, and caption is not granted in particular, but "rainbow" is correctly recognized like Macrosoft.


Recognition result from IBM Watson Services

Commands for IBM Watson Services