RとJ-LIWC2015によるテキスト解析
五十嵐 祐 (@tasukuigarashi)
はじめに
※2024/11/05 jliwcパッケージの公開により、WindowsのRでも分析が可能となりました。また、設定の手順が大幅に簡略化され、MeCabや他のRパッケージのインストールが不要となりました。
このページでは、RでJ-LIWC2015(Igarashi, Okuda, & Sasahara, 2022) による日本語テキスト解析を行う方法を紹介しています。jliwcパッケージの紹介ページ(英語)がベースとなっています。
J-LIWC2015は、英単語の言語学的・心理学的特性を数値化したテキスト解析の標準的な辞書である、Linguistic Inquiry and Word Count 2015 (LIWC2015) の公式日本語版です。J-LIWC2015は、11,609の単語、69のカテゴリを含み、心理学者、計算科学者によってその信頼性・妥当性が確認されています。
J-LIWC2015のライセンスは、Pennebaker Conglomerates, Inc.が所有しています。J-LIWC2015は、大学での学術研究目的に限り無料で利用できます(英語による説明)。研究成果の公開時には、必ず下記論文を引用してください。
Igarashi, T., Okuda, S., & Sasahara, K. (2022). Development of the Japanese Version of the Linguistic Inquiry and Word Count Dictionary 2015. Frontiers in Psychology, 13:841534. https://doi.org/10.3389/fpsyg.2022.841534
商用利用に関しては、Receptiviまでお問い合わせください。
フィードバックは、https://github.com/tasukuigarashi/j-liwc2015-Rまでお願いします。
事前準備
RでJ-LIWC2015による解析を行うには、以下の環境・ファイルが必要です。
- R (≥ 4.2.0)
 - J-LIWC2015の辞書ファイル(
Japanese_dictionary.dicあるいはLIWC2015 Dictionary - Japanese.dicx) (LIWC2015、あるいはLIWC-22のライセンスが必要です) jliwcパッケージ
R (≥ 4.2.0)
Windows、Mac、Linuxいずれの環境でも実行できます。R Version
4.2.0以降では、デフォルトの文字エンコーディングがUTF-8となったため、Windows環境でも分析が実行可能となりました。
J-LIWC2015の辞書ファイル
LIWC2015あるいはLIWC-22のライセンス(シリアル番号)が必要です。J-LIWC2015の利用に際して、LIWC2015のライセンスがある場合、新たにLIWC-22のライセンスを購入する必要はありません。このチュートリアルは、LIWC2015形式とLIWC-22形式、両方の辞書フォーマットに対応しています。
LIWC2015形式の辞書は、以下の手順でダウンロードしてください:LIWC2015の辞書サイトにアクセス→LIWC2015のシリアル番号を入力し、Loginをクリック→Dictionariesをクリック→Next>ボタンをクリック→Japanese Dictionaryをクリック→同意事項を読み、I agreeをチェック→Download this Dictionaryをクリック
なお、LIWC2015は販売終了となっており、2022年2月から、Pennebaker Conglomerates, Inc. のサイトで、LIWC-22が購入可能です(30日~3年のサブスクリプション契約のみ)。LIWC-22のシリアル番号は、LIWC2015とは異なります。LIWC-22の辞書サイトからログインし、LIWC-22形式のJ-LIWC2015の辞書ファイルをダウンロードしてください(フォーマットが異なりますが、内容は同一です)。
jliwcパッケージ
GitHubからインストールします。remoteパッケージがインストールされていない場合は、先にインストールしてください。
# RとJ-LIWC2015によるテキスト解析
# remoteパッケージのインストール(一度のみ)
if (!requireNamespace("remote", quietly = TRUE)) {
  install.packages("remote")
}
# jliwcパッケージのインストール(一度のみ)
remotes::install_github("tasukuigarashi/jliwc")Windowsでエラーが出てインストールできない場合、Rtoolsをインストールしてください。Rのバージョンごとに対応するRtoolsのバージョンが異なるため、注意してください。
Rでの解析
事前準備を済ませたら、RでJ-LIWC2015による日本語テキスト解析を行っていきます。
辞書のインストール
jliwcパッケージで日本語のテキストデータを解析するには、(1)
IPAdic、(2) ユーザー辞書、(3) J-LIWC2015 辞書の 3
つの辞書をインストールする必要があります。これは最初に一度だけ実行する必要があります。
辞書のインストールには、install_dictionaries()を使用します。デフォルトでは、辞書はアプリケーションディレクトリ
(tools::R_user_dir("jliwc", "data"))
にインストールされます。多くの場合はこの設定で問題ありませんので、Yを入力して進んでください。J-LIWC2015辞書のインストールは、R
GUIまたはRStudioの場合、ファイル選択ダイアログで辞書ファイルを選択してください。コマンドラインからRを使用する場合は、辞書ファイルのパスを入力してください。
library(jliwc)
# 一度だけ実行、すべての辞書をインストール
install_dictionaries()
# 辞書を個別にインストールする場合は以下を実行
# install_ipadic()
# install_userdic()
# install_jliwcdic()Windowsでは、ユーザー名に非ASCII文字またはスペースが含まれている場合
(例:
C:/Users/山田 太郎)、辞書を正しくインストールできないことがあります。辞書をデフォルト以外のディレクトリにインストールする場合は、options(jliwc_project_home = "インストール先のパス")
でパスを指定できます。インストール先のパスには、スペースを含まないASCII文字
(1バイトの英字または数字) で名前を付けることを推奨します (例:
C:/JLIWC)。
辞書の読み込み
辞書がインストールできたら、load_dictionaries()で辞書を読み込みます。次回以降は、jliwcパッケージを読み込んでから、load_dictionaries()を実行するだけでOKです。
テキストデータの解析
load_dictionaries()で辞書ファイルを読み込んだら、liwc_analysis()で日本語のテキストを分析できます。この関数はテキストの前処理とIPAdicによる形態素解析を行った後、テキストのLIWCカテゴリスコアを含むデータフレームを返します。
辞書をデフォルト以外のディレクトリにインストールした場合は、辞書をロードする前にoptions(jliwc_project_home = "インストール先のパス")でパスを指定してください。
# 辞書ファイルの読み込み
# デフォルト以外の場所(例:"C:/JLIWC")に辞書ファイルをインストールした場合、以下を先に実行
# options(jliwc_project_home = "C:/JLIWC")
library(jliwc)
load_dictionaries()
# サンプル(銀河鉄道の夜)
texts <- gibasa::ginga
head(texts)
#>  [1] "銀河鉄道の夜"
#>  [2] "宮沢賢治"
#>  [3] "一 午後の授業"
#>  [4] "「ではみなさんは、そういうふうに川だと言われたり、乳の流れたあとだと言われたりしていた、..."
#>  [5] " カムパネルラが手をあげました。それから四、五人手をあげました。ジョバンニも手をあげようとして、..."
#>  [6] " ところが先生は早くもそれを見つけたのでした。"
# データフレームの作成
# 分析対象の列名は"text"とする
texts_df <- data.frame(text = texts)
liwc_results_df <- texts_df |> liwc_analysis()
dplyr::tibble(liwc_results_df)
#> # A tibble: 553 × 85
#>    doc_id    WC   Dic `function` pronoun ppron     i    we   you shehe  they
#>    <chr>  <int> <dbl>      <dbl>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1 1          4  50         25      0        0     0     0     0     0     0
#>  2 2          2   0          0      0        0     0     0     0     0     0
#>  3 3          4 100         25      0        0     0     0     0     0     0
#>  4 4         75  76         46.7    5.33     0     0     0     0     0     0
#>  5 5         80  83.8       47.5    3.75     0     0     0     0     0     0
#>  6 6         12  91.7       50      8.33     0     0     0     0     0     0
#>  7 7         10  70         40     10       10     0     0    10     0     0
#>  8 8         62  69.4       45.2    1.61     0     0     0     0     0     0
#>  9 9         15  66.7       46.7    6.67     0     0     0     0     0     0
#> 10 10        22  68.2       50      0        0     0     0     0     0     0
#> # ℹ 543 more rows
#> # ℹ 74 more variables: ipron <dbl>, casepart <dbl>, auxverb <dbl>,
#> #   adverb <dbl>, conj <dbl>, negate <dbl>, verb <dbl>, interrog <dbl>,
#> #   number <dbl>, quant <dbl>, adjverb <dbl>, preadj <dbl>, affect <dbl>,
#> #   posemo <dbl>, negemo <dbl>, anx <dbl>, anger <dbl>, sad <dbl>,
#> #   social <dbl>, family <dbl>, friend <dbl>, female <dbl>, male <dbl>,
#> #   cogproc <dbl>, insight <dbl>, cause <dbl>, discrep <dbl>, tentat <dbl>,
# ℹ Use `print(n = ...)` to see more row
# テキストの配列を直接渡すことも可能
liwc_results <- texts |> liwc_analysis()
dplyr::tibble(liwc_results)
#> ... (上と同様)テキストファイルの解析
テキストファイルの読み込みには、
read_text_files()を使用できます。
この関数は、単一または複数のファイルへのパス、あるいはテキストファイルを含むディレクトリのパスルを引数に指定すると、テキストを含むデータフレームを返します。liwc_analysis()には、このデータフレームを直接渡すことができます。
# 辞書ファイルの読み込み
load_dictionaries()
# サンプルテキスト「名大会話コーパス」(https://mmsrv.ninjal.ac.jp/nucc/)
# 出典:Fujimura, I., Chiba, S., & Ohso, M. (2012).
# Lexical and grammatical features of spoken and written Japanese in contrast:
# Exploring a lexical profiling approach to comparing spoken and written corpora.
# In Proceedings of the VIIth GSCP International Conference. Speech and Corpora (pp. 393-398).
# コーパスデータのダウンロードと展開
temp_zip_file <- tempfile(fileext = ".zip")
temp_dir <- tempdir()
download.file(url = "https://mmsrv.ninjal.ac.jp/nucc/nucc.zip", dest = temp_zip_file, mode = "wb")
unzip(zipfile = temp_zip_file, exdir = temp_dir)
# ディレクトリの指定
nucc_dir <- file.path(temp_dir, "nucc")
# テキストファイルの一覧を作成
text_files <- list.files(nucc_dir, pattern = "\\.txt$", full.names = TRUE)
head(text_files)
#> [1] "C:\\Users\\username\\AppData\\Local\\Temp\\RtmpCMTg7o/nucc/data001.txt"
#> [2] "C:\\Users\\username\\AppData\\Local\\Temp\\RtmpCMTg7o/nucc/data002.txt"
#> [3] "C:\\Users\\username\\AppData\\Local\\Temp\\RtmpCMTg7o/nucc/data003.txt"
#> [4] "C:\\Users\\username\\AppData\\Local\\Temp\\RtmpCMTg7o/nucc/data004.txt"
#> [5] "C:\\Users\\username\\AppData\\Local\\Temp\\RtmpCMTg7o/nucc/data005.txt"
#> [6] "C:\\Users\\username\\AppData\\Local\\Temp\\RtmpCMTg7o/nucc/data006.txt"
# テキストファイルの読み込み
# ファイル名の指定
files1 <- read_text_files(text_files)
#> Number of files read: 129
#> Total bytes: 7843788
# ディレクトリを指定することも可能
# 結果はファイル名を指定した場合と同様
files2 <- read_text_files(nucc_dir, filetype = "txt")
#> Number of files read: 129
#> Total bytes: 7843788
# 自分のデータをread_text_files()で読み込むことも可能
# 'filetype'(拡張子)を必要に応じて変更
# file1 <- read_text_files("/path/to/directory/", filetype = "txt")
# テキストファイルの分析
# サンプルデータのため、最低限の前処理(デフォルト)のみを行っている
# 実際のデータを分析する際には、適切な前処理を行う必要がある
liwc_results_files <- files1 |> liwc_analysis()
dplyr::tibble(liwc_results_files)
#> # A tibble: 129 × 85
#>    doc_id         WC   Dic `function` pronoun ppron      i     we
#>    <chr>       <int> <dbl>      <dbl>   <dbl> <dbl>  <dbl>  <dbl>
#>  1 data001.txt  8774  64.0       34.8    3.93 0.809 0.399  0.194 
#>  2 data002.txt 14291  65.7       35.5    3.74 0.917 0.567  0.238 
#>  3 data003.txt  7315  65.8       34.0    4.02 0.902 0.574  0.123 
#>  4 data004.txt  8368  62.0       32.7    5.65 1.55  0.406  0.0478
#>  5 data005.txt 13223  59.6       32.2    4.30 1.31  0.159  0.0908
#>  6 data006.txt 11948  59.7       33.6    4.36 1.19  0.737  0.0251
#>  7 data007.txt  8550  63.5       36.5    4.62 0.795 0.0351 0.0234
#>  8 data008.txt 19817  68.3       38.2    5.63 1.18  0.636  0.0908
#>  9 data009.txt 19010  67.4       37.1    5.52 1.38  0.0789 0.0473
#> 10 data010.txt 10542  64.5       33.3    4.23 1.07  0.0664 0.0854
#> # ℹ 119 more rows
#> # ℹ 77 more variables: you <dbl>, shehe <dbl>, they <dbl>,
#> #   ipron <dbl>, casepart <dbl>, auxverb <dbl>, adverb <dbl>,
#> #   conj <dbl>, negate <dbl>, verb <dbl>, interrog <dbl>,
#> #   number <dbl>, quant <dbl>, adjverb <dbl>, preadj <dbl>,
#> #   affect <dbl>, posemo <dbl>, negemo <dbl>, anx <dbl>,
#> #   anger <dbl>, sad <dbl>, social <dbl>, family <dbl>, …
#> # ℹ Use `print(n = ...)` to see more rowsJ-LIWC2015、MeCabのカテゴリー一覧
jliwcパッケージでは、各単語の品詞の分類を2つの形式で行います。1つはJ-LIWC2015辞書で付与されるカテゴリー、もう1つはMeCab(形態素解析に使用するプログラム)で付与されるカテゴリーです。MeCabのカテゴリーは、末尾に「2」がついています。MeCabのカテゴリーのほうが包括的であり、J-LIWC2015辞書のカテゴリーよりも多くの単語をカバーしているため、品詞の分析や解釈にはMeCabのカテゴリーを使用することを推奨します。
| Category | カテゴリー | LIWCでの表記 | 単語例 | 単語数 | 
|---|---|---|---|---|
| Linguistic dimensions | 言語次元 | |||
| Function words | 機能語 | function | あいつ、非常に、ない | 1808 | 
| Pronouns | 代名詞 | pronoun | 私、あなた、ここ | 111 | 
| Personal pronouns | 人称代名詞 | ppron | 私、あなた、彼女 | 61 | 
| 1st person singular | 一人称単数 | i | 私、僕、おれ | 13 | 
| 1st person plural | 一人称複数 | we | 我々、達、たち | 3 | 
| 2nd person | 二人称 | you | あなた、君、お前 | 16 | 
| 3rd person singular | 三人称単数 | shehe | 彼女、彼、あいつ | 8 | 
| 3rd person plural | 三人称複数 | they | 彼女ら、彼ら、奴等 | 8 | 
| Impersonal pronouns | 不定代名詞 | ipron | ここ、之、全て | 75 | 
| Case particles | 格助詞 | casepart | とか、から、以来 | 187 | 
| Auxiliary verbs | 助動詞 | auxverb | だ、できる、如し | 110 | 
| Adverbs | 副詞 | adverb | すっかり、非常に、目下 | 1268 | 
| Conjunctions | 接続詞 | conj | すなわち、一方、及び | 149 | 
| Negations | 否定詞 | negate | ず、ない、未 | 44 | 
| Other grammar | その他の文法 | |||
| Verbs | 動詞 | verb | わかる、行く、住む | 2271 | 
| Interrogatives | 疑問詞 | interrog | なぜ、どうして、何 | 18 | 
| Numbers | 数詞 | number | ゼロ、百、率 | 52 | 
| Quantifiers | 数量詞・助数詞 | quant | 数多く、いろんな、バレル | 261 | 
| Adjective verbs | 形容動詞 | adjverb | シンプル、大まか、平気 | 184 | 
| Prenoun adjectival | 連体詞 | preadj | ほんの、そんな、如何なる | 35 | 
| Psychological processes | 心理的プロセス | |||
| Affective processes | 感情プロセス | affect | おかしい、敏感、マジ | 2067 | 
| Positive emotions | ポジティブ感情 | posemo | 上品、善、最愛 | 941 | 
| Negative emotions | ネガティブ感情 | negemo | 不信、いいかげん、いや | 1075 | 
| Anxiety | 不安 | anx | 不吉、ナーバス、警鐘 | 157 | 
| Anger | 怒り | anger | 不快、逆ギレ、ハラスメント | 329 | 
| Sadness | 悲しみ | sad | 不幸、悲観、自滅 | 168 | 
| Social processes | 社会的(相互作用)プロセス | social | 迎える、語る、ふれあい | 1027 | 
| Family | 家族 | family | 両親、いとこ、一家 | 122 | 
| Friends | 友人 | friend | 友達、盟友、相棒 | 92 | 
| Female references | 女性 | female | ウーマン、乙女、ママ | 137 | 
| Male references | 男性 | male | おじさん、殿、婿 | 105 | 
| Cognitive Processes | 認知プロセス | cogproc | 心がけ、図る、補う | 1307 | 
| Insight | 洞察 | insight | 信念、注目、探索 | 384 | 
| Causation | 原因 | cause | 誘引、影響、動機 | 229 | 
| Discrepancies | 不一致 | discrep | 意外、ふつう、誤 | 107 | 
| Tentative | あいまいさ | tentat | 推定、気まぐれ、様々 | 281 | 
| Certainty | 確かさ | certain | 常に、厳密、パーフェクト | 247 | 
| Differentiation | 差別化 | differ | 識別、相違、対照的 | 137 | 
| Perceptual processes | 知覚プロセス | percept | 五感、体験、味 | 970 | 
| See | 視覚・知覚 | see | 一見、写す、白 | 351 | 
| Hear | 聴覚 | hear | 歌唱、鳴る、静 | 205 | 
| Feel | 感覚(触覚・味覚・嗅覚) | feel | 鋭利、感覚、うずうず | 307 | 
| Biological processes | 生物学的プロセス | bio | 遺伝、生態、成熟 | 956 | 
| Body | 身体 | body | つま先、脳、眠い | 286 | 
| Health | 健康 | health | 鎮痛、かゆい、しこり | 384 | 
| Sexual | 性 | sexual | ポルノ、欲情、変質者 | 118 | 
| Ingestion | 摂取 | ingest | ビール、雑穀、ベジタリアン | 225 | 
| Drives | 動因 | drives | 主権、威力、同胞 | 2083 | 
| Affiliation | つながり | affiliation | 身内、談笑、友情 | 418 | 
| Achievement | 達成 | achieve | 称賛、リーダー、誇る | 546 | 
| Power | 社会的地位・権力 | power | ランキング、当局、捕まる | 959 | 
| Reward | 報酬 | reward | 発展、向上心、功績 | 237 | 
| Risk | リスク | risk | 事故、コスト、セキュリティ | 252 | 
| Relativity | 相対性 | relativ | 原点、前後、無限 | 2342 | 
| Motion | 動作 | motion | 回す、握る、忍び足 | 844 | 
| Space | 空間 | space | 領域、距離、溝 | 760 | 
| Time | 時間 | time | やっと、週末、最近 | 814 | 
| Personal concerns | 個人的な事柄 | |||
| Work | 仕事・学業 | work | 転職、取り引き、幼稚園 | 837 | 
| Leisure | 趣味・余暇 | leisure | 歌う、園芸、小説 | 399 | 
| Home | 家 | home | キッチン、枕、リフォーム | 148 | 
| Money | 金銭 | money | 給料、負債、ディスカウント | 317 | 
| Religion | 宗教 | relig | 密教、神主、供える | 183 | 
| Death | 死 | death | 追悼、不滅、四十九日 | 89 | 
| Informal language | インフォーマル | informal | 何だ、あいつ、み | 589 | 
| Swear words | 罵倒 | swear | 非国民、アホ、雑魚 | 56 | 
| Netspeak | ネットスラング | netspeak | うp、なう、ぴえん | 346 | 
| Assent | うなずき | assent | そう、是非とも、おk | 16 | 
| Nonfluencies | 間投詞 | nonflu | あぁ、はて、へえ | 121 | 
| Filler words | フィラー | filler | うむ、さて、はは | 25 | 
| Symbols (MeCab) | 記号2 | symbol2 | ||
| Adjectives (MeCab) | 形容詞2 | adj2 | ||
| Case particles (MeCab) | 助詞2 | particle2 | ||
| Auxiliary verbs (MeCab) | 助動詞2 | auxverb2 | ||
| Conjunctions (MeCab) | 接続詞2 | conj2 | ||
| Prefixes (MeCab) | 接頭詞2 | prefix2 | ||
| Verbs (MeCab) | 動詞2 | verb2 | ||
| Adverbs (MeCab) | 副詞2 | adverb2 | ||
| Nouns (MeCab) | 名詞2 | noun2 | ||
| Prenoun adjectival (MeCab) | 連体詞2 | preadj2 | ||
| Other grammers (MeCab) | その他2 | others2 | ||
| Filler words (MeCab) | フィラー2 | filler2 | ||
| Interjections (MeCab) | 感動詞2 | interject2 | 
その他
- CP932 (Shift-JIS)、EUC、UTF-16などのエンコーディングで保存されているテキストファイルは、Rでの読み込み時に文字コードを正しく指定しないと文字化けする場合があります。
 
License
This software is released under the GPL-3.0 License.
Copyright (c) 2022-2024 Tasuku Igarashi