Quantedaで日本語のテキスト分析をした結果をR markdownでPDF出力する際の文字化け(tofu含む)

1. 問題

Quantedaを使って日本語のテキストを分析した結果を、rmarkdownでまとめてpdfとして出力しようとしたところ、日本語の表示に問題が発生しました。 具体的には、日本語が、wordfishの結果をknitr::kable()を使って表として出力しようとした際に表示されなかったり、textplot_scale1d()でプロットしようとしたグラフの中で□□□と表示されてしまったりしました。□□□にはtofuという呼び名があるらしいです。 問題は、markdownで日本語を含むpdfを出力する問題と、ggplotで日本語を含むグラフを出力する問題の2点に切り分けられました。

f:id:Contiguous:20201206002041p:plain
日本語が□□□(tofu)になってしまっているwordfishの結果

1-1. ちなみに

私の問題はwordfishの結果をtextplot_scale1d()で出力しようとした際に発生したものでしたが、wordcloudでのフォント問題については、大家の方々によるきちんとした対処法が共有されています。

github.com

また、ここで扱われている問題は、この方が制作されたパッケージで解決することができると思われます。今回はRのバージョン的にパッケージをインストールできなかったのでグチャグチャな方法をとることになりました。

ill-identified.hatenablog.com

1-2. お断り

私はゆるふわRユーザーなので、謙遜ではなく本当に「私は雰囲気でRを使って」います。今回も、問題を解決するために色々ググって試したので、実際にどれが効いたのかを特定することが(面倒なのもあり)できませんでした。「この状態ならできた」という状態を共有いたしますので、ご自身で「これは不要だな」と思うところは削って使ってもらえればと思います。

2. 対処法

2-1. R markdown で日本語を含むpdfを出力する

いつも参考にさせてもらっている多くのwebサイトでは、日本語を含むpdfを出力する際のyamlヘッダとして以下のようなものを推奨しています。

output:
  pdf_document: 
    latex_engine: xelatex 
    number_sections: true
documentclass: bxjsarticle
header-includes: 
  - \usepackage{zxjatype} 
  - \usepackage[ipa]{zxjafont} 
geometry: no

私のPCでこれを走らせたところ

output:
  pdf_document: 
    latex_engine: xelatex 
    number_sections: true
documentclass: bxjsarticle
header-includes: 
  - \usepackage{zxjatype} 
  - \usepackage[ms]{zxjafont} 
geometry: no

というエラーが帰ってきてしまいました。IPA明朝フォントがないということだったので、DLして(\Windows\Fonts)にインストールしたり、Rにフォントを認識させてみたりしたものの症状は改善しませんでした。そこで以下のようにしたら上手くいきました。

output:
  pdf_document: 
    latex_engine: xelatex 
    number_sections: true
documentclass: bxjsarticle
header-includes: 
  - \usepackage{zxjatype} 
  - \usepackage[ipa]{zxjafont} 
geometry: no

具体的には latex - \usepackage[ms]{zxjafont}

この部分のipaをmsに変えています。私が何も理解せずにコードをコピペして使っていた証拠ですね。

2-2. Wordfishの結果をtextplot_scale1dで出力する際の□□□を解消する

quanteda内の r textplot_scale1d() などで、グラフ内の文字が□□□となってしまうときは

knitr::opts_chunk$set(dev = "cairo_pdf", dev.args = list(family = "ipaexg"))

これを最初につけるとggplotの中で日本語が使えるようになり、この問題も解決します。 textplot_scale1dってggplotで動いてたんですね。何も知らずに使っていました。

なお、それでもフォントがないと言われる場合は r extrafont::font_import() でフォントをDLできます。これには5分程度時間がかかります。

実はいろいろ試行錯誤しており、その跡も手元のコード内に残っているため、実際にどれが効いたのかがよくわかりません。少なくとも問題が解決したときに最後に試したのがこれだったというだけで、他に試したことも実は解決に寄与していて必要なのかもしれません。

unstructuredな記事を読んで頂きありがとうございました。いつか更新して整理するかもしれません。