MeCabのトークンをQuantedaに読み込む二つの方法

量的テキスト分析では、文を語に分割するトークン化という処理が不可欠です。日本語は英語のように語が空白で区別されていないけれど、ICUに含まれる単語辞書を使うと日本語の文を簡単にトークン化できます。さらに、MeCabなどの形態素解ツールを使うと、文のトークン化だけではなく、品詞の特定までできます。

僕自身は品詞を区別するような分析をしないので、これまでちゃんと説明したことはなかったけど、QuantedaでMecabの出力を簡単に取り込むことができます。ここの例では、CRANでも公開されているRcppMeCab使って、語と品詞名がスラッシュで区切られたトークン(方法1)、または、語のみのトークン(方法2)を読み込みます。

> #Sys.setenv(MECAB_LANG = 'ja')
> #devtools::install_github("junhewk/RcppMeCab")
> 
> require(RcppMeCab)
> require(quanteda)
> 
> txt <- c(doc1 = "政治は社会に対して全体的な影響を及ぼす複雑な領域である。",
+          doc2 = "政治は社会で生きるひとりひとりの人の人生にも様々な影響を及ぼす。")

方法1

この方法では、RcppMeCabのpos()が出力するlistをas.tokens()でtokensオブジェクトに変換し、文書名をコピーします。これさえできてしまえば、tokens_select()で語や品詞を選び、通常の操作でdfmオブジェクトを作成できます。

> lis <- pos(txt)
> toks <- as.tokens(lis)
> names(toks) <- names(txt) # 文書名をコピー
> print(toks)
Tokens consisting of 2 documents.
doc1 :
 [1] "政治/名詞"     "は/助詞"       "社会/名詞"     "に対して/助詞" "全体/名詞"    
 [6] "的/名詞"       "な/助動詞"     "影響/名詞"     "を/助詞"       "及ぼす/動詞"  
[11] "複雑/名詞"     "な/助動詞"    
[ ... and 4 more ]

doc2 :
 [1] "政治/名詞"         "は/助詞"           "社会/名詞"         "で/助詞"          
 [5] "生きる/動詞"       "ひとりひとり/名詞" "の/助詞"           "人/名詞"          
 [9] "の/助詞"           "人生/名詞"         "に/助詞"           "も/助詞"          
[ ... and 6 more ]

> 
> toks_noun <- tokens_select(toks, "*/名詞")
> print(toks_noun)
Tokens consisting of 2 documents.
doc1 :
[1] "政治/名詞" "社会/名詞" "全体/名詞" "的/名詞"   "影響/名詞" "複雑/名詞" "領域/名詞"

doc2 :
[1] "政治/名詞"         "社会/名詞"         "ひとりひとり/名詞" "人/名詞"          
[5] "人生/名詞"         "様々/名詞"         "影響/名詞"        

> 
> dfmt_noun <- dfm(toks_noun)
> featnames(dfmt_noun)
 [1] "政治/名詞"         "社会/名詞"         "全体/名詞"         "的/名詞"          
 [5] "影響/名詞"         "複雑/名詞"         "領域/名詞"         "ひとりひとり/名詞"
 [9] "人/名詞"           "人生/名詞"         "様々/名詞"        

方法2

この方法では、RcppMeCabのpos()が出力するdata.frameの中で品詞を選択した後に、オブジェクトのクラス名を改ざんして、as.tokens()を適用します。クラス名を改ざんするのは、この関数がSpacyrの出力にしか正式対応していないものの、RcppMeCabの出力の形式が、それとまったく同じだからです。

> dat <- pos(txt, format = "data.frame")
> dat_noun <- subset(dat, pos == "名詞")
> class(dat_noun) <- "spacyr_parsed" # クラス名を改ざん
> toks <- as.tokens(dat_noun)
> names(toks) <- names(txt) # 文書名をコピー
> head(toks)
Tokens consisting of 2 documents.
doc1 :
[1] "政治" "社会" "全体" "的"   "影響" "複雑" "領域"

doc2 :
[1] "政治"         "社会"         "ひとりひとり" "人"           "人生"        
[6] "様々"         "影響"        

でも、as.tokens()が行っているのは、data.frameをリストに変換するだけのことなので、split()を使っても同じことができます。この方法であれば、RMeCabなどの他の形式にも適用できるはずです。

> toks <- as.tokens(split(dat_noun$token, dat_noun$doc_id))
> names(toks) <- names(txt) # 文書名をコピー
> print(toks)
Tokens consisting of 2 documents.
doc1 :
[1] "政治" "社会" "全体" "的"   "影響" "複雑" "領域"

doc2 :
[1] "政治"         "社会"         "ひとりひとり" "人"           "人生"        
[6] "様々"         "影響"  

もし、量的テキスト分析でMeCabを使う人が多いのであれば、利便性を高めるためにQuantedaに変更を加えることもできるので、下のコメント欄にその旨を書いてください。

Posts created 113

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top