はじめに: 『R環境で小説のテキストマイニング』の連載シリーズです。
テキストマイニングは、テキストデータを定量的に扱って、有益な情報を抽出するデータマイニング手法の1つです。
このようなテキストの情報解析では、自然言語処理、形態素解析、キーワード抽出、共起分析、ネットワーク可視化、機械学習、感情分析など、様々な分析手法が用いられます。
近年では各種のAPIやWebスクレイピングなどを利用して、ウェブやSNS、地図上のクチコミからテキストデータを取得して、テキストマイニングに活用されています。
この記事は、夏目漱石の「坊っちゃん」が対象小説で、
形態素解析と辞書設定を扱った内容となっています。
連載シリーズの目次
1. 青空文庫、対象小説の紹介
2. 「坊っちゃん」のテキストの前処理
3. 形態素解析と辞書設定
4. 形態素解析と複合語抽出 (ルールベース抽出、pytermextract)
5. テキストマイニングと形態素のワードクラウド
6. テキストマイニングとN-gramのネットワーク表現(章ごとの関係性とか)
7. テキストマイニングと単語の埋め込み生成(word2vecとか)
8. 文章の感情分析(感情ポジネガ分析とか、英語感情対応表とか、ML-askとか)
9. ミクロとマクロなテキスト解析〜応用篇として内容を考え中〜
【その2: 形態素解析と辞書設定】に関する内容をやっていきます。
実行環境
#ターミナル上のR環境
R version 4.1.2 (2021-11-01) -- "Bird Hippie"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: aarch64-apple-darwin20.6.0 (64-bit)
#RStudioターミナル上のR環境
R version 4.1.2 (2021-11-01) -- "Bird Hippie"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin17.0 (64-bit)
今回、M1 MacだとRStudioでRMeCabパッケージがうまく動作せず、
やや面倒ですが、形態素解析の部分はターミナルからRを起動して実行しています。
形態素解析と辞書設定
mecabを使った形態素解析
mecabパッケージのインストールについては、
過去記事の補足「M1 Macでのmecabのインストール方法 - Installation of RMeCab 1.07 on M1 Mac #13」を参照のこと。
skume.net
install.packages("RMeCab", repos = "https://rmecab.jp/R", type = "source")
library(RMeCab)
まずは、短文を使って試してみます。
「坊ちゃん」の第1章テキストをGitHubからダウンロードして、
先頭20文字のテキストに対して形態素解析にかけることにします。
file_path_1st <- "https://raw.githubusercontent.com/kumeS/Blog/master/R_text_analysis/R_01/Bochan_text.1st.txt"
Bochan_text.1st <- readLines(con = file(file_path_1st))
txt <- stringr::str_sub(Bochan_text.1st, start = 1, end = 20)
txt
unlist(RMeCab::RMeCabC(txt, mypref = 0))
unlist(RMeCab::RMeCabC(txt, mypref = 1))
myprefのオプションは出力を、
「0: テキストに現れる形態素と同じ形態素が返す」か、
「1: テキストに現れる形態素の基本形が返す」かを制御します。
myprefの設定(0 → 1)を変更すると、この短文での実行結果であれば、
「動詞 "し"」がその基本形である「動詞 "する"」に変わっています。
以後の形態素解析は、mypref = 1
の設定で進めることにします。
MeCabの辞書設定
言わずもがなですが、
形態素解析で最も重要なものは辞書です。
ここでは、IPA辞書、Neologd辞書、UniDic辞書、juman辞書のインストール方法・RMeCabでの設定方法を紹介します。
Neologd辞書は、GitHubから辞書をダウンロード・インストールしますが、IPA辞書、UniDic辞書、juman辞書は、brew install
でインストールします。
「ipadic」「IPA辞書」は、MeCabのデフォルト辞書として提供されています。
ただ、2007年以降、IPA辞書は更新されていないようです*1。
Neologd辞書は、MeCabのためにカスタマイズされたシステム辞書です*2。
Neologd辞書は、Web上の多くの言語資源から抽出された新語を多く含んでいるようです。
Web文書を解析する際には、このシステム辞書とデフォルトの辞書(ipadic)を併用するとよいと提案されています。
UniDic辞書は、国立国語研究所が提供する、国語研短単位自動解析用辞書です*3。
また、JUMAN辞書は、京都大学 黒橋・河原研究室で開発されている*4日本語形態素解析システム JUMAN に含まれる辞書です。
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n
brew install mecab-ipadic
brew install mecab-unidic
brew install mecab-jumandic
インストール後に、/opt/homebrew/lib/mecab/dic
に各辞書の設定ファイルが保存されます。
辞書による形態素解析結果の違い
辞書を変えると、MeCabでの形態素解析の結果がどう変わるかを見ていきます。
このセクションは、R環境では無く、ターミナルのMecabコマンドで実行しています。出力結果はRMeCabと同じです。
デフォルトのipadic辞書を使った場合
echo "親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事" | mecab
echo "親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事" | mecab -d /opt/homebrew/lib/mecab/dic/ipadic
親譲り 名詞,一般,*,*,*,*,親譲り,オヤユズリ,オヤユズリ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
無鉄砲 名詞,一般,*,*,*,*,無鉄砲,ムテッポウ,ムテッポー
で 助詞,格助詞,一般,*,*,*,で,デ,デ
小 接頭詞,名詞接続,*,*,*,*,小,ショウ,ショー
供 名詞,サ変接続,*,*,*,*,供,キョウ,キョー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
時 名詞,非自立,副詞可能,*,*,*,時,トキ,トキ
から 助詞,格助詞,一般,*,*,*,から,カラ,カラ
損 名詞,一般,*,*,*,*,損,ソン,ソン
ばかり 助詞,副助詞,*,*,*,*,ばかり,バカリ,バカリ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル
。 記号,句点,*,*,*,*,。,。,。
小学校 名詞,一般,*,*,*,*,小学校,ショウガッコウ,ショーガッコー
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
居る 動詞,自立,*,*,一段,基本形,居る,イル,イル
時分 名詞,一般,*,*,*,*,時分,ジブン,ジブン
学校 名詞,一般,*,*,*,*,学校,ガッコウ,ガッコー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
二 名詞,数,*,*,*,*,二,ニ,ニ
階 名詞,接尾,助数詞,*,*,*,階,カイ,カイ
から 助詞,格助詞,一般,*,*,*,から,カラ,カラ
飛び降り 動詞,自立,*,*,一段,連用形,飛び降りる,トビオリ,トビオリ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
一 名詞,数,*,*,*,*,一,イチ,イチ
週間 名詞,接尾,助数詞,*,*,*,週間,シュウカン,シューカン
ほど 助詞,副助詞,*,*,*,*,ほど,ホド,ホド
腰 名詞,一般,*,*,*,*,腰,コシ,コシ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
抜かし 動詞,自立,*,*,五段・サ行,連用形,抜かす,ヌカシ,ヌカシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
事 名詞,非自立,一般,*,*,*,事,コト,コト
EOS
neologd辞書を使った場合
echo "『親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事" | mecab -d /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd
『 記号,括弧開,*,*,*,*,『,『,『
親譲り 名詞,一般,*,*,*,*,親譲り,オヤユズリ,オヤユズリ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
無鉄砲 名詞,一般,*,*,*,*,無鉄砲,ムテッポウ,ムテッポー
で 助詞,格助詞,一般,*,*,*,で,デ,デ
小供 名詞,固有名詞,一般,*,*,*,小供,コドモ,コドモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
時 名詞,非自立,副詞可能,*,*,*,時,トキ,トキ
から 助詞,格助詞,一般,*,*,*,から,カラ,カラ
損 名詞,一般,*,*,*,*,損,ソン,ソン
ばかり 助詞,副助詞,*,*,*,*,ばかり,バカリ,バカリ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル
。 記号,句点,*,*,*,*,。,。,。
小学校 名詞,一般,*,*,*,*,小学校,ショウガッコウ,ショーガッコー
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
居る 動詞,自立,*,*,一段,基本形,居る,イル,イル
時分 名詞,一般,*,*,*,*,時分,ジブン,ジブン
学校 名詞,一般,*,*,*,*,学校,ガッコウ,ガッコー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
二階 名詞,固有名詞,地域,一般,*,*,二階,ニカイ,ニカイ
から 助詞,格助詞,一般,*,*,*,から,カラ,カラ
飛び降り 動詞,自立,*,*,一段,連用形,飛び降りる,トビオリ,トビオリ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
一週間 名詞,固有名詞,一般,*,*,*,一週間,イッシュウカン,イッシューカン
ほど 助詞,副助詞,*,*,*,*,ほど,ホド,ホド
腰 名詞,一般,*,*,*,*,腰,コシ,コシ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
抜かし 動詞,自立,*,*,五段・サ行,連用形,抜かす,ヌカシ,ヌカシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
事 名詞,非自立,一般,*,*,*,事,コト,コト
EOS
unidic辞書を使った場合
echo "『親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事" | mecab -d /opt/homebrew/lib/mecab/dic/unidic
『 『 補助記号-括弧開
親譲り オヤユズリ オヤユズリ 親譲り 名詞-普通名詞-一般
の ノ ノ の 助詞-格助詞
無鉄砲 ムテッポー ムテッポウ 無鉄砲 名詞-普通名詞-形状詞可能
で デ ダ だ 助動詞 助動詞-ダ 連用形-一般
小供 コドモ コドモ 子供 名詞-普通名詞-一般
の ノ ノ の 助詞-格助詞
時 トキ トキ 時 名詞-普通名詞-副詞可能
から カラ カラ から 助詞-格助詞
損 ソン ソン 損 名詞-普通名詞-一般
ばかり バカリ バカリ ばかり 助詞-副助詞
し シ スル 為る 動詞-非自立可能 サ行変格 連用形-一般
て テ テ て 助詞-接続助詞
いる イル イル 居る 動詞-非自立可能 上一段-ア行 終止形-一般
。 。 補助記号-句点
小 ショー ショウ 小 接頭辞
学校 ガッコー ガッコウ 学校 名詞-普通名詞-一般
に ニ ニ に 助詞-格助詞
居る イル イル 居る 動詞-非自立可能 上一段-ア行 連体形-一般
時分 ジブン ジブン 時分 名詞-普通名詞-副詞可能
学校 ガッコー ガッコウ 学校 名詞-普通名詞-一般
の ノ ノ の 助詞-格助詞
二 ニ ニ 二 名詞-数詞
階 カイ カイ 階 名詞-普通名詞-助数詞可能
から カラ カラ から 助詞-格助詞
飛び降り トビオリ トビオリル 飛び下りる 動詞-一般 上一段-ラ行 連用形-一般
て テ テ て 助詞-接続助詞
一 イチ イチ 一 名詞-数詞
週間 シューカン シュウカン 週間 名詞-普通名詞-助数詞可能
ほど ホド ホド ほど 助詞-副助詞
腰 コシ コシ 腰 名詞-普通名詞-一般
を オ ヲ を 助詞-格助詞
抜かし ヌカシ ヌカス 抜かす 動詞-一般 五段-サ行 連用形-一般
た タ タ た 助動詞 助動詞-タ 連体形-一般
事 コト コト 事 名詞-普通名詞-一般
jumandic辞書を使った場合
echo "『親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事" | mecab -d /opt/homebrew/lib/mecab/dic/jumandic
『 特殊,括弧始,*,*,『,『,*
親譲り 名詞,普通名詞,*,*,親譲り,おやゆずり,代表表記:親譲り/おやゆずり カテゴリ:抽象物
の 助詞,格助詞,*,*,の,の,*
無鉄砲で 形容詞,*,ナ形容詞,ダ列タ系連用テ形,無鉄砲だ,むてっぽうで,代表表記:無鉄砲だ/むてっぽうだ
小 接頭辞,名詞接頭辞,*,*,小,しょう,代表表記:小/しょう 反義:接頭辞-名詞接頭辞:大/だい;接頭辞-名詞接頭辞:大/おお 内容語 換言:+N:Nが小さい
供 名詞,普通名詞,*,*,供,とも,代表表記:供/とも 漢字読み:訓 カテゴリ:人;抽象物
の 助詞,接続助詞,*,*,の,の,*
時 名詞,副詞的名詞,*,*,時,とき,代表表記:時/とき
から 助詞,格助詞,*,*,から,から,*
損 形容詞,*,ナ形容詞,語幹,損だ,そん,代表表記:損だ/そんだ 動詞派生:損する/そんする
ばかり 助詞,副助詞,*,*,ばかり,ばかり,*
して 動詞,*,サ変動詞,タ系連用テ形,する,して,連語
いる 接尾辞,動詞性接尾辞,母音動詞,基本形,いる,いる,代表表記:いる/いる
。 特殊,句点,*,*,。,。,*
小学校 名詞,普通名詞,*,*,小学校,しょうがっこう,代表表記:小学校/しょうがっこう 組織名末尾 カテゴリ:場所-施設 ドメイン:教育・学習
に 助詞,格助詞,*,*,に,に,*
居る 動詞,*,母音動詞,基本形,居る,いる,代表表記:居る/いる
時分 名詞,時相名詞,*,*,時分,じぶん,代表表記:時分/じぶん カテゴリ:時間
学校 名詞,普通名詞,*,*,学校,がっこう,代表表記:学校/がっこう カテゴリ:場所-施設 ドメイン:教育・学習
の 助詞,接続助詞,*,*,の,の,*
二 名詞,数詞,*,*,二,に,カテゴリ:数量
階 接尾辞,名詞性名詞助数辞,*,*,階,かい,代表表記:階/かい 準内容語
から 助詞,格助詞,*,*,から,から,*
飛び降りて 動詞,*,母音動詞,タ系連用テ形,飛び降りる,とびおりて,代表表記:飛び降りる/とびおりる
一 名詞,数詞,*,*,一,いち,カテゴリ:数量
週間 接尾辞,名詞性名詞助数辞,*,*,週間,しゅうかん,代表表記:週間/しゅうかん 準内容語 カテゴリ:時間
ほど 接尾辞,名詞性名詞接尾辞,*,*,ほど,ほど,代表表記:程/ほど
腰 名詞,普通名詞,*,*,腰,こし,代表表記:腰/こし 漢字読み:訓 カテゴリ:動物-部位;抽象物
を 助詞,格助詞,*,*,を,を,*
抜かした 動詞,*,子音動詞サ行,タ形,抜かす,ぬかした,代表表記:抜かす/ぬかす 自他動詞:自:抜ける/ぬける
事 名詞,普通名詞,*,*,事,こと,代表表記:事/こと 漢字読み:訓 カテゴリ:抽象物
EOS
Neologd辞書は、新語・固有表現に強く、カバーできる語彙数が多いと評価されています。
neologd辞書を使った形態素解析の結果を確認すると、
「小供」、「学校」、「二階」、「一週間」がちゃんと複合語として抽出されていますね。
この結果を受けて、形態素解析は主に、「RMeCab」+「neologd辞書」を使うことにします。
RMeCabで辞書設定を変更する方法
このセクションは、結構、重要です。設定方法を知らないとハマる可能性があります。
RMeCabで辞書設定を変更するには、適時、mecabrcを修正します。
sudo vim
で、そのテキストファイルを書き換えます。Macだと、/usr/local/etc
ディレクト内にあります。
sudo vim /usr/local/etc/mecabrc
そして、7行目に、以下のようにdicdirのディレクトリパスを追記します。
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
;dicdir = /opt/homebrew/lib/mecab/dic/ipadic
dicdir = /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd
; userdic = /home/foo/bar/user.dic
; output-format-type = wakati
; input-buffer-size = 8192
; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n
この例では、RMeCabでneologd辞書を使用するために、
dicdir = /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd
の行を追記しています。
先頭の「;」のコメントアウトは外しておきます。
RMeCab形態素解析 + neologd辞書を用いた「坊ちゃん」の第1章テキストの形態素解析
辞書設定の注意点ですが、RMeCabCのオプションで、
dic="/opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd"
のパスを指定すると、Abortします。今のところ、理由は不明です。
そこで、上記でmecabrc
を設定変更した上で、
RMeCabCのオプションで、
mecabrc="/usr/local/etc/mecabrc"
を指定します。mecabrcオプションだと、RMeCabCがうまく実行できます。
unlist(RMeCab::RMeCabC("『親譲りの無鉄砲で小供の時から損ばかりしている。", mypref = 1,
mecabrc="/usr/local/etc/mecabrc"))
次に、RMeCab形態素解析 + neologd辞書を使って、
「坊ちゃん」の第1章テキスト全体に対して形態素解析を実行します。
解析後に、品詞と形態素の頻度集計も行いました。
file_path_1st <- "https://raw.githubusercontent.com/kumeS/Blog/master/R_text_analysis/R_01/Bochan_text.1st.txt"
Bochan_text.1st <- readLines(con = file(file_path_1st))
result0 <- unlist(RMeCab::RMeCabC(Bochan_text.1st, mypref = 1,
mecabrc="/usr/local/etc/mecabrc"))
result1 <- data.frame(parts = names(result0),
mor = result0,
row.names = 1:length(result0))
head(result1)
次に、table()
関数を用いて、品詞と形態素の頻度を集計しました。
a <- table(result1$parts)
data.frame(parts=names(a), Freq=as.numeric(a))[order(Freq=as.numeric(a), decreasing = T),]
b <- table(result1$mor[result1$parts %in% c("名詞", "動詞")])
head(data.frame(parts=names(b), Freq=as.numeric(b))[order(Freq=as.numeric(b), decreasing = T),], n=10)
b1 <- table(result1$mor[result1$parts %in% c("名詞")])
head(data.frame(parts=names(b1), Freq=as.numeric(b1))[order(Freq=as.numeric(b1), decreasing = T),], n=10)
RMeCab形態素解析 + neologd辞書を用いた「坊ちゃん」の第2章以降のテキストの形態素解析
続いて、RMeCab形態素解析 + neologd辞書を使って、
「坊ちゃん」の各章のテキスト(2章から11章まで)に対して
形態素解析を実行します。
file_path_all <- "https://raw.githubusercontent.com/kumeS/Blog/master/R_text_analysis/R_01/Bochan_text.all.txt"
txt <- file(file_path_all)
Bochan_text.all <- readLines(con = txt)
close(txt)
for(n in 2:length(Bochan_text.all)){
result00 <- unlist(RMeCab::RMeCabC(Bochan_text.all[n], mypref = 1,
mecabrc="/usr/local/etc/mecabrc"))
result01 <- data.frame(parts = names(result00),
mor = result00,
row.names = 1:length(result00))
saveRDS(result01, file = paste0("result", n, ".Rds"))
write.table(result01, file = paste0("result", n, ".txt"),
append = F, row.names = F, sep="\t")
}
github.com
まとめ
MeCabでの形態素解析と辞書設定を紹介しました。
neologd辞書を使う方が、デフォルトの辞書よりは良い感じでした。
この経験を踏まえて、テキストマイニングの手法を使っていきたいと考えています。
テキスト処理の関連記事
skume.net
skume.net
skume.net
skume.net
skume.net
skume.net
参考資料
github.com
qiita.com
zenn.dev
www.ic.daito.ac.jp