京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

データサイエンスを活用したビジネス戦略・データコンサルの厳選書籍

はじめに

データサイエンスを活用したビジネス戦略・データコンサルを考えるときに、 データを活用したロジカルシンキング・問題解決を 考える上で参考になる書籍を厳選してみました。

データサイエンスを活用したビジネス戦略本、データコンサル本を探している人はぜひ参考にしてみてください。

データサイエンス・データコンサルのおすすめ書籍

イシューからはじめよ ― 知的生産の「シンプルな本質」


イシューからはじめよ ― 知的生産の「シンプルな本質」は、 安宅和人 氏の代表作の1つであり、ロジカルシンキング・問題解決を考える上での決定版である。 発売10年があったいまでも色褪せることがなく、支持され続ける名著であり、これからのAI×データ時代の必携書である。

人生には限りがある、知識生産性は最大化して、時間あたりの効果性を引き上げていく必要があります。

イシュ―度の高い問題のみに着手すべきであって、 実現性、解決できる問題から着手すべきではない。

経営戦略、マーケティングをめざす方には是非読んでもらいたい本です。

シン・ニホン AI×データ時代における日本の再生と人材育成


シン・ニホン AI×データ時代における日本の再生と人材育成は、 ビジネス書大賞2020 特別賞(ソーシャルデザイン部門)など、数々の賞を受賞している、安宅氏の著書である。

これからの時代の生き方の教養書今後の日本が進むべき道を豊富なデータと精緻なロジックに概説新人教育やマネジメント教育・ビジネスパーソンの必読本『未来をつくる人』をどう育てるかについて、 著者の豊富な経験や知識が崇高に盛り込まれた会心の一冊である。

日本はオワコンなのだが勝てる、現状の悲観論を払拭してくれる切れ味鋭い一冊です。

マーケティングリサーチとデータ分析の基本


マーケティングリサーチとデータ分析の基本は、 「身近なデータを、シンプルに活用する技術」に焦点をあて、 文系出身のどちらかと言えば数字が苦手な方や、リサーチやデータ分析が苦手なビジネスパーソン向けに、 「とりあえずこれだけ押えておけば大丈夫」というリサーチ・データ分析のポイントをシンプルに提供している一冊となっています。

マーケティングリサーチの入門書として、 リサーチの始め方や、データ分析の基本的な考え方、 そしてニューロリサーチなどといった振り返り方法なども含めて、 リサーチの基本やビジネスでの活用シーンを広く学ぶことができます。

コンサル一年目が学ぶこと

本書は、ベテラン社員が新人時代を思い出し、 一過性のものではなく、15年、20年と、普遍的に役立つスキルを身につけてもらいたいと、執筆した1冊です。

何を学ぶのか。その点について、シンプルにかつ簡潔に、わかりやすく、要点を示しています。

ダラダラ結論を出さない会議、ホワイトカラーの生産性が低さ、外資IT企業でも通用する必要なスキルなど、新人や若手の社会人なら読んでいて損はしない内容です。

まとめ

2022年7月版の「データサイエンスを活用したビジネス企画・データコンサルの書籍」について解説しました。

データサイエンスのビジネス活用はこれからも益々注目されていくところで、引き続きウォッチしていきたいですね。 今後、どのような展開を見せてくるのか楽しみです。

R環境で小説のテキストマイニングをやってみたら、○○○な結末になった件【その3: 形態素解析と複合語抽出 (名詞、接頭辞、接尾辞の品詞ルールベース抽出、pytermextract)】

はじめに: 『R環境で小説のテキストマイニング』の連載シリーズです。

テキストマイニングは、テキストデータを定量的に扱って、有益な情報を抽出するデータマイニング手法の1つです。 このようなテキストの情報解析では、自然言語処理、形態素解析、キーワード抽出、共起分析、ネットワーク可視化、機械学習、感情分析など、様々な分析手法が用いられます。 近年では各種のAPIやWebスクレイピングなどを利用して、ウェブやSNS、地図上のクチコミからテキストデータを取得して、テキストマイニングに活用されています。

この記事は、夏目漱石の「坊っちゃん」が対象小説で、 形態素解析と品詞のルールベースの複合語抽出、pytermextractによる複合語抽出を扱った内容となっています。

連載シリーズの目次

1. 青空文庫、対象小説の紹介
2. 「坊っちゃん」のテキストの前処理
3. 形態素解析と辞書設定
4. 形態素解析と複合語抽出 (ルールベース抽出、pytermextract)
5. テキストマイニングと形態素のワードクラウド
6. テキストマイニングとN-gramのネットワーク表現(章ごとの関係性とか)
7. テキストマイニングと単語の埋め込み生成(word2vecとか)
8. 文章の感情分析(感情ポジネガ分析とか、英語感情対応表とか、ML-askとか)
9. ミクロとマクロなテキスト解析〜応用篇として内容を考え中〜


「4. 形態素解析と複合語抽出 (ルールベース抽出、pytermextract)」に関する内容をやっていきます。

実行環境

#ターミナル上の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を実行して得た結果(result1.Rds)を使っています。

名詞、接頭辞、接尾辞をくっつける、品詞のルールベースの複合語抽出

RMeCabで形態素解析をすると、 形態素とともに、それに対応する品詞情報が出力されます。 この品詞情報をもとに、ルールベースで品詞、つまりは対応する形態素をくっつけて、 複合語を抽出します。

この複合語抽出プログラムでは、ある特定の品詞が出現した時に、 その品詞をルールベースでくっつけていくというものです。

例えば、RMeCabの出力で見られる品詞の場合では、 名詞、接頭詞、あるいは接尾詞が連続する箇所を見つけて、 それらの形態素を結合させて、複合語を生成します。 その後、複合語かどうか判定して*1、 複合語として抽出するものです。

今回、品詞ルールベースの複合語抽出関数をR言語で実装して、 Compound_calcという自作関数を用意しました。 RコードをGitHubからソースして、形態素解析の結果を入力して実行します。

##形態素解析の結果(result1.Rds)をR環境にロードする
Rds_path_all <- "https://github.com/kumeS/Blog/raw/master/R_text_analysis/R_02/result1.Rds"
download.file(url=Rds_path_all, destfile = basename(Rds_path_all))
result1 <- readRDS(file = "result1.Rds")

#ヘッド表示
head(result1)
#  parts    mor
#1  名詞 親譲り
#2  助詞     の
#3  名詞 無鉄砲
#4  助詞     で
#5  名詞   小供
#6  助詞     の

#複合語抽出: Compound_calc()関数を使います
source("https://raw.githubusercontent.com/kumeS/Blog/master/R_text_analysis/R_03/Compound_calc.R")
#実行
result2 <- Compound_calc(result = result1)

#結果カウント: 137個の複合語が抽出できました
sum(result2$parts == "複合語")
#[1] 137

#結果表示
head(result2[result2$parts == "複合語",], n=20)
#     parts        mor
#18  複合語   時分学校
#89  複合語       ーい
#115 複合語       二階
#150 複合語     西洋製
#238 複合語   幸ナイフ
#274 複合語     二十歩
#280 複合語   南上がり
#296 複合語       一本
#342 複合語     庭続き
#350 複合語     十三四
#368 複合語   四つ目垣
#381 複合語   夕方折戸
#397 複合語   時勘太郎
#549 複合語   四つ目垣
#579 複合語       片袖
#594 複合語       晩母
#606 複合語       片袖
#614 複合語 外いたずら
#622 複合語       兼公
#633 複合語     人参畠

結果として、Compound_calc()関数で、137個の複合語が抽出できました。

多いと思うのか少ないと思うのかは、貴方次第です。。。

pytermextractを使った複合語抽出

ターミナル環境上での、pytermextractを使った複合語抽出

Pythonライブラリである、termextractは、テキストデータから専門用語を取り出すツールです。 termextractの特徴は、複合語からなる専門用語を抽出できることで、用語は重要度でランキングされます。重要度の低い用語も抽出されますが、それらはノイズとなる可能性が高くなります。

まずは、ターミナルを起動して、pytermextractとかjanomeとかをセットアップします。

#pytermextractのダウンロード・解凍
mkdir pytermextract
cd pytermextract
wget http://gensen.dl.itc.u-tokyo.ac.jp/soft/pytermextract-0_02.zip
unzip pytermextract-0_02.zip

#pytermextractのセットアップ
pip3 install . 
#...
#Successfully installed termextract-0.12b0

#janomeのインストール
pip3 install janome
#...
#Successfully installed janome-0.4.2

次に、テスト実行(1)として、 janome(日本語形態素解析器)の和文解析結果をもとに、 複合語・専門用語の抽出を試みてみます。 入力ファイルとしては、termextractのtest_data内のテキストファイルを使っています。

#テスト実行(1)
#janome(日本語形態素解析器)の和文解析結果をもとに、専門用語を抽出する
python3 ./pytermex/termex_janome.py ./test_data/jpn_sample.txt

#結果表示
head janome_extracted.txt
#人工知能        477.401125619928
#AI      117.77945491468365
#知能    108.83014288330233
#人間    32.526911934581186
#研究    23.237900077244504
#システム        22.360679774997898
#計算知能        19.934680700343144
#エキスパートシステム    16.548754598234364
#人工知能学会    13.456666729201407
#手法    12.727922061357857

次の実行例は、MeCabの和文解析結果をもとに、専門用語を抽出する例となります。

#Python版MeCabのインストール
pip3 install mecab
#...
#Successfully installed mecab-0.996.3

#入力ファイル
head ./test_data/mecab_out_sample.txt
#人工    名詞,一般,*,*,*,*,人工,ジンコウ,ジンコー
#知能    名詞,一般,*,*,*,*,知能,チノウ,チノー
#EOS

#テスト実行(2)
#MeCabの和文解析結果をもとに、専門用語を抽出する
python3 ./pytermex/termex_mecab.py ./test_data/mecab_out_sample.txt

#結果表示
head mecab_extracted.txt
#janomeの結果とほぼ同じなので省略

R環境上での、pytermextractを使った複合語抽出

R環境からpytermextractパッケージを使う場合には色々な方法がありますが、 手っ取り早いと思われる、 system()関数を介して上記のpythonコマンドを実行する方法を紹介します。

実際に、コマンド実行する際の注意点としては、 Pythonのパスはフルパスを指定することです。 例えば、homebrewのフルパスなら、 /opt/homebrew/bin/python3とかで記述してください。 相対パスにすると、何故かコケます。

R環境での、pytermextractの実行例と結果の読み込みについては、以下に示します。 pyファイルと入力テキストを作業ディレクトリに置いて、system()関数からpythonを実行します。

#termex_janome.pyのダウンロード
file_path1 <- "https://raw.githubusercontent.com/kumeS/Blog/master/R_text_analysis/R_03/termex_janome.py"
download.file(url=file_path1, destfile=basename(file_path1))

#「坊ちゃん」の全テキストのダウンロード
file_path2 <- "https://raw.githubusercontent.com/kumeS/Blog/master/R_text_analysis/R_01/Bochan_text.all.txt"
download.file(url=file_path2, destfile=basename(file_path2))
 
#system関数で、Python3実行: janome_extracted.txtに結果が出力されます
system(paste0("/opt/homebrew/bin/python3 ", 
              basename(file_path1), " ", basename(file_path2)))

#結果の読み込み
Comp <- read.table("janome_extracted.txt", sep="\t", header=F)

#結果表示
head(Comp, n=20)

#         V1         V2
#1  赤シャツ 4388.31843
#2        清  444.48622
#3        人  364.00000
#4      学校  273.66403
#5      生徒  249.41532
#6      校長  235.72442
#7        野  219.59736
#8      山嵐  217.78889
#9      先生  203.64675
#10     教師  152.73506
#11     下宿  143.30038
#12       気  129.69194
#13       顔  108.89444
#14       目  104.57055
#15     自分   93.53074
#16       手   93.33810
#17     東京   93.33810
#18 江戸っ子   91.65151
#19     田舎   87.63561
#20     通り   84.24963

pytermextractは、専門用語の文章だと、 複合語・専門用語の抽出が上手くいってそうだったけども、 小説の文章だと、「う〜〜ん、この一語って複合語なのか?」 という出力結果が多い印象ですね。

推測ですが、小説の語彙構成だと、 決まった複合語の頻度が明らかに専門文書よりも少ないと考えられる。 pytermextractだと、うまく複合語が抽出されないのかもですね。

小説の場合だと、 品詞のルールベースで複合語を抽出するのも捨てたもんじゃないですね。 また、RMeCabのデフォルト辞書では無く、neologd辞書の結果を利用しているのも影響大かもしれないけども。

まとめ

今回のトピックは、複合語抽出(いわゆる、専門用語の抽出)でした。

日本語の複合語の判定と抽出は、面白くもあり、難題なテーマですね。

まぁ、形態素解析用の辞書が時代や分野に合わせて、常に充実していたら*2、特段複合語抽出も問題にはならないのですが。それは、理想郷ですよね。

補足

テキスト処理の関連記事

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

R Script - Compound_calc()

Compound_calc()は、RMeCabでの形態素解析結果のデータフレームを入力として、 品詞ルールベースで複合語を抽出するプログラムです。

Compound_calc <- function(result){
  
if(!any(colnames(result1) == c("parts", "mor"))){
 stop("not proper column name") 
}

result$id1 <- 1:nrow(result)
result$id2 <- NA
result$parts1 <- NA
result$mor1 <- NA

x <- 1
for(n in 1:nrow(result)){
  #n <- 3
  a <- result[n,1] %in% c("名詞", "接頭詞", "接尾詞")
  if(a){
  if(n > 1){
    if(result[n-1,1] %in% c("名詞", "接頭詞", "接尾詞")){
      result[n,4] <- x
    }else{
      x <- x + 1
      result[n,4] <- x
    }
  }else{
    result[n,4] <- x
  }
  }else{
    x <- x + 1
    result[n,4] <- x
  }
}

#head(result)
if(n == nrow(result)){
    for(m in 1:max(result$id2)){
    #m <- 18
      b <- result$mor[result$id2 == m]
      b1 <- paste0(b, collapse = "")
      d <- result$id1[result$id2 == m][1]
      
      if(length(b) == 1){
        result$parts1[d] <- result$parts[d]
        result$mor1[d] <- b1
      }else{
        result$parts1[d] <- "複合語"
        result$mor1[d] <- b1
      }
    }
}

result2 <- na.omit(result[,c("parts1", "mor1")])
colnames(result2) <- c("parts", "mor")
return(data.frame(result2, row.names = 1:nrow(result2)))
}

*1:実際は判定はしないかもですが、、

*2:著者願望

R環境で小説のテキストマイニングをやってみたら、○○○な結末になった件【その2: 形態素解析と辞書設定】

はじめに: 『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

#mecabのインストール for M1 Mac
install.packages("RMeCab", repos = "https://rmecab.jp/R", type = "source")
library(RMeCab)

まずは、短文を使って試してみます。 「坊ちゃん」の第1章テキストをGitHubからダウンロードして、 先頭20文字のテキストに対して形態素解析にかけることにします。

#ダウンロード & readLines
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))

#第1章: 先頭20文字のテキストの表示
txt <- stringr::str_sub(Bochan_text.1st, start = 1, end = 20) 
txt
#[1] "親譲りの無鉄砲で小供の時から損ばかりして"


#RMeCab形態素解析: mypref = 0 (テキストに現れる形態素と同じ形態素を返す)
unlist(RMeCab::RMeCabC(txt, mypref = 0))
#    名詞     助詞     名詞     助詞   接頭詞     名詞     助詞     名詞 
#"親譲り"     "の" "無鉄砲"     "で"     "小"     "供"     "の"     "時" 
#    助詞     名詞     助詞     動詞     助詞 
#  "から"     "損" "ばかり"     "し"     "て" 

#RMeCab形態素解析: mypref = 1 (テキストに現れる形態素の基本形を返す)
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 に含まれる辞書です。

#Neologd辞書のインストール
#GitHubからソース・ダウンロード
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

#コンパイル
./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n
#...
#[install-mecab-ipadic-NEologd] : Finish..
#[install-mecab-ipadic-NEologd] : Finish..
#なぜか、/opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd にインストールされます

#mecab-ipadic(IPA辞書): デフォルト
brew install mecab-ipadic
#/opt/homebrew/lib/mecab/dic/ipadicにインストールされます

#mecab-unidic(UniDic辞書)
brew install mecab-unidic
#/opt/homebrew/lib/mecab/dic/unidicにインストールされます

#mecab-jumandic (juman辞書)
brew install mecab-jumandic
#/opt/homebrew/lib/mecab/dic/jumandicにインストールされます

インストール後に、/opt/homebrew/lib/mecab/dicに各辞書の設定ファイルが保存されます。

辞書による形態素解析結果の違い

辞書を変えると、MeCabでの形態素解析の結果がどう変わるかを見ていきます。

このセクションは、R環境では無く、ターミナルのMecabコマンドで実行しています。出力結果はRMeCabと同じです。

デフォルトのipadic辞書を使った場合

echo "親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事" | mecab
#or
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がうまく実行できます。

#RMeCab形態素解析 + neologd辞書
unlist(RMeCab::RMeCabC("『親譲りの無鉄砲で小供の時から損ばかりしている。", mypref = 1,
                       mecabrc="/usr/local/etc/mecabrc"))
#    記号     名詞     助詞     名詞     助詞     名詞     助詞     名詞 
#    "『" "親譲り"     "の" "無鉄砲"     "で"   "小供"     "の"     "時" 
#    助詞     名詞     助詞     動詞     助詞     動詞     記号 
#  "から"     "損" "ばかり"   "する"     "て"   "いる"     "。" 

次に、RMeCab形態素解析 + neologd辞書を使って、 「坊ちゃん」の第1章テキスト全体に対して形態素解析を実行します。 解析後に、品詞と形態素の頻度集計も行いました。

#ダウンロード & readLines
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))

#RMeCab形態素解析 + neologd辞書
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)
#  parts    mor
#1  名詞 親譲り
#2  助詞     の
#3  名詞 無鉄砲
#4  助詞     で
#5  名詞   小供
#6  助詞     の

#結果保存
#saveRDS(result1, file = "result1.Rds")
#write.table(result1, file = "result1.txt", append = F, row.names = F, sep="\t")
#result1 <- readRDS(file = "result1.Rds")

#GitHubからダウンロード
##Rds fileの場合
#Rds_path_all <- "https://github.com/kumeS/Blog/raw/master/R_text_analysis/R_02/result1.Rds"
#download.file(url=Rds_path_all, destfile = basename(Rds_path_all))
#result1 <- readRDS(file = "result1.Rds")
##text fileの場合
#result1 <- read.table(file="https://raw.githubusercontent.com/kumeS/Blog/master/R_text_analysis/R_02/result1.txt", header = T, sep = "\t")

次に、table()関数を用いて、品詞と形態素の頻度を集計しました。

#品詞のカウント
a <- table(result1$parts)
data.frame(parts=names(a), Freq=as.numeric(a))[order(Freq=as.numeric(a), decreasing = T),]
#      parts Freq
#5      助詞 1500
#11     名詞 1292
#9      動詞  775
#6    助動詞  535
#3      記号  438
#10     副詞  138
#4    形容詞   87
#12   連体詞   47
#7    接続詞   29
#8    接頭詞   24
#2    感動詞    4
#1  フィラー    1

#形態素のカウント: 名詞と動詞
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)
#    parts Freq
#57   する   89
#172  云う   50
#16   いる   46
#21   おれ   43
#95   なる   37
#526    清   37
#281    兄   27
#116  もの   26
#196    何   25
#8    ある   24

#形態素のカウント: 名詞
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)
#     parts Freq
#13    おれ   43
#363     清   37
#190     兄   27
#67    もの   26
#122     何   25
#55      の   24
#262     事   22
#12  おやじ   17
#242     三   16
#25    これ   14

RMeCab形態素解析 + neologd辞書を用いた「坊ちゃん」の第2章以降のテキストの形態素解析

続いて、RMeCab形態素解析 + neologd辞書を使って、 「坊ちゃん」の各章のテキスト(2章から11章まで)に対して 形態素解析を実行します。

#ダウンロード & readLines
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)

#RMeCab形態素解析 + neologd辞書
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