GloVe Word Embeddingsを試してみる(2)日本語に挑戦

パソコンで楽しむ自分で動かす人工知能

パソコンで楽しむ自分で動かす人工知能

上記に書かれていることをMeCabとRとtext2vecパッケージを使って実行。


<環境>

> sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 16299)

Matrix products: default

locale:
[1] LC_COLLATE=Japanese_Japan.932  LC_CTYPE=Japanese_Japan.932   
[3] LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C                  
[5] LC_TIME=Japanese_Japan.932    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] RevoUtils_10.0.6     RevoUtilsMath_10.0.1

loaded via a namespace (and not attached):
[1] compiler_3.4.2 tools_3.4.
> packageVersion("text2vec")
[1] ‘0.5.0’

【0】使用するライブラリの読み込み

library(text2vec)

【1】データの取得と前処置

download.file("http://www.aozora.gr.jp/cards/000148/files/752_ruby_2438.zip", "752.zip")
file_name <- unzip("752.zip")
text <- readLines(file_name, warn = FALSE)
> text[527:538]
 [1] "底本:「ちくま日本文学全集 夏目漱石」筑摩書房"                                                                                                                                            
 [2] "   1992(平成4)年1月20日第1刷発行"                                                                                                                                                     
 [3] "底本の親本:「夏目漱石全集2」ちくま文庫、筑摩書房"                                                                                                                                         
 [4] "   1987(昭和62)年10月27日第1刷発行"                                                                                                                                                   
 [5] "※底本の注にれば、本作品の原稿には、「そのうち学校もいやになった。」の後に、漱石自身による2字あけの指定があるという。このファイルでは、その情報にもとづいて、当該の箇所を2字あけとした。"
 [6] "※底本は、物を数える際や地名などに用いる「ヶ」(区点番号5-86)を、大振りにつくっています。"                                                                                                
 [7] "入力:真先芳秋"                                                                                                                                                                            
 [8] "校正:柳沢成雄"                                                                                                                                                                            
 [9] "1999年9月13日公開"                                                                                                                                                                         
[10] "2011年5月20日修正"                                                                                                                                                                         
[11] "青空文庫作成ファイル:"                                                                                                                                                                    
[12] "このファイルは、インターネットの図書館、青空文庫(http://www.aozora.gr.jp/)で作られました。入力、校正、制作にあたったのは、ボランティアの皆さんです。" 
#末尾の削除
text <- text[-c(527:538)]
> text[1:15]
 [1] "坊っちゃん"                                             
 [2] "夏目漱石"                                               
 [3] ""                                                       
 [4] "-------------------------------------------------------"
 [5] "【テキスト中に現れる記号について】"                     
 [6] ""                                                       
 [7] "《》:ルビ"                                             
 [8] "(例)坊《ぼ》っちゃん"                                 
 [9] ""                                                       
[10] "|:ルビの付く文字列の始まりを特定する記号"             
[11] "(例)夕方|折戸《おりど》の"                           
[12] ""                                                       
[13] "[#]:入力者注 主に外字の説明や、傍点の位置の指定"   
[14] "(例)おくれんかな[#「おくれんかな」に傍点]"         
[15] "-------------------------------------------------------"
#冒頭の削除
text <- text[-c(1:15)]
> subset(text, grepl("^[#", text))
 [1] "[#]:入力者注 主に外字の説明や、傍点の位置の指定"
 [2] "[#5字下げ]一[#「一」は中見出し]"              
 [3] "[#5字下げ]二[#「二」は中見出し]"              
 [4] "[#5字下げ]三[#「三」は中見出し]"              
 [5] "[#5字下げ]四[#「四」は中見出し]"              
 [6] "[#5字下げ]五[#「五」は中見出し]"              
 [7] "[#5字下げ]六[#「六」は中見出し]"              
 [8] "[#5字下げ]七[#「七」は中見出し]"              
 [9] "[#5字下げ]八[#「八」は中見出し]"              
[10] "[#5字下げ]九[#「九」は中見出し]"              
[11] "[#5字下げ]十[#「十」は中見出し]"              
[12] "[#5字下げ]十一[#「十一」は中見出し]"          
[13] "[#地から1字上げ](明治三十九年四月)"
#不要な行の削
text <- subset(text, !grepl("^[#", text))
#ルビの削除
text <- gsub("《[^》]*》", "", text)

【2】単語を抽出する

コマンドプロンプトで以下を実行

mecab -Owakati -b 200000 text.txt > out.txt

bコマンドで適当に大きめの数字を割り当てないと以下のエラーがでる

input-buffer overflow. The line is split. use -b #SIZE option.

いよいよ単語の抽出

text <- readLines("out.txt", warn = FALSE)
it <- itoken(text)
voc <- create_vocabulary(it)
voc <- prune_vocabulary(voc, term_count_min = 5)

【3】TCM(term-co-occurence matrix)を作成する

tcm <- create_tcm(it, vocab_vectorizer(voc), skip_grams_window = 5)

【4】ワードベクトルを作成する

glove <- GlobalVectors$new(word_vectors_size = 50, vocabulary = voc, x_max = 10)
main <- glove$fit_transform(tcm, n_iter = 20)
context <- glove$components
word_vectors <- main + t(context)
#文字コードの変換
rownames(word_vectors) <- iconv(rownames(word_vectors), "cp932")