R でのテキストマイニングに入門してみた

[Rによるテキストマイニング](https://www.oreilly.co.jp/books/9784873118307/)を読んでいまして、業務に使えないかなぁと思いつつ、試してみたことを残しておこうと思います。

## 今回の記事の実行環境

* Windows 7

## 参考書籍

* [Rによるテキストマイニング](https://www.oreilly.co.jp/books/9784873118307/)

書籍に記載のコードは[こちら](https://github.com/dgrtwo/tidy-text-mining)にあるとのことです。

## R 実行環境の準備

[chocolatey](https://chocolatey.org/) にパッケージがあったので、それでインストールしました。

```cmd
> choco install R
> choco install R.Studio
```

## パッケージのインストール

R では、CRAN を経由してパッケージをインストールする、と。
R Studio であれば、[Tools] - [Install Packages...] で、GUI でインストールできます。今回は下記のパッケージをインストールしました。

* dplyr
* tidytext
* quanteda

## 試す

RStudio の Console で実行しました。

### unnest_tokens() によるトークン化

```R
> text <- c("test desu -",
+           "okok -",
+           "hoge fuga moge -",
+           "upupup")
> text
[1] "test desu -"     "okok -"           "hoge fuga moge -"
[4] "upupup"          

> library(dplyr)

> text_df <- data_frame(line=1:4, text=text)
> text_df
# A tibble: 4 x 2
   line text            
  <int> <chr>           
1     1 test desu -    
2     2 okok -          
3     3 hoge fuga moge -
4     4 upupup          

> library(tidytext)
> text_df %>%
+     unnest_tokens(word, text)
# A tibble: 7 x 2
   line word  
  <int> <chr> 
1     1 test  
2     1 desu 
3     2 okok  
4     3 hoge  
5     3 fuga  
6     3 moge  
7     4 upupup
```

おー。できました。

### ｎグラムでトークン化

n=2 で試してみます。

```R
> text_df %>%
+     unnest_tokens(bigram, text, token = "ngrams", n = 2)
# A tibble: 5 x 2
   line bigram    
  <int> <chr>     
1     1 test desu
2     2 NA        
3     3 hoge fuga 
4     3 fuga moge 
5     4 NA 
```

こんな感じ。NA のところは、１単語しかない行があったからですね。

### 大統領演説中の単語の出現頻度が時代とともにどう変わるか

ほぼ写経です ^^;

```R
> library(methods)
> data("data_corpus_inaugural", package = "quanteda")
> inaug_dfm <- quanteda::dfm(data_corpus_inaugural, verbose = FALSE)
> 
> inaug_td <- tidy(inaug_dfm)
> inaug_td
# A tibble: 44,709 x 3
   document        term            count
   <chr>           <chr>           <dbl>
 1 1789-Washington fellow-citizens     1
 2 1797-Adams      fellow-citizens     3
 3 1801-Jefferson  fellow-citizens     2
 4 1809-Madison    fellow-citizens     1
 5 1813-Madison    fellow-citizens     1
 6 1817-Monroe     fellow-citizens     5
 7 1821-Monroe     fellow-citizens     1
 8 1841-Harrison   fellow-citizens    11
 9 1845-Polk       fellow-citizens     1
10 1849-Taylor     fellow-citizens     1
# ... with 44,699 more rows
>
> inaug_tf_idf <- inaug_td %>%
+     bind_tf_idf(term, document, count) %>%
+     arrange(desc(tf_idf))
> 
> inaug_tf_idf
# A tibble: 44,709 x 6
   document        term        count      tf   idf tf_idf
   <chr>           <chr>       <dbl>   <dbl> <dbl>  <dbl>
 1 1793-Washington arrive          1 0.00680  4.06 0.0276
 2 1793-Washington upbraidings     1 0.00680  4.06 0.0276
 3 1793-Washington violated        1 0.00680  3.37 0.0229
 4 1793-Washington willingly       1 0.00680  3.37 0.0229
 5 1793-Washington incurring       1 0.00680  3.37 0.0229
 6 1793-Washington previous        1 0.00680  2.96 0.0201
 7 1793-Washington knowingly       1 0.00680  2.96 0.0201
 8 1793-Washington injunctions     1 0.00680  2.96 0.0201
 9 1793-Washington witnesses       1 0.00680  2.96 0.0201
10 1793-Washington besides         1 0.00680  2.67 0.0182
# ... with 44,699 more rows

> library(tidyr)
> year_term_counts <- inaug_td %>%
+     extract(document, "year", "(\\d+)", convert=TRUE) %>%
+     complete(year, term, fill = list(count = 0)) %>%
+     group_by(year) %>%
+     mutate(year_total = sum(count))

> library(ggplot2)
> year_term_counts %>%
+     filter(term %in% c("god", "america")) %>%
+     ggplot(aes(year, count / year_total)) +
+     geom_point() +
+     geom_smooth() +
+     facet_wrap(~ term, scales = "free_y") +
+     scale_y_continuous(labels = scales::percent_format()) +
+     ylab("% freq of word in inaugural address")
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
```

うぅ・・・ちゃんと理解せねば・・・

そして、出力されたグラフがこちら
![image.png](https://qiita-image-store.s3.amazonaws.com/0/218221/74d7249d-1144-76b4-193c-a258546e1fd2.png)
おー。ちゃんとできた。それなりにキレイ・・・！

### 最後に

R は初めて触りましたが、分析からグラフ化までサクっとできるのは、とても手を動かしやすいなぁと思いました。

もっと色々データの持ち方などを勉強しなければとは思いますが、「どういう風に単語の出現頻度が変わるか」といったあたりは、すごく興味を持ちました。トレンド分析とかにも使えそう・・・！