RMeCabで形態素解析してみた


# 1. はじめに

**形態素解析**とは、テキストを形態素の単位(=意味の最小単位)に分割することを指します。

データ解析専用のオープンソース・フリーソフトウェアの**R言語**においては、
ライブラリー **RMeCab**を使用することによって、形態素解析を行うことができます。

今回は、**RMeCab** を使用して、簡単な形態素解析を実行してみます。
※ Mac PCで実行します。

# 2. 準備

## 2-1. RStudio インストール

**R言語**を使用するために、**RStudio**をインストールします。
インストールイメージは、以下のリンク先からダウンロードできます。

R Studio
https://www.rstudio.com/products/rstudio/download/

## 2-2. MeCab 準備

オープンソースの形態素解析エンジン **MeCab**と MeCab 用の辞書 をインストールします。

### ① MeCabインストール

Macでは**Homebrew**を使用することでインストールすることができます。

※ Homebrewがない場合は、以下リンク先を参考にインストールします。
https://brew.sh/index_ja.html

以下をターミナルで実行し、MeCabをインストールします。

```
brew install mecab
```


### ② 辞書インストール

辞書についても**Homebrew**を使用してインストールします。

以下をターミナルで実行し、辞書をインストールします。

```
brew install mecab-ipadic
```


## 2-3. RMeCabインストール

**MeCab**をRで使うため、ライブラリー**RMeCab**をインストールします。

以下を RStudioのコンソール上で実行し、
ライブラリー**RMeCab**をインストールします。

```
install.packages("RMeCab", repos = "https://rmecab.jp/R", type = "source") 
```


## 2-4. 動作確認

インストールした**RMeCab**が正常に使用できるか、簡単な実行をして確認します。

### ① ライブラリー読み込み

RMeCabで用意されている関数を実行する前に、
ライブラリー**RMeCab**を読み込みます。

以下を RStudio コンソール上で実行します。

```
library(RMeCab)
```


### ② RMeCabC関数 実行

**RMeCabC関数** を使用して、指定した文字列を形態素解析してみます。
引数に日本語文字列を設定すると、MeCabで解析した結果が返されます。

**RMeCabC関数**に 日本語文字列 *"すもももももももものうち"* を引数として設定し、実行します。

```
> res <- RMeCabC("すもももももももものうち")
> res
[[1]]
    名詞 
"すもも" 

[[2]]
助詞 
"も" 

[[3]]
  名詞 
"もも" 

[[4]]
助詞 
"も" 

[[5]]
  名詞 
"もも" 

[[6]]
助詞 
"の" 

[[7]]
  名詞 
"うち" 
```

見やすさのため、**unlist関数**を使用して、結果*res*はリストからベクトルに変換します。

```
> unlist(res)
    名詞     助詞     名詞     助詞     名詞     助詞     名詞 
"すもも"     "も"   "もも"     "も"   "もも"     "の"   "うち" 

```

引数に設定した文字列が分割されて、単語とその品詞が確認できます。


# 3. 形態素解析 実行

## 3-1. やりたいこと

前項では短文での形態素解析を実行しましたが、
ここではさらに長いテキストデータを読み込んで、単語の頻出数を確認してみます。

## 3-2. 実行

### ① テキストデータ 準備

今回は、以下リンク先の青空文庫のサイトから 作品をダウンロードして、
形態素解析を実施します。

青空文庫
https://www.aozora.gr.jp/

読み込みには **Aozora関数** を使用します。

事前に 以下をRStudioコンソールで実行し、**Aozora関数** を読み込んでおきます。

```
source("http://rmecab.jp/R/Aozora.R")
```

**Aozora関数**の引数に、
青空文庫サイト内の 読み込みたいテキストファイルのリンクを指定します。

ここでは、以下リンク先のファイルを読み込みます。

・夏目漱石 『吾輩は猫である』
https://www.aozora.gr.jp/cards/000148/files/789_ruby_5639.zip

実行例は以下の通りです。
読み込んだファイルは *text* に入力します。

```
> text <- Aozora("https://www.aozora.gr.jp/cards/000148/files/789_ruby_5639.zip")
example: folder_name <- Aozora('http://www.aozora.gr.jp/cards/000081/files/462_ruby_716.zip')


 URL 'https://www.aozora.gr.jp/cards/000148/files/789_ruby_5639.zip' を試しています 
Content type 'application/zip' length 344964 bytes (336 KB)
==================================================
downloaded 336 KB


```

### ② RMeCabFreq関数 実行

**RMeCabFreq関数** を使用して、読み込んだテキスト内での各単語の出現頻度を確認します。

**RMeCabFreq関数**は、引数にファイルを設定すると、
ファイル内のテキストを形態素解析し、活用形は原形に変換した上で、
各単語の頻度がデータフレームで返されます。

※ まだの場合は、事前に **RMeCab**を読み込んでおきます。

```
> library(RMeCab)
```

**RMeCabFreq関数**に、前工程で テキストを読み込んだ *text* を引数に指定します。
実行結果は*res*に入力します。

```
> res <- RMeCabFreq(text)
file = ./NORUBY/wagahaiwa_nekodearu2.txt 
length = 12835

```

結果を入力した *res*の中身を確認すると、以下のようになります。

```
> res
                                            Term    Info1                    Info2 Freq
1                                             よ   その他                     間投    1
2                                             あ フィラー                        *   66
3                                           あの フィラー                        *   30
4                                           あー フィラー                        *    2
5                                         うんと フィラー                        *    5
~~~(省略)~~~

```

**RMeCabFreq関数**の実行結果として、以下項目が確認できます。

|列名|説明|
|:---:|:---|
|**Term**|形態素|
|**Info1**|品詞|
|**Info2**|品詞細分類|
|**Freq**|頻度|


### ③ グラフ描画

各形態素の頻出数を棒グラフにまとめます。

ここでは、品詞（*Info1*）が*名詞*かつ品詞細分類(*Info2*)が*一般*であり、頻度（*Freq*）が*100*より大きい単語に絞ります。

まず、以下のようにして 単語を絞り込んで、*res2*に入力します。

```
> res2 <- res[res[,2]=="名詞" & glove[,3]=="一般" & glove$Freq>100,]
> res2
      Term Info1 Info2 Freq
5374  主人  名詞  一般  932
5436    人  名詞  一般  355
5470  人間  名詞  一般  272
5584    例  名詞  一般  108
5691  先生  名詞  一般  274
6341    声  名詞  一般  143
6511    女  名詞  一般  118
7708  東風  名詞  一般  118
7952    気  名詞  一般  157
8343    猫  名詞  一般  249
8439    男  名詞  一般  147
8607    眼  名詞  一般  142
8874  細君  名詞  一般  213
9109  自分  名詞  一般  175
9728  迷亭  名詞  一般  329
9946    間  名詞  一般  103
10113   頭  名詞  一般  166
10130   顔  名詞  一般  272
10304   鼻  名詞  一般  199
```

**barplot関数**を使用して、棒グラフを描画します。

引数には、先ほど絞り込んだデータを入力した *res2*の *Freq*列 を指定し、
各単語の頻出数を棒グラフに表示させます。

また、**barplot関数**のオプションとして 以下を設定しています。

|オプション|説明|設定値|
|:---:|:---|:---|
|**main**|グラフタイトル|"単語頻出数"|
|**names.arg**|各要素名|res2$Term|
|**xlab**|x軸 ラベル|"単語"|
|**ylab**|y軸 ラベル|"頻出数"|
|**ylim**|y軸 表示範囲|c(0, 1000)|

以下のように **barplot関数**を実行します。

```
> barplot(res2$Freq, main = "単語頻出数", names.arg=res2$Term, xlab = "単語", ylab = "頻出数", ylim=c(0, 1000))
```

実行結果として、以下のような棒グラフが表示されます。

![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/a5cc2b07-4873-61a1-6847-1de4f6fe2cb8.png)



# 4. おわりに

今回は **RMeCab**を使用して、簡単な形態素解析を実行してみました。

**RMeCab**には、**RMeCabC関数**、**RMeCabFreq関数**の他にも様々な関数が用意されています。
**RMeCab**の詳細な使用方法は、マニュアルにて確認することができます。

RMeCab の使い方
http://rmecab.jp/wiki/index.php?plugin=attach&pcmd=open&file=manual.pdf&refer=RMeCab


# 参考情報

RMeCab の使い方
http://rmecab.jp/wiki/index.php?plugin=attach&pcmd=open&file=manual.pdf&refer=RMeCab

アールメカブ
http://rmecab.jp/wiki/index.php?FrontPage

RMeCabを用いた日本語テキストマイニング
https://www.oreilly.co.jp/pub/9784873118307/appa.html

RMeCab
https://sites.google.com/view/rmecab/

R-Tips
http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html

データ科学便覧
https://data-science.gr.jp/

青空文庫
https://www.aozora.gr.jp/