ラベル 自然言語処理 の投稿を表示しています。 すべての投稿を表示
ラベル 自然言語処理 の投稿を表示しています。 すべての投稿を表示

2022年11月6日日曜日

Amazon AlexaとMIT App Inventorのコラボ

【要旨】自然言語による応答システムとして、SiriやGoogleアシスタントなどを多くの人が利用しています。しかし、それらを組み込んで自分に必要な応答システムを自作するのは敷居が高いと言えるでしょう。今回、Amazonが10年間に渡って培ったAIによる自然言語処理AlexaとMIT App Inventorがコラボして、素晴らしいシステムをユーザに提供し始めました。まだ、全くの入り口に過ぎませんが、試用してみました。

■Amazon AlexaとMIT App Inventorのコラボ
 下図のようなアナウンスがあり、いくつかのYoutube動画などでも紹介されています。これは初心者向けのチュートリアルですが、ビデオや資料を見ていると色々な魅力、可能性が感じられます。MITでは、自然言語でアプリの仕様を喋ることによって、現在のようなアプリ(処理ブロック)を自動生成するプロジェクトAptlyを進めています。今回のコラボは、Amazonの強力な自然言語処理を利用することで、Aptlyを推し進めることに繋がるのだと思います。(Aptlyについてはこちらで簡単に紹介しました。)

■自然言語による自分なりの応答システムを作る道が拓けそう
 上記の情報をもとにして、簡単な自然言語による応答をテストしてみました。スマホ(AndroidまたはiPhone)とAlexaをCloud DBで連携させるものです。Alexaのデバイスを持っていれば良いのですが、それがなくても、PC上のエミュレータを使うことができます。また、Amazonの通常のアカウントの元で、「Developer ID」を取得しておく必要があります。上記URLの説明には、"no Amazon device or account required."と書いてあるのですが、"no account"は、教室の場合は先生だけがaccountを持っていれば良い、ということのようです。

 この簡単な例では、スマホからメッセージをCloudDBへ格納し、それをAlexa側から"get my message"や"what is my message"のように発話をすることで取り出しています。また、逆に"send the message"や"post the message"などと発話してCloudDBへ送り、スマホ側でそれを取り出します。ユーザは、"get ..."や"what is ..."などをIntentに登録できますが、必ずしもそのように発話しなくても、それらに近い言葉を使っても、AI自然言語処理が適宜判断できます。

 これは簡単な例に過ぎませんが、それでも、自分なりの特色ある応答システムを作れそうな気になりませんか?しかもそれを、これまで通り、MIT App Inventorの環境のままで実現できそうなところが素晴らしいです。今までは作れそうもないと思っていた人にとっても、新しい世界が拓けるように思います。
(追記)
 AmazonのAlexaは本来、日本語もできるのですが、このコラボに関しては日本語による命令は(現時点では多分)できないようです。ただし、メッセージの内容そのものは日本語でもOKであり、日本語のText-to-Speech、Speech-to-Text、CloudDBへの格納検索はもちろんできます。

2022年3月25日金曜日

植物図鑑などで珍しい形態の「葉」を見つけたい

 植物図鑑や写真集を眺めていて、「葉」の形態が珍しいものを見つけたいと思いました。でも、漫然と眺めていたのでは日が暮れてしまいます。そこで、植物の特性の説明文に対する自然言語処理の登場です。

■「葉」の特性を示す用語の抽出
 まず、参考資料[1]に掲載されている、植物全2,174種(別名を含めると3,000種以上)に関する、簡潔な一行説明文の全てに自然言語処理(形態素解析と単語間・文節間係り受け解析)を施します。その結果を利用して、「葉」の特性に関する用語を全て抽出します。原則的には、「葉」の前方にある名詞、形容詞、動詞などの修飾語と、「葉」からその述語までの範囲の関連用語が対象となりますが、例外的に、その範囲を超えて、述語の後方まで調べる場合もあります。当然、その中で、「葉」以外の「花」や「果実」等に関する用語は除去するのですが、これがなかなか難しいです。ですが、用語の品詞と係り受けの種類などを頼りに、何とか曲がりなりにも目的を達するアプリケーションを作成しました。その実行結果が図1なのです!

 完璧ではありませんが、ご覧の通り、(重複無しで)約600語を抽出できました。この結果は、植物界の葉の形態の全貌を凝縮している、と言えないこともない。(ただし、上述の困難さから、花や果実に関する用語も若干入り込んでいます。)これなら、目視で、「おや、これは何だろう?」という珍しい特性が見つかるはずです。

■珍しい特性を持つ「葉」を調べる
 このようにして、「葉」の幾つかの珍しい特性が見つかりました。例えば、図2に示すように、「表裏逆転」「右右左左」「2回偶数羽状複葉」「魚骨状」などです。あまり聞いたことのない、何か珍しそうな特性に見えます。


 ここまで来れば、あとは、植物写真集[1]を検索すれば良い。実際、図3に示す通り、該当植物が見つかり、一行説明文(詳細説明文へのリンクもあります)と写真を見て納得できました。こんな楽しみ方もあるのではないでしょうか。


 なお、「珍しい用語」は、出現頻度が低いと考えられますので、図1に示した各用語の出現頻度を計算して「珍しい」に当たりをつけるのも良いでしょう。実際、出現度数は以下の通りでした。WordCloudは、普通、出現頻度の高い単語を検出するための可視化ですが、ここではそれの逆順の使い方に相当します。
 なお、これらの関連用語の出現頻度のWordCloudによる可視化については、こちらの記事に書きました。

■「花」についても同様に調べる
 さて、「葉」以外に「花」についても、同様に調べることができます。「花」の方が「葉」よりも多様であり、特性に関する抽出用語もうんと多いと予想しましたが、結果はむしろその逆でした。すなわち、上述の方法で調査する限り、「葉」の特性の方がより多様であることを示す結果となりました。(詳細は略しますが。)

■国立国語研究所「長単位」向け係り受け解析モデル
 これまでの記事でも述べましたが、今回のアプリケーションは、参考資料[2][3]の国語研長単位解析モデルを利用しています。このため、上に示した通り、「楕円形」「長楕円形」「羽状複葉」「2回偶数羽状複葉」などがバラバラにならず、それぞれまとまった単語(形態素)として認識されており、アプリケーション作成がとても楽になっています。

参考資料
[1] 渡辺坦:植物の名前を探しやすい デジタル植物写真集

[2] yasuokaの日記: spaCy向け国語研長単位モデルja_gsdluw仮リリース
https://srad.jp/~yasuoka/journal/653385/

[3] UD Japanese GSD+GSDLUW r2.9 with Named Entity Gold Labels
https://github.com/megagonlabs/UD_Japanese-GSD/releases/tag/r2.9-NE

2020年12月17日木曜日

神奈川工科大学で講義:自然言語処理と機械学習(事後編)

 【what is this】神奈川工科大学_情報工学科向けの「入門:自然言語処理と機械学習」講義後の報告です。前回の続編になります。現状の小生にとって、今年のn大ニュース(n ≦ 3)入りとなりました。 

■久しぶりに約140名に90分講義(講演)
 前回記載のとおり、90分のオンライン講演を実施(2020-12-10)。対象は、約140名の2年生ですが、先生方や大学院生にも聴いていただきました。このコロナ禍ゆえ、自宅からZOOMを利用した講演でしたが、特にトラブルもなく終えることができました。
 熱心に聴講し質問もしてくれた学生諸君に、そして準備された担当の先生、応援して質問もしていただいた先生方に感謝したい。当方としてはここ2ヶ月間、構想を練り準備してきた甲斐があり、たいへん嬉しく思っています。下図のスクリーンショット、どこか良い雰囲気を醸し出しているような気がします。

2年生約140名と、院生、先生方にも参加していただいた

■質問が出るのはオンラインのメリット
 上図右欄に見えますが、講演後に学生諸君から3件ほどの質問がチャットで寄せられました。対面授業では通常、ほとんど出ませんので、これは、オンライン授業の良い点のようです。ただ、質問時間は限られていたので、その場でパチパチ素早く質問を正確に打つのは難しかったと思います。後でメールでも質問できるように、当方のメールアドレスも講義スライドに記載はしておきました。

■その場の反応が分からないデメリットも
 一方、受講状況が掴めません。私は、ユーモアというか、「ここで学生諸君を和ませよう」と、スライドの何カ所かに仕組んでいたものがあります。それに対する反応が分からないのです。対面であれば、大人数の場合でも、ちょっとどよめいたり、笑いが起こったりするのが分かります。それが知りたいのです。それは5カ所位あったのですが、例えば、以下のような所でした。「ここじゃない!ここ!(詳細はこちら)」、「日曜日は銀行はやっていない!(詳細はこちら)」It happens inevitably.

ここで、小さなどよめきや笑いが起こるのでは...

■後日提出の受講レポートから反応を掴む
 ですが、この講義受講ではレポート提出が義務づけられているため、後で状況を掴むことができました。熱心によく受講してもらったことが分かりました。今後の参考にしたい。残念ながら(公式レポートにはそういうことは書かないものだが)、上記の笑いについて触れた学生はいませんでした!ちょっと残念。以下に、学生諸君からの反応をいくつか示します。(原文の意味を損なうことなく、抜粋、編集したところがあります。)
  1. メモは取ったが、講義資料が公開されていなければ、後で理解を深めることは困難だったが、それがあったので非常に助かった。((注)スライドが役立って良かった。)
  2. 資料を見返してしっかりとまとめたメモと見比べなんとなく理解するところまで行けたことは、個人的にとても大きかったです。((注)予習して臨んだようです。)
  3. 内容だけを見たらすごく難しいものを簡単に見せる工夫や見る側が興味を持つようなしゃべり方をしていたので参考にしたいと思いました。((注)よく分かってくれました!)
  4. 最初は基礎的な部分から、徐々に内容を複雑にしていって、尚且つ前のスライドでその話に持っていきやすいように、しっかりその情報の開示・整理を行っていたために理解しやすくて、((注)そこまで、よくぞ分かってくれました!「以心伝心」という言葉が頭に浮かんだ。)
  5. 退職後も自分の興味で調査や実験をしたという事を聞いて、私も自分自身で動く行動力や何にでも興味を持つ好奇心を忘れないようにしたいと思いました。((注)こんなところにも気がついてくれました!)
  6. 自身が気になったから実際に行ってみたという動機や実体験を元にした説明だったので、内容がわかりやすく伝えたい事も明確で、全体的にとても良かった((注)そのとおり。自分でやってみること!)
  7. Google翻訳を使っているが((注)そういう学生が非常に多かった!)、それに関連する技術や動向の概要が分かった。機械翻訳がこれほど凄い技術でなりたっているとは思わなかった。
  8. 数学の知識が不足しているのでそれを身に付けたい。((注)講義では、誤差逆伝播や微分等については直接言及しなかったのだが、学生は、数学的手法を感じ取った!)

■時間配分に気を配る
 スライドは全部で62枚ありました。90分のうち、どの辺りにどの位時間をかけるのか、受講者もそれが分かると落ち着いて聴けるように思いした。少し余裕を持った時間配分とするのが良いと思います。結果としては、ある先生から(そして学生のレポートの中にも)、「ほぼ、時間配分どおりでしたね」と言われて、ちょっと安心。

事前に決めておいた時間配分(配布スライドにも記載)

2020年12月2日水曜日

神奈川工科大学で講義:自然言語処理と機械学習(事前編)

 【what is this】情報工学科2年生向けの「入門:自然言語処理と機械学習」の概要です。90分のオンライン講義用です。(事後編はこちら)

■久しぶりの90分授業
 縁あって今回(2020-12-10)、神奈川工科大学情報工学科2年生向けに、90分のオンライン講義をすることになりました。全部で15回あるオムニバス形式の情報工学特別講義の1回分です。

 内容は、「自然言語処理と機械学習」です。ここ2,3年、興味をもって調べたり、自分で実験してみた事項に基づいています。自然言語処理の基本的な解析から機械翻訳までの重要と思われる技術について述べます。

 本当は学生諸君の顔を見ながらの対面授業でやりたいのですが、このコロナ禍のもとでは致し方ありません。しかし、自宅の机上から講義するのですから、やりやすい面もあります。

講義のタイトル

講義の全体構成と時間配分目安

■講義にあたって留意したこと

  1. スライド枚数を適切に抑えて、講義時間を超過しないこと。最終的には、目次なども含めて、全62枚のスライドを準備し、(90分だが)85分で終了することをめざす。
  2. 全体を大きく4分割し、それぞれ20分程度の話として明確に区分すること。またそれら各部の相互関連も示すこと。
  3. できる限り、独自の例題、独自のプログラム、独自撮影の画像、身近な話題などを使って、当方の取り組み姿勢を示す。
  4. インパクトのある素晴らしい、他の人の成果は積極的に引用させていただく。
  5. 技術の詳細の講義ではないが、「ふわー」としたお話しに終わらずに、なるべく一定の深さまで掘り下げ、具体例をあげ、簡単な計算例なども加えること。
  6. 一方、詳細な技術内容には立ち入れないとしても、何か「凄いぞ!」「こんなことも考えられているのか!」と驚きを感じ興味を持ってもらう場面も作ること。

■講義予定のスライド一覧
 以下は、4区分したスライドの縮刷版です。実寸スライドは(先生方にはすでにご覧いただいていますが)講義時までに学生諸君へ公開します。

part1 人工言語、自然言語、機械学習、サービス

part2 基本解析、形態素解析、係り受け解析、分類問題、コーパス

part3 単語の意味理解、共起語、単語の実数ベクトル空間への埋込み

part4 機械翻訳(用例的、統計的、ニューラル、Attention)、参考文献

■このあとどうする
 この講義は、「入門」としています。このあとはどうするか、少しギャップがあると思いますが、技術的にさらに深めたものを作りたいと思っています。特に、最新の機械翻訳の仕組みを明確に説明できることを目指したい。

【参考文献】
 以下の文献等から、多くのことを学びました。また、それらにある例題や図表の一部を引用させていただきました。感謝致します。
  1. 黒橋禎夫:改訂版 自然言語処理、放送大学教育振興会、2020年:基本概念とアルゴリズムを簡潔かつ精緻に叙述した定評の教科書。手計算できる小さな例題で理解を深める。改訂版では、最近の機械翻訳(20ページ)が追加された。(全202頁)
  2. 杉本徹・岩下志乃:Javaで学ぶ自然言語処理と機械学習、オーム社、2018年:基本概念と基本技術が、幅広く丁寧に解説されている。明解なJavaプログラムとその解説があり、それを動かしながら理解を深められる。(全262頁)
  3. 斉藤康毅:ゼロから作るDeep Learning(2)自然言語処理編、オライリー、2018年:定番の「ゼロから作る…」の第2弾、自然言語処理編。じっくり一歩づつ(Pythonでプログラムしながら)進む。最初の方にDeep Learningの一般的解説もある。(全412頁)
  4. 柴原一友:自然言語解析アルゴリズムBERT(前編)、日経ソフトウェア2020年7月:情報検索や機械翻訳で注目されているBERTの考え方のやさしい解説。BERTの中核であるTransformerとAttentionがどんなものかをイメージすることができる。 (全13頁)
  5. 奥野陽他2:自然言語処理の基本と技術、翔泳社、2016年:広範な話題を数式を使わずやさしく解説しようとしている。初心者が技術の概観を得るのに適す。機械翻訳の解説もあるが、発行が少し前のためか、ニューラル機械翻訳は含まれない。(全239頁)

2020年9月7日月曜日

誰もが実感できる自然言語処理の発展

 趣味で、Googleアシスタント(OK Google!)を利用しています。自然言語処理の応用は、自動翻訳だけではないようです。今回は、植物の特性や台風情報等を音声で与えて、所望の情報が得られるかどうか確認してみます。

【音声による検索】
    ♪ 
漏斗状の赤紫の花を咲かせる植物
    ♪ 葉脈が明瞭な植物
    ♪ 虎柄の長い葉を持つ植物
    ♪ 葉は掌状で果実は楕円形
    ♪ 去年の台風で920hPa以下に発達したものはありますか
    ♪ それでは3.14かける8の答えは

 結論から言いますと、上記の最初の4例(植物)に対する結果は、いずれも、かなり優秀だと思います。Googleのやり方は、よく分かりませんが、最近雑誌などでも解説が増えているBERTという仕組みのもとで、実用的な自然言語処理がなされているのだと思います。



 利用した感触としては、出力結果はあくまで「候補」、ということのようです。ですから、例えば、「赤い4枚の花弁を持つ植物」と与えても、4枚に限らず、5枚や3枚の花弁のものも候補に挙がる場合があります。恐らく、この場合は、花弁の枚数よりも「赤い」が優先されるのだと思います。それはそれで、我々の感性に合致しているように思います。

 また、残りの2つの音声検索からも分かるように、人間がしゃべったことを正確に理解しているのではなく、いわば「拾い読み(赤字の部分のみを)」して、候補らしい回答を出力しているようです。的確な拾い読みができるとすれば、それは素晴らしい能力です。最終的には人間が判断するのですが、そのための有力な情報を与えるということでよろしいとおもいます。


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年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


2018年12月24日月曜日

App Inventor for Android で SVM(サポートベクトルマシン)分類

以下は同じような心境とお考えください。

「なぜ山に登るのか」
「なぜスマホでSVM分類するのか」

下記の書籍は、数多くある機械学習関連のうちの非常に優れた一冊です。これに刺激を受けて、その中にあった、SVMによる分類の例題を、Android向けにデモアプリとして動かしました。下図のとおりです。

歴史上の人物の特徴量を与えて、その人を「政治家」か「非政治家」かに分類する例題です。



SVMのJavaライブラリは、LIBSVM(国立台湾大学による)を利用させていただきました。上記のAndroidアプリは、MIT App Inventorを使って作成しました。既存のApp Inventorのブロックだけでは、このようなアプリはほとんど作成できません。そこで、LIBSVMを使ったJavaアプリを作成し(下記書籍を参考に)、App InventorのActivity Starter機能(ブロック)を使って、これを呼び出す形にしています。上の実行例画面でその概要を示します。↑拡大してご覧下さい。

このアプリでは、20名のデータのうち、ランダムに1名を選んで、それを「テスト用データ」とし、残り19名のデータを「学習用データ」として学習、テストを繰り返し実行できます。

また、このアプリの学習データを入れ替えれば、類似の問題、例えば有名な「タイタニック号の乗客の生死」の分類等にも(データ加工に幾らかの工夫は必要でしょうが)適用できそうです。

●参考書籍
杉本徹+岩下志乃共著「Javaで学ぶ自然言語処理と機械学習」、オーム社

2018年10月28日日曜日

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

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

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

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

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より引用)も確認します。主観的にも、上記の結果は納得できそうです!