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 の教育、研究への活用に使えるでしょう。