Rで(Python経由で)自然言語処理する の履歴(No.7) - 井関龍太のページ

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Rで(Python経由で)自然言語処理する の履歴(No.7)


RでWindowsで日本語を処理する

Rを使ってWindowsマシンで日本語の自然言語処理をしようとするのはなかなか厄介な仕事です。
このうちのせめてどれかひとつの条件を変えることができれば,ことはずっと簡単です。
おそらく分析対象である日本語テキストを別の言語に変えることは難しいでしょう(そのテキストこそを分析したいのでしょうから)。
それならば,せめてOSをMacやLinuxに変えるか,分析環境をRではなくPythonに変えることを考えるほうが簡単です。

なぜこんなことを言い出すのかというと,日本語のWindowsとRの仕様の兼ね合いが非常に面倒なことになっているからです。
日本語のWindowsはShif-JISという文字コードを基本としています。
Shift-JISは日本語特有のエンコーディング形式で,ひらがなや漢字などの表示に対応しています。
これに対して,UTF-8というより新しいエンコーディング形式はより多く文字や記号に対応しており,国際標準に準拠しています。
そのため,Shift-JISとUTF-8は完全には互換しません。

少し前までは日本語でインストールしたRはShift-JISを基本にしていました。
一見,日本語のWindowsと相性がよさそうですがテキスト分析のためには面倒な状態でした。
Rのデフォルトで入っている文字列操作の関数は使いづらいものが多く,また,かなや漢字に対応していないことも少なくありません。
そこで,より便利なstringrやstringiといったパッケージを使いたいのですが,これらのパッケージはUTF-8を基本としています。
Shift-JISのテキストを対象とすることもできますが,関数を適用すると操作後の文字列はUTF-8で出力されるのです。
そのため,Shift-JISだと思っている文字列がいつの間にかUTF-8になっているということが起こりました。
基本的にUTF-8のほうが対応している文字列の範囲が大きいので逆よりはいいのですが,文字コードによっては適用できない操作が合ったりすると混乱するところです。
また,ファイルの読み込みのデフォルトがCP932(Shift-JISと互換する文字コード)であったために,入力時はShift-JIS,何か操作するとUTF-8という状況でした。
そのため,テキストデータを読み込んだらまずUTF-8に変換するほうが無難でした。

最近のRはデフォルトの文字コードがUTF-8になりました(R 4.2.0以降)。
read.csvなどのファイル読み込みのデフォルトがUTF-8となり,Excelで作成したCSVを読み込むときには逐一CP932やSJISを指定する必要があり,混乱した方もいるのではないでしょうか。
しかし,これでRの中では処理の基本がUTF-8に統一され,テキスト処理はやりやすくなったと思うかもしれません。

これがそうでもなかったのです。
これまではRもWindowsもShift-JISが基本だったので,RがOSとやり取りするときの文字コードが共通だったのです。
そこで,Rでは扱いづらい内容をWindowsに処理させて(具体的には,Windowsのコマンドプロンプトを起動します),その結果をRで受け取るということが簡単でした。
これによってパッケージにない処理をWindowsに実行させて結果を受け取ることがR上の操作だけでできていました。

ところが,Rの基本がUTF-8となったため,コマンドプロンプトからの結果(Shift-JIS)を受け取ると文字化けが起こるようになりました。
コマンドプロンプトをUTF-8モードに切り替えて,コマンドプロンプト内でUTF-8で処理させることはできるのですが,それを外部のアプリケーション(つまり,R)に出力しようとするとその時点でShift-JISになってしまうのです。
すると,せっかくUTF-8で処理させた結果が文字化けし,化けた結果だけがRに送られてくるという状況になります。

そのようなわけで,少し凝ったことをしようとするとますます面倒な状況になったともいえます。
Windwosの文字コードをUTF-8に変更すれば問題は解決するはずですが,それはWindowsを最初からインストールし直すことを意味しており,現状では少なからぬアプリケーション(Officeなど)がShift-JISを前提としているため,通常のPC作業に支障をきたすことになります。
日本語のWindowsが文字コードをUTF-8に変えるのはいつになるのかわかりません。

ということで,もうRをやめてPythonを使ったらという状況にあったわけですが,reticulateというパッケージの存在に気がついてしまいました。
reticulateを使うとRからPythonを使うことができるのです。
Pythonのデフォルトの文字コードはUTF-8です。
ということは,途中で出力がShift-JISになってしまうなどという心配をする必要がありません。
それならば,どうせ外部のプログラムを呼び出すのであれば,Windowsのコマンドプロンプトではなく,Pythonを呼び出せばいいのではないでしょうか。
また,Pythonには自然言語処理の豊富なパッケージがあります。
既存のRのパッケージでは対応していないものもありますが,RからPythonを使うのであれば,これらのパッケージも使用する候補として立ち上がってきます。

以上のような若干込み入った理由から,RでPythonを経由することによって自然言語処理を実行する関数をいくつか作ってみました。

形態素解析

sudachy関数・・・Sudachiを使って形態素解析を行います。
mecaby関数・・・MeCabを使って形態素解析を行います。
jumany関数・・・Juman++を使って形態素解析を行います。

構文解析

ginzaru関数・・・GiNZAを使って構文解析その他の分析を行います。

うまく動かないときは

  • RstudioからPython環境が見つからない
    WindowsでデスクトップをOneDriveと同期している場合,インストールしているはずのPython環境がRstudioから見つからないことがあります。
    このような環境ではMinicondaのインストール先がRstudioで想定されている場所とは異なるために上記のような不具合が起こるようです。
    このような場合も,Python環境がインストールされていることが確実であれば,use_python()関数を使ってpython.exeのインストール先を指定すれば動作するはずです。
    しかし,毎回この関数を実行するのは面倒かもしれません。
    そのような場合,手動でMinicondaをインストールすれば解決する可能性があります。
    問題になっている環境では,Rからinstall_miniconda()関数を使ってインストールするとRstudioから見つからない場所にインストールされますが,Minicondaの実行ファイルからインストールすると別の場所にインストールされます。
    また,手動でインストールするのであれば,Minicondaにこだわる必要はなく,Windows向けのPythonやAnacondaをインストールしたりしても同様に使えます。
  • Pythonのバージョンをチェック
    Pythonのバージョンが新しすぎるとライブラリの導入に失敗することがあるかもしれません。
    Python本体の更新にライブラリの更新が追い付いていないことによる場合が多いので,しばらくすれば解決する可能性がありますが,間が悪いと長く待たねばならないこともありえます。
    そのような場合はご自身で少し古いバージョンのMinicondaなどをインストールしていただき,Rstudio上からこれを使用するように指定するのが早いと思います(reticulateパッケージから旧バージョンのインストールを指定するのは困難なので)。
    現時点(2024年10月現在)では,このコーナーにある関数を使うにはPython 3.10くらいが無難なようです。
 
このエントリーをはてなブックマークに追加