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

2020年11月7日土曜日

[算数 ≒ 数学 – 難しい + 楽しい]の解

  自然言語処理では、単語の実数ベクトル空間への埋め込みが重要な役割を担っています。大規模コーパスのもとで、全単語ベクトルはすでに計算されていて(ツールWord2Vec等を用いて)、何種類かが公開されています。これによれば、単語ベクトルから、例えば、以下のような意味関係が成り立つことが分かっています。多くの書籍やweb解説にも掲載されています。

        King - Queen ≒ man - womam
    (KingとQueenの差ベクトルは、manとwomanの差ベクトルと類似)

 さて、そのような大規模コーパスではなく、以下のような単純な10例文だけの世界を考えます。(助詞などは取りあえず考えないので薄字にしてあります。)この世界では、12単語しか出現しません。このような範囲で、単語をベクトル空間へ埋め込んでも、上記と同様に、単語の意味関係は掴めるでしょうか?


 ここでは、注目単語に対して、window size = 2の範囲に共起した単語を認識するよう、ニューラルネットワークを学習させます。例えば、注目単語「確率論」を入力とした場合、「難しい」と「数学」を教師信号として学習させます。これを、全文全単語について行います。学習終了後のニューラルネットワークにおいて、入力から中間層(隠れ層)のノードへの辺の重みが、その単語のベクトル要素となります。このようにして、全単語について、2次元(中間層のノード数が2の場合)のベクトルを得ます。その結果を下図に示します。

12単語に対する2次元ベクトル

 この結果を見ると、「算数、百マス、児童、早朝」および、「確率論、学生、数学、徹夜」など関連性の高い単語がそれぞれ一つのベクトル上(白線矢印)にのっていることがわかります。

 実は、この結果は一つの解に過ぎません。恐らく、無数に解(すなわち、単語ベクトルの組み)は存在するはずです。ここではそのうちの、[解1]と[解2]を示しました。[解2]は、[解1]を原点を中心に30度ほど回転させたものになっているようです。ここで、「数学」と「算数」の差ベクトルと、「難しい」と「楽しい」の差ベクトルに着目します。この2つの差ベクトルは平行に近いです。したがって、下記が成り立ちます。

        数学 - 算数 ≒ 難しい – 楽しい
        算数 ≒ 数学 – 難しい + 楽しい

 こんな小さな実験コーパスでも、単語の意味関係が掴めたと思います。

2種類の2次元単語ベクトルの組み

 上記は2次元ベクトルでしたが、3次元ベクトルを生成(中間層のノード数を3に設定)した結果が下図です。次元を上げれば、見えてくる情報量も増える傾向にある?かも知れません。ここでも2種類の解を示しますが、いずれも、上記の意味関係が保たれていることが分かります。

2種類の3次元単語ベクトルの組み

2018年11月9日金曜日

類似語検索:秋田-こまち-ザギトワ

 単語の「類似度」は、曖昧さを残した用語ですが、人間が感じる(考える)類似度と、コンピュータが自然言語処理などで扱う類似度は、似て非なるものがあるようです。しかし、ここでは、後者、すなわち、コンピュータでの処理だけを扱います。

 類似語は、その元となる辞書の内容に依存します。ここでは、前回記事の続きとして、「朝日新聞単語ベクトル」を辞書とした類似語検索を行います。近年の単語ベクトル化の方式は、「単語の意味は、周囲に出現する単語によって形成される」という分布仮説に基づいていることに注意します。単語のベクトル空間においては、意味的に類似の単語は、その距離が近くなっているはずです。以下に、「秋田」など単語の類似語検索例をいくつか検討します。

【例1】「岡山」→「桃太郎」を連想の場合、「秋田」から連想される「桃太郎」の類似語は?
【例2】「こまち」から「秋田」を連想の場合、「桃太郎」から連想される「秋田」の類似語は?
【例3】「ザギトワ」から「秋田」を連想の場合、「桃太郎」から連想される「秋田」の類似語は?
【例4】「秋田」を念頭に置いた場合、「桃太郎」から連想される「秋田」の類似語は?
【例5】「秋田」を念頭に置いた場合、「秋田」から連想される類似語は?




 この2例から、朝日新聞単語ベクトル空間において、「こまち...秋田」の関係が、「桃太郎...岡山」の関係と良く類似していることが分かります。それは、例1と例2での単語ベクトル空間のイメージ図からも分かります。それでは、次に、例2での「こまち」を「ザキトワ」に置き換えた類似語探索を行ってみます。「ザギトワ」は、人気のフィギュアスケーターであり、秋田犬を贈呈された記事が多数存在するからです。


 例3でも、「ザギトワが秋田」ならば、「桃太郎は岡山」の関係は保たれています。しかし、検索結果の「岡山」の確からしさ(類似度)は、やや失われているように見えます。「秋田」と共に出現する頻度は、「こまち」の方が「ザギトワ」よりも高いように思われます。次の例4は、秋田に関連するこれらの用語を削除した場合の類似語検索です。



 この例4では、「秋田」は単に場所を示す単語として貢献しているようです。「桃太郎から連想される秋田の類似語」は、「山形」という結果です。たしかに、山形にも、桃太郎伝説は存在していて、いろいろな資料もありました。最後の例5は、「桃太郎」も削除してしまい、単に、「秋田」の類似語を検索した場合です。



 
「秋田」と言えば、「大館」という結果は納得できます。もちろん、他にもたくさん、連想できる単語があるはずですが、この朝日新聞単語ベクトル空間では、そうなっているということです。
 以上の5例から、断定的なことは言えませんが、場合によっては、強力な「意味検索」が可能であり、いろいろと応用の可能性を秘めていると思えます。しかし、実際に真に有用な応用に結びつけるには、まだかなりの検討、研究を要するようにも感じます。    

 

2018年11月2日金曜日

巨大コーパスの類似単語ベクトルをみる

 [これよりも少し詳しい関連記事を追加しました。ここにあります。]

 自然言語処理には、巨大なコーパスが必要とされます。日本語では一例として、Wikipedia日本語版が使われています。さらに、この規模の約10倍にもなる超巨大コーパス(朝日新聞の直近34年間の主要記事)に出現する単語の単語ベクトルもあります。朝日新聞単語ベクトル」です。
このデータファイルの取得申請を行い、入手できました。それを今後利用するための準備として、以下に示すような類似語検索を試行しました。

 まず、単語ベクトルの意味と、単語ベクトル演算について簡単に示しました。詳細は、ここでは述べられませんが、「単語が他の単語の近くに出現する頻度に基づいて、単語をベクトル空間モデルに埋め込む」ということです。類似した単語は似たベクトルで表現されることになります。一般には、コーパスの語彙数に応じた巨大な次元数になりますが、主要な次元だけに圧縮した空間を使います。「朝日新聞単語ベクトル」では、Word2Vec(CBOWモデル)による300次元のベクトルになっています。



 以下に、上図(MATLAB Text Analytics Toolboxの解説書(英文))を参考に作成)のような仕組みを利用した、類似語検索の例(傑作16選)を示します。もちろん、適当な類似語が見つからない場合もありますが、ここでは、試用段階なので、うまく行った例だけを示して、今後の活用への意気込みを高めたいと思います。

 以下をほぼ満たす(単語A, B, Yはgiven)、単語Aの適切な類似語単語Xは?
 「単語A - 単語B = 単語X - 単語Y

No.2:室蘭工業大学に類似していて、北海道ではなく、神奈川にある...
No.4:バイコヌールに相当する米国のロケット発射場...
No.9:女子アイススケータのザギトワに秋田犬を贈呈しましたね...
(しかし、実は、"ザギトワ"でなくても、例えば、"メアリ"でも結果は同じでした!すなわち、過去34年間の新聞記事全体に占める、"ザギトワ"と"秋田"の関係性は、それほど強くなかった。秋田は単に「場所」という意味が効いているようである。単語ベクトルと言っても、数学のベクトルとは意味合いが違う側面がありますので、その解釈には注意した方がよさそうです。)
No.11:パガニーニと言えばバイオリン曲、ショパンと言えばピアノ...
No.12:ピアノ曲のショパンに相当するバイオリン曲の作曲家はパガニーニだけではない...

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