『明日から君を自然言語処理案件にアサインだ!よろしくな!』 って言われる前に知っておきたかった自然言語処理分析のキホンのキ

『明日から君を自然言語処理案件にアサインだ!よろしくな!』 って言われる前に知っておきたかった自然言語処理分析のキホンのキ

このスライドは BrainPad AdventCalendar 2018 10日目の記事です。
自然言語処理の基本的な話を初心者向けにまとめました!

BrainPad AdventCalendar 2018はこちら↓
https://qiita.com/advent-calendar/2018/brainpad

4d4fbbd8ec5f9393b90d510782818fbb?s=128

吉田勇太 / ysdyt

December 10, 2018
Tweet

Transcript

  1. 『明日から君を自然言語処理案件に アサインだ!よろしくな!』 って言われる前に 知っておきたかった 自然言語処理分析の キホンのキ

  2. 自然言語処理(NLP)の主な流れ超オーバービュー MeCab・Juman・Chasen・Cabocha・Sudachi 品詞フィルター・ストップワード・名寄せ など one-hot, BOW, N-gram, TF-IDF, word embedding(word2vec)

    など 機械学習手法いろいろ, Topic model, Deep Learning 文書分類・感情分析・文書生成・文書要約・機械翻訳・bot作成 など • MeCab • One-hot/BOW • Word embedding (word2vec) • Topic model • Deep learning (RNN, LSTM, CNN) 文字列 単語・形態素列 数値化(ベクトル化) アルゴリズム計算 (前処理) このスライドで紹介する内容 キホンかつ、 有名どころの手法
  3. おそらく次代のメジャーインターフェイスになるであろう「音声入力」に向けて理解を深めるべき (現状のAIスピーカー) 「ねえ、グーグル 今日の天気は?」には回答できても、「今日洗濯物干せる?」には答えられない。なぜか? => 「自然言語処理で何ができて、何が難しいのか」を知ると理解できる ねえ、グーグル 何か面白い話して 詠唱能力の欠如により無茶振りする母 (※しかし実際に話しかけると、いろんなダジャレを喋りだす)

    空前(?)のAIスピーカーブーム AIスピーカーの裏は自然言語処理の塊
  4. 文書分類 感情分析 文書生成 文書要約 機械翻訳 Bot・コンシェルジュ 自然言語処理で出来るタスク例 『ハーゲンダッツ八ツ橋味てマジヤバくない?なくない?』はポジティブか、ネガティブか? スポーツ? 芸能?

    その他? ホラー小説を書くAI「Shelley」の物語が「驚くほどに怖い」と話題に、14万ものRedditの投稿から研究者らが開発 https://gigazine.net/news/20171101-ai-shelley-writes-horror-stories/ グーグル翻訳の進化(Seq2Seqの発明) しゃべってコンシェル、Siri、 りんな etc... 謎の文書A ジャンル推定 のどれに分類できるか? ECサイトにおける商品紹介文の要約 など タスク例 例 (トピック分類・ジャンル推定) 特に、文書生成や文書要約はまだまだ技術的にも難しい...
  5. 自然言語処理分析の主な流れ MeCab・Juman・Chasen・Cabocha・Sudachi 品詞フィルター・ストップワード・名寄せ など one-hot, BOW, N-gram, TF-IDF, word embedding(word2vec)

    など 機械学習手法いろいろ, Topic model, Deep Learning 文書分類・感情分析・文書生成・文書要約・機械翻訳・bot など • MeCab • One-hot • Word embedding (word2vec) • Topic model • Deep learning (RNN, LSTM, CNN) 文字列 単語・形態素列 数値化(ベクトル化) アルゴリズム計算 (前処理) もくじ BPは人工知能の会社です。 [BP, は, 人工知能, の, 会社, です, 。] [BP, 人工知能, 会社] [[***], [***], [***]] 処理例 キホンかつ、 有名どころの手法
  6. (0. Python3を使う) 1. MeCabのインストール 2. Mecab-python3 (import MeCabでpythonから呼べるようになる) 3. mecab-ipadic-NEologd

    を入れる すべてのNLP初心者は、上記の3ステップをするためだけに 30分以上ググり続ける、というところからNLPは始まる Ubuntu 14.04 に Mecab と mecab-python3 をインストール https://qiita.com/elm200/items/2c2aa2093e670036bb30 形態素解析モジュール MeCab
  7. NEologdでは「人工知能」と1語(名詞)で判定 有名な「すもももももももものうち」も 新語辞書では1語になってる mecab-ipadic(MeCabデフォルト辞書)とNEologd(新語辞書)

  8. 自然言語処理分析の主な流れ MeCab・Juman・Chasen・Cabocha・Sudachi 品詞フィルター・ストップワード・名寄せ など one-hot, BOW, N-gram, TF-IDF, word embedding(word2vec)

    など 機械学習手法いろいろ, Topic model, Deep Learning 文書分類・感情分析・文書生成・文書要約・機械翻訳・bot など • MeCab • One-hot • Word embedding (word2vec) • Topic model • Deep learning (RNN, LSTM, CNN) 文字列 単語・形態素列 数値化(ベクトル化) アルゴリズム計算 (前処理) もくじ BPは人工知能の会社です。 [BP, は, 人工知能, の, 会社, です, 。] [BP, 人工知能, 会社] [[***], [***], [***]] 処理例 キホンかつ、 有名どころの手法
  9. あまり重要ではない情報は削除 • ストップワード(a, the, ある, いる など) • その他、出現頻度の高すぎる/少なすぎる単語 •

    数字(数字そのもの自体は処理上そんなに大切じゃない) ステミング 語形の変化を取り除き、同一の単語表現に変換す る処理(つまり原型に戻す、的な。) 例: Swimming, swims -> swim 美味しそう, 美味しかった -> 美味しい 自然言語処理における前処理の種類とその威力 https://qiita.com/Hironsan/items/2466fe0f344115aff177 テキストの前処理 自然言語処理のおいて、これらの前処理をどれだけ行えるかで精度がほぼ決まると言っても過言ではない
  10. 自然言語処理分析の主な流れ MeCab・Juman・Chasen・Cabocha・Sudachi 品詞フィルター・ストップワード・名寄せ など one-hot, BOW, N-gram, TF-IDF, word embedding(word2vec)

    など 機械学習手法いろいろ, Topic model, Deep Learning 文書分類・感情分析・文書生成・文書要約・機械翻訳・bot など • MeCab • One-hot • Word embedding (word2vec) • Topic model • Deep learning (RNN, LSTM, CNN) 文字列 単語・形態素列 数値化(ベクトル化) アルゴリズム計算 (前処理) もくじ BPは人工知能の会社です。 [BP, は, 人工知能, の, 会社, です, 。] [BP, 人工知能, 会社] [[***], [***], [***]] 処理例
  11. 画像 ピクセルのRGB情報 (256,256,256)やバイナリー情報(白黒 1or0)を計算に使う テキスト? 「テキスト」はどのように計算する? 数値情報ではない。どうすれば…?

  12. 計算するにはとにかく数値化(ベクトル化)する必要がある 文字情報をどのように「数値化」するか 単語の数値化方法、 「局所表現」と「分散表現」

  13. ある要素のみが1でその他の要素が0であるような表現方法 「ブレインパッド」 「人工知能」 「会社」 <良いところ> ・ シンプル。直感的。 <ダメなところ> ・ 単語が増えると無限に次元数が増える

    ・ ベクトル間の演算で何も意味のある結果を得られない 単語の数値化表現 「局所表現」(one-hot表現) 名詞だけ取り出す。名詞は3つ。 3つの名詞は三次元で表現できる [1, 0, 0] [0, 1, 0] [0, 0, 1]
  14. 文書A 「ブレインパッドは人工知能の会社です」 文書B 「深層学習は人工知能です」 「ブレインパッド」 [1, 1, 1, 0] [0,

    1, 0, 1] 文書の数値化表現 「bag of words(BOW)」 単語単位での数値化だけではなく、文書単位の数値化もある <良いところ> ・ シンプル。直感的。 ・ ベクトルで距離計算し”似ている”文書がわかる <ダメなところ> ・ 単語が増えると無限に次元数が増える 文書A, Bの両方にでてくる名詞をカウントして表現する 「人工知能」 「会社」 「深層学習」
  15. 「ブレインパッド」 <良いところ> ・ベクトル間の演算で単語間の類似度を計算することができる ・ボキャブラリ数が増えても各単語の次元数を増やさずに済む 最近では ・ニューラルネットのインプットに使えて便利 なぜ自然言語処理にとって単語の分散表現は重要なのか? https://qiita.com/Hironsan/items/a58636f946dd51f670b0 単語の数値化表現 「分散表現」

    「人工知能」 「会社」
  16. ところで、「word2vec」(Mikolov+, 2013)について ・ その名の通りwordをvectorにする ・ それによって単語の演算が(精度高く)できる 各単語が得た分散表現ベクトルを足し引きできる(言葉の”意味”を獲得できているように見える) w2vは小さなニューラルネット 「分散表現」はどうやって作る? 属性関係

    活用形関係 相対関係
  17. word2vecは何を学習している? 「word2vec」には • CBoW • skip-gram の2つの手法がある。 skip-gramを使うのが一般的 対象単語からその周辺単語を予測する ブレインパッド,

    は, 人工知能, と, ビジネスコンサル, を, 行う, 創業, 13年目, の, 会社, です, 。 Skip-gram
  18. ビジネスコンサル [1,0,0,0,0,0] ブレインパッド [0,1,0,0,0,0] 人工知能 [0,0,1,0,0,0] 創業 [0,0,0,1,0,0] 13年目 [0,0,0,0,1,0]

    ブレインパッド, は, 人工知能, と, ビジネスコンサル, を, 行う, 創業, 13年目, の, 会社, です, 。 重みWe 重みW 重みW 重みW 重みW 対象単語のone-hotベクトルを入力とし、 前後2単語のone-hotベクトルが出力になるようニューラルネットで重みを学習 word2vecの学習 -2 -1 0 +1 +2
  19. ビジネスコンサル [0,0,1,0,0,0] ブレインパッド [1,0,0,0,0,0] 人工知能 [0,1,0,0,0,0] 創業 [0,0,0,1,0,0] 13年目 [0,0,0,0,1,0]

    重みWe 重みW 重みW 重みW 重みW (0,0,1,0,0,0) 0.3 0.2 0.4 0.5 0.6 0.1 0.6 0.6 0.5 0.2 0.4 0.9 0.5 0.4 0.4 0.1 0.9 0.5 =(0.6, 0.6, 0.5) 学習の結果得た重みWe のベクトル 0.3 0.2 0.4 0.5 0.6 0.1 0.6 0.6 0.5 0.2 0.4 0.9 0.5 0.4 0.4 0.1 0.9 0.5 「ビジネスコンサル」の ベクトル(分散表現)は 実質これ 「ビジネスコンサル」の one-hotベクトル word2vecの「重み」が「分散表現」になる
  20. 学習が終わったときの重みWeが、各単語の分散表現となっている ・ サブカルのためのword2vec https://engineer.dena.jp/2018/01/animew2v.html ・ word2vec(Skip-Gram Model)の仕組みを恐らく日本一簡潔にまとめてみたつもり http://www.randpy.tokyo/entry/word2vec_skip_gram_model ・ 詳細

    word2vec https://www.slideshare.net/Nnwww/word2vec-82471728 word2vecは単語の分散表現を学習するツール
  21. 大規模データから単語の 意味表現学習-word2vec https://www.slideshare.net/adtech-sat/word2vec20140413 それってつまり単語の分布確率みたいなものをみてるだけだよね? 単語の意味とか全然関係ないよね?そんなのでいいの? イギリスの言語学者。言葉の意味論の研究。 「状況のコンテクスト」(context of situation)を重視し、 意味とはコンテクストにおける機能のこと、というアイデアを追求

  22. すでに学習済みの重みデータがアカデミックから公開されたりしているのでお手軽に試せる ・ 日本語Wikipediaエンティティベクトル http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/ 日本語wikipediaで学習したword2vecの重みデータをお手軽に使う Wikipediaから語彙を取っているので、語彙はかなり潤沢

  23. ・ 「発言小町」からテキストデータを取得してword2vecで学習 -> 「奥さん」という単語ベクトルから「彼女」のベクトルを引き算して得られる単語ベクトルは何かを調べるというネタ どうしたら「彼女」から「奥さん」になれるかを『Word2Vec』に聞いてみた http://ainow.ai/2017/10/31/124408/ Word2vecを使ったネタ(1/2) 自分で文書データを集めて、gensimというPythonパッケージでw2vを学習することも簡単

  24. - ❤️ ~= #goblue, #letsgoduke, #bleedblue, #ibleedblue, #worldautismawarenessday, #goduke, #beatduke,

    #autismspeaks, #autismawarenessday, #gobroncos, duke - ❤️ ~= #gogreen, loyals, #herballife, #happysaintpatricksday, , #stpats, , #jointhemovement, green, #hairskinnails, #happystpatricksday - ❤️ ~= , ,#springhassprung , ,#springiscoming ,#springishere, #aprilshowers, #thinkspring, #hellospring, , #wildflower, #happyearthday - ❤️~= ✨, , , , , , faldc, , brassy, topaz, peachy ,purple, #thinkpink,☁, sparkle, , shimmer, sparkles, kaleidoscope, periwinkle, , greenish -❤️ ~= gorl, , cwd, s4s, aynmalik, spvm, ulee, , , yulema, sfs, bvby, ɑnd, indirect, priv -❤️ ~= ulitzer, , peachy, february’s, tulle, mackz, kendall’s, curvy, faldc, #dancewear, strapless, , ◽, floral - ❤️ ~= , ℹ, , , ✉, , , , , paypal, , item, ⏬, , inquire, orders, payment, , , , deposit Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 https://deepage.net/bigdata/machine_learning/2016/09/02/word2vec_power_of_word_vector.html Word2vecを使ったネタ(2/2) Instagramのテキスト欄に書かれている絵文字やハッシュタグを学習してベクトル化(絵文字もテキストの一部なので学習ができる) → 絵文字の「価値」や「意味」を推測できる 絵文字同士の引き算をして得られるベクトルから絵文字の`価値`が 推測できる → 例: のほうが❤️よりも価値が高い絵文字っぽい、とか 似た絵文字はやっぱりベクトル空間上でも 同じような場所に位置する、など
  25. 「私はあなたのことが好きです」 「私はあなたのことが嫌いです」 • w2vは実際は単語の「意味」ではなく、「単語の位置関係」を学習しているだけ • なので、対義語は同じ出現位置に登場するため、w2vからみれば等価 単語感情極性対応表 http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html 「ポジティブな単語」「ネガティブな単語」の辞書 <ポジティブな単語(1に近い数が付く)>

    優れる:すぐれる:動詞:1 良い:よい:形容詞:0.999995 喜ぶ:よろこぶ:動詞:0.999979 褒める:ほめる:動詞:0.999979 めでたい:めでたい:形容詞:0.999645 賢い:かしこい:形容詞:0.999486 善い:いい:形容詞:0.999314 適す:てきす:動詞:0.999295 天晴:あっぱれ:名詞:0.999267 祝う:いわう:動詞:0.999122 功績:こうせき:名詞:0.999104 ・・・ <ネガティブな単語(-1に近い数が付く)> ・・・ 苦しむ:くるしむ:動詞:-0.999805 下手:へた:名詞:-0.999831 卑しい:いやしい:形容詞:-0.99986 ない:ない:形容詞:-0.999882 浸ける:つける:動詞:-0.999947 罵る:ののしる:動詞:-0.999961 ない:ない:助動詞:-0.999997 酷い:ひどい:形容詞:-0.999997 病気:びょうき:名詞:-0.999998 死ぬ:しぬ:動詞:-0.999999 悪い:わるい:形容詞:-1 word2vecは対義語に弱い 「好き」と「嫌い」は真反対の意味なのに、ベクトル的にはかなり 近くなってしまう、という問題がw2vにはある どうやって解決する?…よし!そういう単語だけ別にベクトルを作っとこう! という力技で解決 Word2vecの登場はかなりのインパクトがあったが、 まだこういったところが微妙…
  26. 自然言語処理分析の主な流れ MeCab・Juman・Chasen・Cabocha・Sudachi 品詞フィルター・ストップワード・名寄せ など one-hot, BOW, N-gram, TF-IDF, word embedding(word2vec)

    など 機械学習手法いろいろ, Topic model, Deep Learning 文書分類・感情分析・文書生成・文書要約・機械翻訳・bot など • MeCab • One-hot • Word embedding (word2vec) • Topic model • Deep learning (RNN, LSTM, CNN) 文字列 単語・形態素列 数値化(ベクトル化) アルゴリズム計算 (前処理) もくじ BPは人工知能の会社です。 [BP, は, 人工知能, の, 会社, です, 。] [BP, 人工知能, 会社] [[***], [***], [***]] 処理例
  27. 自然言語処理でよく使われる機械学習モデル トピックモデル(文書分類のモデル) • ある1つの文書を見ても、その内容は複数のトピック(話題)が様々な割合で含まれる、というアイデア • そのトピックや割合は、単語の分布や量に関係しているはず、というアイデア(力士の名前が出てくれば 「相撲」の話題だろうし、キャラクターの名前が出てくればアニメだろう、ということ) 遺伝子などに関する トピック 進化などに関する

    トピック 神経などに関する トピック 数字などに関する トピック ひとつの生物学論文でも、その中には複数のトピックがまちまちな割合で含まれている • 単語の分布から、その文書のトピックを推定しようというモデル(つまり、文書分類問題を解くモデル) 自然言語処理による文書分類の基礎の基礎、トピックモデルを学ぶ https://qiita.com/icoxfog417/items/7c944cb29dd7cdf5e2b1
  28. トピックモデルの詳細 • 「文書における単語の出現確率」を推定するモデル • アルゴリズム(Latent Dirichlet Allocation: LDA)はgensimというPythonパッケージがサポートしているのでお手軽に試すことが可能 • インプットデータはbag

    of words • そのため、文法規則などは考慮されない • 単語分布を元に計算を行うので正解ラベルなどは特に不要(教師なし学習) • 出力のトピック数はパラメータになる • 分類される単語はソフトクラスタリングとなる • 出力されたトピックは、出力された単語を見て人間が解釈しないといけない(←ビジネス案件でトピックモデルを使うとこれが厄介!) • 各文書の特徴量をトピック数の次元に削減していると言う意味では、topic model は次元削減の手法でもある • 各語もトピック次元で表現するということは、「語のベクトル化」の手法でもある 文書AのBOW 文書BのBOW 文書CのBOW 文書DのBOW 文書▪のBOW ・・・ LDA Topic 1 ITに関するトピック? Topic 2 旅行に関するトピック? Topic 3 農業に関するトピック? Topic 20 研究に関するトピック? トピックを推定したい 謎の文書 LDA ・・・ 学習 学習済みモデルで推論 Topic 1 Topic 2 ・・・ Topic 20 クラウド 0.5 0.2 ・・・ 0.1 ホテル 0.2 0.4 ・・・ 0.2 農業 0.1 0.05 ・・・ 0.1 ・・・ ・・・ ・・・ ・・・ ・・・ 研究 0.01 0.1 ・・・ 0.1 単語のベクトル化(分散表現)
  29. トピックモデルでわからないこと • トピックモデルのインプットはBoWなので、「語順」の情報は持っていない • トピックモデルは単語の統計分布によって計算する • なので、「文脈」みたいなものは考慮されない 例) 力士のAさんは身長170cm、体重120kgの巨体だ。両国での稽古を終えちゃんこを食べ、向かった先はイオ ン。今日はぽっちゃり体型のAさんのような人にも似合う服を紹介する。

    主題はおそらく「ファッション」だが、登場単語的に「相撲」が強い。 もしくは、 例) 最近、マックの調子が悪い マクドナルドの業績不振?Mac bookの調子が悪い? 前後の文脈をみないとどちらの「マック」かわからない
  30. 時系列(文法規則)を考慮するモデル RNN • 「文書だとやっぱり前後の文脈も考慮に入れたいよねー」という時に使われる深層学習モデル • ニューラルネットで単語の(比較的遠めの)前後関係も学習するために膨大なデータを使って学習する必要がある • 学習は遅い(GPU使用効率も悪い) • 文脈が重要になる機械翻訳などで活躍(現在ではもっと優れたモデルがいろいろある)

    Understanding LSTM Networks http://colah.github.io/posts/2015-08-Understanding-LSTMs/
  31. 画像分析のアルゴリズムをNLPに適応する • RNNは遅すぎる!もっと早く計算したい! • w2vの分散表現をインプットとして画像のように畳み込みを行って計算する • ウィンドウサイズ(カーネルサイズ)をある程度大きく取ることで、単語の前後関係(文脈)も少しは考慮できる • 時系列モデルよりは過去の情報を使えないが、“not amazing”

    と “amazing not“ など連続する文章は識別できる • CNNなので計算が早い Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification Understanding Convolutional Neural Networks for NLP http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/
  32. (おまけ)フォローすべき自然言語処理の知識人 @Hironsan13 @SnowGushiGit @icoxfog417

  33. Enjoy Starting NLP Life! Feedback to @yutatatatata