Rでの単語文書行列重み付けtfｰidfについて比較　RMeCabパッケージとtmパッケージ

# はじめに
Rで文書－単語行列を作成する際
日本語形態素解析でおなじみのRMeCabパッケージのdocDF関数と英語の単語文書行列作成のtmパッケージのTermDocumentMatrix関数ではtf-idfの式が違いました。
今回はその比較を例を挙げて検証してみます。
# 環境
R 3.6.1 64bit
RStudio 1.2.1335
MeCab 0.996-32bit
RMeCab 1.04
tm 0.7-7
#  RMeCabのdocDF関数のidf
以下の3人の会話を解析してみます。
Aさん「私はサラダとハンバーグを食べます。」
Bさん「私は姉とハンバーグを食べます。」
Cさん「私は東京出身です。」

### 文書のデータフレーム作成

```R
a<-"私はサラダとハンバーグを食べます。"
b<-"私は姉とハンバーグを食べます。"
c<-"私は東京出身です。"
texts<-data.frame(rbind(a,b,c))
```

###RMeCabのidf計算 
重み付けなしの単語－文書行列とtf-idfの単語－文書行列よりidf計算

```R
library(RMeCab)

> #重み付けなし
> tdm1<-docDF(texts,1,type=1,pos=c("名詞","形容詞","動詞"))
number of extracted terms = 7
now making a data frame. wait a while!

> rownames(tdm1)<-tdm1$TERM
> colnames(tdm1)<-c(colnames(tdm1[,1:3]),"Aさん","Bさん","Cさん")
> tdm<-tdm1[,-1:-3]
> tdm
           Aさん Bさん Cさん
サラダ         1     0     0
ハンバーグ     1     1     0
姉             0     1     0
私             1     1     1
出身           0     0     1
食べる         1     1     0
東京           0     0     1

> #tf-idf
> tdm.tfidf1<-docDF(texts,1,type=1,pos=c("名詞","形容詞","動詞"),weight="tf*idf")
number of extracted terms = 7
now making a data frame. wait a while!

> rownames(tdm.tfidf1)<-tdm.tfidf1$TERM
> colnames(tdm.tfidf1)<-c(colnames(tdm.tfidf1[,1:3]),"Aさん","Bさん","Cさん")
> tdm.tfidf<-tdm.tfidf1[,-1:-3]
> tdm.tfidf
              Aさん    Bさん    Cさん
サラダ     2.584963 0.000000 0.000000
ハンバーグ 1.584963 1.584963 0.000000
姉         0.000000 2.584963 0.000000
私         1.000000 1.000000 1.000000
出身       0.000000 0.000000 2.584963
食べる     1.584963 1.584963 0.000000
東京       0.000000 0.000000 2.584963
> #idf計算
> idf<-tdm.tfidf/tdm
> idf
              Aさん    Bさん    Cさん
サラダ     2.584963      NaN      NaN
ハンバーグ 1.584963 1.584963      NaN
姉              NaN 2.584963      NaN
私         1.000000 1.000000 1.000000
出身            NaN      NaN 2.584963
食べる     1.584963 1.584963      NaN
東京            NaN      NaN 2.584963
```
ということで、RMeCabのidfは以下の通りでした。
+ 3文書全てに出現　1
+ 2文書に出現　1.584963
+ 1文書に出現　2.584963

これからRMeCabのidfの式を推測すると以下の通りです。

```math
idf=1+log_2(全文書数/単語出現文書数)
```

##tmパッケージTermDocumentMatrix関数のidf
今回は英文で以下の3人の会話を考えます。
A: Mike eats a salad and a humburg.
B: Mike eats a humburg with my sister.
C: Mike is from Tokyo.

### 3つの文書のmatrixを作成

```R
d<-c("D","Mike eats a salad and a humburg .")
e<-c("E","Mike eats a humburg with my sister .")
f<-c("F","Mike is from Tokyo .")
texts.e<-rbind(a,b,c)
texts.e
```
###tmパッケージTermDocumentMatrix関数のidf計算 
重み付けなしの単語－文書行列とtf-idfの単語－文書行列よりidf計算

```R
> library(tm)
> vs<-VectorSource(texts.e)
> co<-Corpus(vs)
> #重み付けなし
> tdm.e<-co %>% TermDocumentMatrix(control=list(tolower=F,stemming=T,stopwords=T)) %>% as.matrix %>% as.data.frame
> colnames(tdm.e)<-c("A","B","C")
> tdm.e
        A B C
eat     1 1 0
humburg 1 1 0
Mike    1 1 1
salad   1 0 0
sister  0 1 0
Tokyo   0 0 1
> #tf-idf
> tdm.e.w<-co %>% TermDocumentMatrix(control=list(tolower=F,stemming=T,stopwords=T,weighting =function(x)weightTfIdf(x, normalize = FALSE))) %>% as.matrix %>% as.data.frame
> colnames(tdm.e.w)<-c("A","B","C")
> tdm.e.w
                A         B        C
eat     0.5849625 0.5849625 0.000000
humburg 0.5849625 0.5849625 0.000000
Mike    0.0000000 0.0000000 0.000000
salad   1.5849625 0.0000000 0.000000
sister  0.0000000 1.5849625 0.000000
Tokyo   0.0000000 0.0000000 1.584963
> 
> idf.e<-tdm.e.w/tdm.e
> idf.e
                A         B        C
eat     0.5849625 0.5849625      NaN
humburg 0.5849625 0.5849625      NaN
Mike    0.0000000 0.0000000 0.000000
salad   1.5849625       NaN      NaN
sister        NaN 1.5849625      NaN
Tokyo         NaN       NaN 1.584963
```

ということで、idfは以下でした。
+ 3文書全てに出現　0
+ 2文書に出現　0.584963
+ 1文書に出現　1.584963

これからtmパッケージのTermDocumentMatrixのidfの式を推測すると以下の通りです。

```math
idf=log_2(全文書数/単語出現文書数)
```

#結論
ということで、RMeCabとtmではtf-idfのidfの計算方法が異なっていました。
###RMeCabパッケージのdocDF関数のidf
```math
idf=1+log_2(全文書数/単語出現文書数)
```

###tmパッケージのTermDocumentMatrix関数のidf
```math
idf=log_2(全文書数/単語出現文書数)
```

#他にも
RMeCab, tmにはnormalizeも出来ますが、その話はまた後日。
PythonのScikitlearnのCountVectorizer、TfIdfVectorizeの話もまた後日出来ればと思いまっす。

##この検討はアジア特許情報研究会の活動の一環で行いました。
アジア特許情報研究会
https://sapi.kaisei1992.com/