霞と側杖を食らう

ほしいものです。なにかいただけるとしあわせです。[https://www.amazon.jp/hz/wishlist/ls/2EIEFTV4IKSIJ?ref_=wl_share]

Rによるテキストマイニング(機械学周編)の学習記録

【学習動機】

これまでベイズ統計を学んできたけど、ノンパラベイズをまだ知らない。ノンパラベイズについて調べてみると、ディリクレ過程が出てきて、ディリクレについて調べてみると、トピックモデルが出てきた。トピックモデルで何かしたいというわけじゃないが、理論を追ってトピックモデルは行けたらいいなと思った。
トピックモデルは自然言語処理に関連する。機械学習関連分野に、自然言語処理と画像認識があるが、どちらかできるようにしておくといいなと思っていた。でも、画像認識は出来れば面白そうだけどマシンパワーないと辛そうだし、自然言語処理文字コードとか面倒だからいいやと放置していた。今回、自然言語処理と触れ合えるチャンスなので、入門してみようという気持ちが起こった。できるようになれば、趣味としても面白いような気もするし、実力ついたら、それはそれで将来どこかで仕事に使えるかもしれない。そんなわけで、とりあえずRで基本的なことをできるようにしようと思い立ったのである。

【学習記録】

<総括>

小林『Rによるやさしいテキストマイニング[機械学習編]』を読むことにした。

https://www.amazon.co.jp/R%E3%81%AB%E3%82%88%E3%82%8B%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E7%B7%A8-%E5%B0%8F%E6%9E%97-%E9%9B%84%E4%B8%80%E9%83%8E/dp/4274221008

200ページほどで、自然言語処理、前処理、スクレイピング機械学習のRを用いたやり方が分かるのは良い。駆け抜けていくような本。ざっくり手法を知るのには適していると思われる。コードの重複するような部分はサポートページに任せて、関数の説明をもう少し詳しくすればベターだったと感じた。この『Rによるやさしいテキストマイニング』はシリーズ化されており、無印版と活用事例編版がある。活用事例編は気になるところ。

サポートページに、付属データがないんだけど、、、
https://www.ohmsha.co.jp/book/list.htm?keyword=r%E3%81%AB%E3%82%88%E3%82%8B%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0&cmid=752

と思ったら、ここにあった。

ML - Rによるやさしいテキストマイニング

第1章から第4章までがテキストマイニングの基本を扱っており、第5章から第7章が機械学習の手法を扱っている。

c1:自然言語処理

形態素解析は、文を単語単位で分割。各単語の品詞などを同定する処理。
日本語の形態素解析ツールとして、MeCabChaSen、JUMAN、KyTeaが挙げられている。
規則や定義がツールごとに違うので、1つのプロジェクトでは同一のものを使うべし。

【MeCab】を【R】で使えるようにするための【RMeCab】を導入する方法・流れ【Windows編】|さぎのみや家の分析録

これに従って、MeCabとRMeCabのインストールをした。日本語はこれでなんとかなりそう。
英文解析では、パッケージのopenNLPとNLPを使っている。
やってみると、library(openNLP)がうまくいかない。
error: JAVA_HOME cannot be determined from the Registry
とエラーを吐いてくる。windowsのデフォルトのjavaが32bitなのが悪いらしい(?)
rJavaがロードできない - 盆栽日記 これで解決できたぽい。

構文解析(係り受け解析)は、文を区単位で分割し、区の係り受け関係(修飾・非修飾関係)を分析する技術。
日本語の構文解析ツールとして、CaBoChaとKNPが挙げられている。 英語では、openNLPmodels.enパッケージとopenNLPパッケージのParse_Annotator()で解析可能。

・意味解析は、いくつか種類があって、固有表現抽出、術後項構造解析、語義曖昧性解消、評判分析(感情分析)がある。ここでは、評判分析の例が紹介されている。ポジ・ネガの単語が入ってる評価表現辞書が必要。 英文の評価分析をするならば、tidytextが有用。パッケージに3つの辞書(afinn, bing, nrc)があり、言葉とそれに対応する感情(nrcならば、anger, fear, positive, negativeなど10種類)のデータフレームとして入っている。

head(get_sentiments("afinn"))
summary(get_sentiments("afinn")$score)

と確認したところ、afinn辞書はwordに対応するscoreがmax5のmin-5で与えられている。

head(get_sentiments("bing"))
unique(get_sentiments("bing")$sentiment)

と確認したところ、bing辞書はwordに対応するposiとnegaのみ。
tidytextは単語単位の評判分析ができたが、文単位の評判分析はSentimentAnalysisパッケージで可能。本書の第一版第一刷時点では、CRANに公開されていなかったみたいだが、2018/10/11現在では公開されていて、普通にインストールできた。
日本語の評価表現辞書としては、単語感情極性対応表、日本語評価極性辞書が挙げられている。

R+RMeCabで感情分析

このへんを参考にすれば日本語はできそう。

・言語判定は、テキストが何の言語か判定する技術。textcatパッケージで可能。

・文書要約は、重要な情報を自動で抽出する技術。LSAfunパッケージのgenericSummary()で可能。

c2:テキスト処理

テキストの読み込みと整形と頻度集計と用例検索を扱っている。

テキストの読み込みはscan()で、整形はstringrやtmで小文字変換、句読点、数字削除。tmのstopwordsも。日本語なら、stringrのstr_replace_all()で。頻度集計は日本語ならRMeCabTxet()で得た結果をmap_chrの第二引数をextract(1)と指定して、table()で集計して、sort()で並べ替え、データフレーム化してあげればいい。もしくはRMeCabFreq()を使ってもできる。
複数文書の頻度集計すると文書ターム行列が得られる。(NLPの理論本ぱらぱら見てて、潜在意味解析(LSA)の特異値分解のとこで出てきたやつか!)
英語なら、tmのCourpus()を整形して、DocumentTermMatrix()で文書ターム行列作成して、as.matrix()でゲット。
日本語なら、RMeCabのdocDFでできる。 n-gramの頻度集計、日本語なら、RMeCabのNgram()で可能。共起語の頻度集計は、日本語なら、RMecabのcollocate()で。 用例検索はforループで。

c3:スクレイピング

rvestを使用。これは、もう少し詳しく掘り下げたいため、今回は簡単にコード回して別の機会に。

『Rによるスクレイピング入門 』 https://www.amazon.co.jp/R%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E7%9F%B3%E7%94%B0-%E5%9F%BA%E5%BA%83/dp/486354216X

で学びたいところ。

c4:データハンドリング

これも、宇宙本で過去に学習しているため、流し見しただけ。テキストに対してどのように使うかは追加的に学べる。

Rstudioとtidyverseの学習記録 - 霞と側杖を食らう

c5:回帰

この章から機械学習の手法のパートになるが、だいたいの手法は知っているため、コードを書いて流し見。気になったところはメモする形になる。 p119のcolnames(BNCbiber)の結果が違う。たとえば、"f_01_past_tense"は"f01_past_tense"。 p120のselect(BNCbiber, ~~~)は、エラーが出る。

Error in UseMethod("select_") : 
  no applicable method for 'select_' applied to an object of class "c('matrix', 'double', 'numeric')"

classがmatrixだとダメなのでは?仕方がないので、as.data.frame(BNCbiber)でデータフレームに変換したら解決。
平滑化回帰の交差検証のところで、bisoregパッケージのloess.wrapperをやっても、返ってこない、なぜか不明。
正則化回帰はglmnetパッケージ使ってやってる。問題ない。

c6:分類

k近傍法をclassパッケージのknn()でやっている。knn(trainの説明変数, testの説明変数, trainの目的変数, kの数) 書かれていないが、caretパッケージのconfusionMatrix()を使うにはe1071パッケージも必要みたい。
ナイーブベイズをe1071パッケージのnaiveBayes()でやっている。
ニューラルネットワークをnnetパッケージで。SVMをe1071パッケージのsvm()で。
ちなみに、e1071パッケージの名前は、" Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien"とあり、このパッケージを作ったウィーン工科の研究チームの識別子がe1071だったことに由来するみたい。

https://cran.r-project.org/web/packages/e1071/e1071.pdf

決定木のCARTをrpartパッケージとrpart.plotパッケージを使っている。
バギングはadabagパッケージのbagging()、ブースティングはadabagパッケージのboosting()、勾配ブースティングはgbmパッケージのgbm()を使用。ランダムフォレストはrandomForestパッケージのrandomForest()。

このへんのアンサンブル学習は、なんかよく使われているらしいけど、何も理論的背景を知らないので、入門してみたいところ。

c7:教師なし学習

階層型クラスタリングはdist()で距離を得て、hclustに、得た距離をつっこんで、methodを指定すればオーケー。
階層型クラスタリングは可視化性能は良いが、計算量が多く、大きいデータには使いにくい。 kmeans()でk-means法。
自己組織化マップはkohonenパッケージのsomgrid()とsom()を使用。
word2vecをwordVectorsパッケージで実行。やってみたけど、たぶん、メモリ不足で上手くいかなかった。 トピックモデル 1つの文書なら、ldaパッケージで可能。日本語でやるなら、RMeCabで形態素解析済みのデータを作ってやる必要がある。
複数文書なら、topicmodelsパッケージを使うとよい。

【学習予定】

トピックモデルが気になるので、理論含めて学んでいきたい。

佐藤『トピックモデルによる統計的潜在意味解析 (自然言語処理シリーズ) 』

https://www.amazon.co.jp/%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E7%B5%B1%E8%A8%88%E7%9A%84%E6%BD%9C%E5%9C%A8%E6%84%8F%E5%91%B3%E8%A7%A3%E6%9E%90-%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BD%90%E8%97%A4%E4%B8%80%E8%AA%A0/dp/4339027588/ref=pd_bxgy_14_img_2?_encoding=UTF8&pd_rd_i=4339027588&pd_rd_r=1c761cb3-d025-11e8-a088-e38b52a8e10c&pd_rd_w=cjY9N&pd_rd_wg=hAy82&pf_rd_i=desktop-dp-sims&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=a4de75e6-d8f7-4a34-bd69-503ea4866e6c&pf_rd_r=YMC0NPW68TZJ139H80GE&pf_rd_s=desktop-dp-sims&pf_rd_t=40701&psc=1&refRID=YMC0NPW68TZJ139H80GE

岩田『トピックモデル (機械学習プロフェッショナルシリーズ)』

https://www.amazon.co.jp/%E3%83%88%E3%83%94%E3%83%83%E3%82%AF%E3%83%A2%E3%83%87%E3%83%AB-%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B2%A9%E7%94%B0-%E5%85%B7%E6%B2%BB/dp/4061529048/ref=pd_rhf_dp_s_cp_0_6?_encoding=UTF8&pd_rd_i=4061529048&pd_rd_r=32a053ef-9690-4827-b938-0ee907c2dc6d&pd_rd_w=KXxPv&pd_rd_wg=wwj3v&psc=1&refRID=1S99Q54MSNH93XTCV1QR

あたりで学習していきつつ、実際に何かしらのデータを用いて試していきたい所存。