Lecture10: koRpusパッケージ, 多次元尺度法(Multi-Dimensional Scaling)

準備

getFreqDir関数の読み込み

source("getFreqDir.R")
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

補足:Term Frequency-Inverse Document Frequency(説明1ビデオ)

  • 複数のテキストに共通して出現する単語の頻度数を少なく重み付け

TF-IDF 2

\[w=tf*(log(\frac{N}{df})+1) \]

  • tf: term frequency
  • df: document frequency

テストデータ

(testTF<- getFreqDir("testData"))
##   test1 test2 test3 test4
## c    13     2     3     5
## e     7     1     1     2
## b     4     4     0     4
## a     3     2     2     4
## f     0    11     9    20
## g     0     7     7    14
## h     0     0     4     4
## d     0     0     1     1

TF-IDF2を計算

  N<-ncol(testTF)
  testDF<-apply(testTF, 1, function(x) length(x[x>0]) )
  testWeighted<-testTF*(log(N/testDF)+1)
  round(testWeighted,2)
##   test1 test2 test3 test4
## c 13.00  2.00  3.00  5.00
## e  7.00  1.00  1.00  2.00
## b  5.15  5.15  0.00  5.15
## a  3.00  2.00  2.00  4.00
## f  0.00 14.16 11.59 25.75
## g  0.00  9.01  9.01 18.03
## h  0.00  0.00  6.77  6.77
## d  0.00  0.00  1.69  1.69

RStudio cloudからShinyapps.ioへのアップロード(Demo1, 説明2ビデオ)

  • https://www.shinyapps.io/ にshinyのアプリケーションをアップロード

    - Step1: https://www.shinyapps.io/にログイン

    - Step2: (初回のみ)rsconnectパッケージをインストール

    - Step3: RStudio cloudのshinyアプリケーション(例:apps/app_hoge)のファイルを開き、“Run App”アイコンをクリックして起動

    - Step4: アプリケーション画面右上の“publish”アイコンをクリック

    - Step5: (初回のみ)rsconnectの認証情報をコピー&ペースト

TreeTaggerのインストール(Demo2ビデオ, 説明3ビデオ)

TreeTagger

  • CLEからLec10_TreeTaggerのzipファイルをダウンロードし、RStudio cluoud上のホームディレクトリ(~)にアップロード readme.txt(小文字のファイル名)の上から3行をコピーして、RStudio cluoudのTerminalに貼り付けて実行 readme.txtの6行目をコピーして、RStudio cluoudのTerminalに貼り付けて実行し、英語の形態素解析を確認 *readme.txtの8行目をコピーして、RStudio cluoudのTerminalに貼り付けて実行し、仏語の形態素解析を確認

koRpusパッケージ

  • koRpusパッケージのインストール ## koRpus, koRpus.lang.enライブラリの読み込み
library(koRpus)
## Loading required package: sylly
## For information on available language packages for 'koRpus', run
## 
##   available.koRpus.lang()
## 
## and see ?install.koRpus.lang()
library(koRpus.lang.en)
#set.kRp.env(TT.cmd="~/treetagger/cmd/tree-tagger-english",lang="en")

Tokenizing (分かち書き)

tokenize("shiny.txt", lang="en", doc_id="shiny")
##    doc_id       token      tag lemma lttr   wclass desc stop stem idx sntc
## 1   shiny       Shiny word.kRp          5     word <NA> <NA> <NA>   1    1
## 2   shiny          is word.kRp          2     word <NA> <NA> <NA>   2    1
## 3   shiny          an word.kRp          2     word <NA> <NA> <NA>   3    1
## 4   shiny           R word.kRp          1     word <NA> <NA> <NA>   4    1
## 5   shiny     package word.kRp          7     word <NA> <NA> <NA>   5    1
## 6   shiny        that word.kRp          4     word <NA> <NA> <NA>   6    1
##                                              [...]                        
## 48  shiny htmlwidgets word.kRp         11     word <NA> <NA> <NA>  48    2
## 49  shiny           ,     ,kRp          1    comma <NA> <NA> <NA>  49    2
## 50  shiny         and word.kRp          3     word <NA> <NA> <NA>  50    2
## 51  shiny  JavaScript word.kRp         10     word <NA> <NA> <NA>  51    2
## 52  shiny     actions word.kRp          7     word <NA> <NA> <NA>  52    2
## 53  shiny           .     .kRp          1 fullstop <NA> <NA> <NA>  53    2

Part-of-Speech(POS) Tagging

treetag(
  "shiny.txt",
  treetagger="manual",
  lang="en",
  TT.options=list(
    path="/home/rstudio-user/treetagger",
    preset="en"
  ),
  doc_id="shiny"
)
##    doc_id       token  tag     lemma lttr      wclass desc stop stem idx sntc
## 1   shiny       Shiny  AJ0     shiny    5   adjective <NA> <NA> <NA>   1    1
## 2   shiny          is  VBZ        be    2        verb <NA> <NA> <NA>   2    1
## 3   shiny          an  AT0        an    2     article <NA> <NA> <NA>   3    1
## 4   shiny           R  ZZ0         r    1      letter <NA> <NA> <NA>   4    1
## 5   shiny     package  NN1   package    7        noun <NA> <NA> <NA>   5    1
## 6   shiny        that  CJT      that    4 conjunction <NA> <NA> <NA>   6    1
##                                                 [...]                        
## 48  shiny htmlwidgets  NN2 <unknown>   11        noun <NA> <NA> <NA>  48    2
## 49  shiny           ,  PUN         ,    1 punctuation <NA> <NA> <NA>  49    2
## 50  shiny         and  CJC       and    3 conjunction <NA> <NA> <NA>  50    2
## 51  shiny  JavaScript  NP0 <unknown>   10        noun <NA> <NA> <NA>  51    2
## 52  shiny     actions  NN2    action    7        noun <NA> <NA> <NA>  52    2
## 53  shiny           . SENT         .    1    fullstop <NA> <NA> <NA>  53    2

多次元尺度法(説明4ビデオ)

univディレクトリ内の頻度表の作成

univTable <- getFreqDir("univ")

MDS: Euclidean距離

mds <- cmdscale(dist(t(univTable)),2)
plot(mds,type="n")
text(mds,rownames(mds))

MDS: Canberra距離距離

mds <- cmdscale(dist(t(univTable), method = "canberra"),2)
plot(mds,type="n")
text(mds,rownames(mds))

おまけ:描画時の日本語の文字化け対策(Demo3ビデオ)

今日の課題(締切日1月6日)

“getFreqDir.R”に、2種類のTF-IDFの計算を選べる関数に拡張し、Shiny appで実装してください。

  • Shiny appは、app_tfidfをもとにして作成

  • 頻度表の表示形式は、小数点2桁

  • getFreqDir.Rはapp_tfidfフォルダ内のファイルを拡張しても構わない(自分のファイルを修正する場合は、app_tfidfにコピーして使用すること)

課題ができた人は、Shinyapps.oiのリンク情報をメールで送ってください。

getFreqDir.Rの実行例

引数を何も指定しない & 引数tfidf値が0の場合->粗頻度行列

res<-getFreqDir("testData", tfidf=0)
round(res,2)
##   test1 test2 test3 test4
## c    13     2     3     5
## e     7     1     1     2
## b     4     4     0     4
## a     3     2     2     4
## f     0    11     9    20
## g     0     7     7    14
## h     0     0     4     4
## d     0     0     1     1

tfidf引数に”1”を指定した場合->TF-IDF1の計算結果を出力

res<-getFreqDir("testData", tfidf=1)
round(res,2)
##   test1 test2 test3 test4
## b  1.15  1.15  0.00  1.15
## f  0.00  3.16  2.59  5.75
## g  0.00  2.01  2.01  4.03
## h  0.00  0.00  2.77  2.77
## d  0.00  0.00  0.69  0.69

tfidf引数に”2”を指定した場合->TF-IDF2の計算結果を出力

res<-getFreqDir("testData", tfidf=2)
round(res,2)
##   test1 test2 test3 test4
## c 13.00  2.00  3.00  5.00
## e  7.00  1.00  1.00  2.00
## b  5.15  5.15  0.00  5.15
## a  3.00  2.00  2.00  4.00
## f  0.00 14.16 11.59 25.75
## g  0.00  9.01  9.01 18.03
## h  0.00  0.00  6.77  6.77
## d  0.00  0.00  1.69  1.69