今回は、「ベクトル化」ってのを整理してみます。文字列を数値化して、DeepLearningで学習可能なデータにする方法のひとつです。文字列をベクトル化するルール(方法)とはここでは、例えば、「私」という単語を、{0,1,0,0,1,1,0,0}みたいな形で表現することを「ベクトル化」と呼んでます。いうルール(方法)で「私」をベクトル「{0,1,0,0,1,1,0,0}」に変換するかです。いろいろなルール(方法)が研究されています。今回は、一番多く採用されている「単語の意味は周囲の単語によって形成される」というルール(方法)を使います。これがどういうことか。例文「僕は君の笑顔が好き。君は僕の何が好き?」でやってみます。簡単なサンプルプログラムで説明しようかと思います。前提があるので、先にちょっとだけ、補足します。単語の意味は周囲の単語によって・・とあるわけです。これは、例えば上記文の「笑顔」という単語は両隣にある「君の」と「が好き」という言葉で意味が説明されていると考えれば、感覚的に、なんとなくわかります。人間なので意味が通じるように「君の」とか「が好き」なんて適当に判断できますが、プログラムではそうもいきません。そのまま処理すると「君」「の」「笑顔」「が」「好き」のように分割されてしまうので、実際には、「好き」は「の」と「が」という単語で意味が説明される・・みたいなことになってしまいます。ここが英語と日本語の違いです。日本語特有の、単語の間の「は」「の」「が」などの助詞が、上記のように邪魔になるわけですね。日本語の場合は、とりあえず邪魔な「は」「の」「が」みたいな助詞以外だけ取り出すなどの工夫が必要になります。巷の自然言語の本では、英語ベースで説明しているものが意外と多く、こういうところの説明がはしょられていて、そのままやると上手く行かない時があります。自分も最初、気づくまでちょっとはまりました。抜き出すようにしてます。t.tokenize("僕は君の笑顔が好き。')この処理の結果はこうです。この5単語に適当にインデックスをつけます。「0:僕、1:君、2:笑顔、3:好き、4:何」みたいな感じです。「基準となる単語の前後にある単語をカウントする」というルールで表をつくるとこんな感じですかね。ここで、「僕」の両隣を赤字で表します。好き」なので「君が2、何が1」。「君」に着目して同じようにすると。好き」なので、「僕2、笑顔1、好き1」ですね。上記表ではそれにそって数字をうめてるわけです。これで、一応、「カウントベースの手法で以下のように単語をベクトル化した」ってことになります。僕={0,2,0,0,1}君={2,0,1,1,0}笑顔={0,1,0,1,0}好き={0,1,1,0,1}何={1,0,0,1,0}生のカウントをそのまま使うのは、いまいちよろしくない実際には。上記のように生のカウントした数を、そのまま使ったりはしません。英語の例だと、単純にカウントで判断すると「the」とか「a」とかの頻繁に表れる単語が常に高い関連性を持ってしまうのでよろしくない・・みたいに説明されてます。日本語でも、それに近いことはあるんでしょう。確率的に処理して、もう少し上等のベクトルにする方法があります。相互情報量(PMI)といいます。上記の例で「僕」と「君」という2つの単語に着目すると。僕が登場する確率→P(僕)君が登場する確率→P(君)僕と君が同じ文章内に同時に登場(共起するといいます)する確率→P(僕、君)としたら、「P(僕、君)をP(僕)×P(君)で割り、その結果の2の対数をとる」という方法で計算します。理屈が完全に納得できないとしても、まあPMIを計算することで、ただカウントしただけより「よりマシなベクトル」にできると理解しときます。実際に上記のベクトルをpythonで計算してみます。max(0,pw)print(pmi)出力結果です。なんか、見た目も「よりよい単語ベクトル」っぽいです。実際、そうみたいですしね。無駄を取り除いて、ノイズに強いベクトルにする上記のより良い「単語ベクトル」ですが、まだ改善の余地があります。何かというと「0」の場所が多いこと。いう「0」・・ようするに無駄・・が多いデータはノイズに弱いそうです。それを改善するために「次元圧縮」ということをします。次元圧縮の手順は、ざっくり、以下のとおりです。特異値分析(SVD)して、特異値の大きい順(ざっくり言えば、重要な要素順)に並べなおす。特異値の大きいものから任意の数のみ抽出する簡単にイメージをかくと。]この、5列(5次元)の単語ベクトルに、特異値分析(SVD)という計算をしかけると。-0.01969519]という5次元のベクトルに変換される。この結果は前の方が「重要な要素」になっているので、ノイズに強くするために、前の2列分だけ取り出して「2次元に次元圧縮」して、以下のようにする。pythonでサンプル的にやってみます。U[:,:2]print("次元圧縮後")print(goal)実行した結果です。-0.60112154]]この「次元圧縮後」の単語ベクトルが、最終的に使うものになるのですね。単語ベクトルを使って「類似の単語」を判断する単語をベクトル化できたら、とりあえず計算で「類似の単語」を判断したりできるようになります。ベクトルの類似を計算する最も有名な方法は「コサイン類似度」です。計算式とかはこちらをどうぞ。2つのベクトルがどのくらい同じ方向を向いているか?で比較するものです。計算式はややこしいですが、pythonで書くと簡単です。単語ベクトル「x」と「y」を比較する式はこんな感じ。ny)実際に、上記の次元圧縮後のベクトルの、僕と君で計算してみます。]という単語ベクトル。-0.29887974]という単語ベクトルです。結果として求められる値は以下です。0.08467308ようするに、こんな感じである単語のベクトルと、他の単語のベクトルを計算して、結果の大きい順にならべれば「類似度の高い順」になったりします。Word2Vecのデモなんかで、キーワードの単語を入力して、類似する単語をリストするみたいなものがありますが、それは、こういうことをやっているということです。ベクトルの求め方には「推論ベース」もあります今回は、ベースになるベクトルを求めるのに、単語の両隣にある単語を数えるやり方でやりました。このやり方だと「全部をまとめて処理しないといけない」ので、文章データが大きくなって、対象の単語が増えてくるとエライことになります。単語が10万語でてきたら、10万×10万の行列を処理しないといけないとか・・。DeepLearning等を使って小さい単位にわけて処理する(ミニバッチです)ことで、その制約を回避する「推論ベース」のベクトル化が実践的には使われます。これを簡単に説明するのは困難なのでふれませんが、非常に有名な「Word2Vec」とかがそうです。Librariesに付属のサンプルソースを少しだけ変更して、任意の日本語文章を処理したのを別記事に書いてますので、興味があれが参照ください。arakan-pgm-ai.hatenablog.comarakan-pgm-ai.hatenablog.comarakan-pgm-ai.hatenablog.com以上でこの回は終わりです。検索スポンサーリンク最近のアクセスTOP5ブクマ数TOP3IT的なTIPS・ノウハウイベントログから抽出したログオン・オフ時刻を見やすいように整形するEXCELのVBAマクロなど。Google検索は利用するけど、アクティビティを保存させたくない時もある文字コードで悩まされるなんて久しぶり/JIS7(ISO-2022-JP)とJIS8の話もっと見る作業時によく参照する「まとめ」djangoテンプレート内でforループで回す時の整理とデフォルト辞書利用時の注意など。djangoテンプレート内ので条件分岐(IF文)で注意することなどをまとめておくdjangoテンプレート/変数の値の参照の仕方が、Pythonと違う所があるので整理しておく。service」とサーバーレスコンピューティング関係をまとめてみる。PWA・SPA・・など「最近のWEBアプリケーションの種類」をざっくりまとめる。文系的まとめディープラーニング(ニューラルネットワーク)の「学習」の肝は「微分」らしいよ。Consoleもっと見るディープラーニングのデモをやってみるWord2Vecで「単語の足し算・引き算の結果(単語)を取得する」デモをやってみる。API」で入力文の疑わしい部分をAIが指摘するデモを作る。classで事前学習済のVGG16モデルを使った画像識別クラス/tensorflow2.0(tf.keras)ランダムフォレストで回帰してみる/気象情報と電力データその2もっと見るPythonでWebアプリやってみるviews.py(python)からデータを渡して、Chart.jsでRaderチャートを描く/Chart.js+djangoWEBブラウザ上にドラッグ&ドロップした画像ファイルをBase64に変換して表示するWEBブラウザで手描きしたイメージをJPEG・PNG変換後Base64エンコードするもっと見るPythonで自動化やってみるWebアプリケーションで自動的に値を参照、スクロール他Tips/Selenium&pythonWebアプリケーションで自動的に何かをクリックするTips/Selenium&pythonWebアプリケーションへの自動入力・選択のTipsあれこれ/Selenium&pythonもっと見るPythonで数学・グラフィックスやってみるモンティ・ホール問題で、ちょっと暇つぶし。最近、台風が怖すぎる!!!生産性向上しろと言いながら、片方で足をひっぱるなんて・・と呆れてます。/軽減税率のニュースを見てもっと見るBOKU62歳の文系SE”BOKU”です。<arakan_no_boku@yahoo.co.jp>興味の向いたものを、つまみ食い的に勉強してます。自分が消化した内容を、頭の整理と備忘を兼ねてブログに書いてます。IT系・・特に機械学習・プログラムネタが中心ですが、IT以外のネタになる時もあります。(43)スポンサーリンクはてなブログをはじめよう!arakan_no_bokuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。