{transforEmotion}と{atrrr}でBlueSkyのセンチメント分析
担当しているRの講義で、毎年テキストマイニングを扱っています。その中で、SNSからのデータ収集や、いわゆる「ポジネガ分析」についても触れています。しかし、X APIは有償化して、個人の興味関心の範囲ではデータの収集ができなくなりました。“ツイート” 取得のデファクトスタンダードとなっていた{rtweet} パッケージも開発が終了してしまいました。
また、ポジネガ分析については、当初たまたまGitHubで見つけたPythonのsentiment_jaライブラリを {reticulate}1 パッケージを使って呼び出していました。しかし、ライブラリ自体がGitHubからなくなり、自分の手元にはたまたま削除される直前にCloneしたものが残っていたのですが、作者が削除したものをいつまでも使うのもな、と思っていました。そもそも私自身、どういうモデルなのかよく分からず、とりあえず感情価が返ってくるので使っている、というだけでしたし。
また、年明けにテキストマイニングの回がやってくるので、この辺りをアップデートしようと、いろいろ調べてみました。
Blueskyからポストを取得する
RからBluesky APIにアクセスできるパッケージ
APIに限らない、X社の方針転換などで、さまざまな代替SNSが公開されています。その中で、比較的ユーザー数が多く、Xの雰囲気に近いと思われるものにBlueskyがあります。また、Blueskyはオープンであることを重視しており、APIも無償で公開されています。そこで、RからBlueskyのAPIにアクセスできるパッケージがないかな、と探してみました。すると、以下の2つがありました。
- CRAN: Package bskyr https://cran.r-project.org/web/packages/bskyr/index.html
- CRAN: Package atrrr https://cran.r-project.org/web/packages/atrrr/index.html (アトルー?)
どちらも、機能的にはほとんど同じで、Blueskyへの投稿、いいね、リポストやフォロー・アンフォローなどの操作ができるようです。そして、今回の主目的である、他者のポストを取得する機能もあります。なお、XにおけるStreaming APIと同様に、BlueskyにもFirehoseというAPIがあり、リアルタイムのポストを取得できる仕組みはありますが、いずれのパッケージもまだサポートしていないようです。2実際、ランダムに取得したポストでポジネガ分析してもあまり意味がないので、今回はキーワードを取得して、そのテキストを処理対象とします。
{atrrr} パッケージのインストール
上記の2つのパッケージのどちらでも、キーワードを指定したポストの検索、取得はできますが、今回は {atrrr} パッケージを使います。3まずその前に、Blueskyにアカウントを作成する必要があります。特に迷うようなこともないので、ここでは省略します。
{atrrr} パッケージはCRANからインストールできます。
|
|
そして、パッケージを読み込みます。
|
|
{atrrr} パッケージによるユーザー認証
はじめに、APIにアクセスするために auth()
関数で認証を得ます。XではAPIにアクセスするためにアクセストークンを取得する必要がありますが、Blueskyではユーザー名とパスワードでアクセスできます。
|
|
ポストの取得
次に、APIにアクセスし、キーワードで検索したポストを取得するには search_post()
関数を使います。ここでは、たまたま今日 (12/28) 開催された中央競馬のGI、ホープフルステークスについてのポストを取得してみましょう。
|
|
ポストがデータフレームとして取得できました。このうち、text
列に実際に分析対象となるテキストが格納されています。
Rでセンチメント分析をする
次に、テキストのセンチメント分析をする方法を (講義のために) アップデートします。上述のように、昨年まではPythonのsentiment_jaライブラリを使っていました。また、それ以前はいくつかの公開された感情表現辞書を使う方法が一般的でした。しかし近年では、生成AIの基盤技術でもある、Transformerを使った言語モデルでセンチメント分析を行うことが主流のようです。
RでTransformerモデルを利用できるパッケージ
しかし、残念ながらそれらの研究開発領域ではPythonが主流で、Rからそれらの高度なモデルをネイティブに扱えるパッケージはないようです。CRANに公開されている、Transformer系のパッケージはいずれも、{reticulate} パッケージを使い、実質的にはRの裏でPythonを動かして処理するものばかりです。その中で、今回は目的にフィットした {transforEmotion} パッケージを使用します。
- CRAN: Package transforEmotion https://cran.r-project.org/web/packages/transforEmotion/index.html
このパッケージは、Hugging Faceで公開されている、“Zero shot classification” に対応した任意のモデルをダウンロードし、{reticulate} パッケージでPyTorchやTensorflowを動かし、任意のラベル (後述) で判定ができます。
…まぁTransformerもHugging FaceもPyTorchも何もかもよくわかっていないんですが🤪
{transforEmotion} パッケージのインストール
{transforEmotion} パッケージはCRANからインストールできます。
|
|
パッケージをインストールした後、パッケージが利用するPythonの仮想環境をminicondaで作成する必要があります。ドキュメントにも記載されていますが、setup_miniconda()
関数を実行します。
基本的には、自動で必要なPythonライブラリ類がダウンロードされ、環境が構築されます。なお、Macでは ~/Library/r-miniconda-arm64/envs/transforEmotion
下に保存されます。
英語テキストでのテスト
環境が構築できたら、まずは英語のテキストでテストしてみましょう。{transforEmotion} パッケージでは、デフォルトで cross-encoder/nli-distilroberta-base モデルが使用されます。4公式サイトのサンプルのままですが、以下を実行してみましょう。
|
|
テキストの感情を6つの尺度で判定し、結果が割合で出力されます。とりあえず結果が出力されれば、環境構築はうまくいっているでしょう。
多言語に対応したモデルのインストール
上記のモデルは、英語にのみ対応しています。そのため、日本語テキストを分析するには、対応したモデルをダウンロードし、指定する必要があります。日本語を含めた多くの言語に対応したモデルとして、MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7がありました。5
{transforEmotion} パッケージでは、モデルを transformer_scores()
関数の transformer
オプションで指定すれば、自動的にダウンロード、インストールをしてくれます。以下のようなコードで、日本語のセンチメント分析ができます。また、Transformerによるモデルでは、任意のラベル (クラス) に対する推論ができます。ここでは、シンプルに「ポジティブ」か「ネガティブ」のどちらがもっともらしいか判定させます。初回は、モデルのダウンロード、インストールがあるため、かなりの時間がかかります。
そもそもわかりやすいテキストですが、きちんと判定できているようです。
日本語に特化したモデルのインストール
計算環境に余裕がある場合や、多言語のテキストを扱いたい場合は、上記の手順で十分ですが、日本語だけで十分だ、という時には、もう少し小さいモデルが使えるかもしれません。Hugging Faceで検索してみると、1つだけ6モデルがありました。akiFQC/bert-base-japanese-v3_nli-jsnli-jnli-jsickモデルは、著名な日本語モデルをさらにファインチューニングしたもの (のよう) です。今度はこちらを使ってみましょう。
fugashiライブラリのインストール
ただ、こちらのモデルは前処理にMeCabを使っており、利用にはfugashiライブラリが必要です。Rから transformer_scores()
関数を実行すると、ただ “object ‘classifier’ not found” とエラーが返ってくるだけで、何が悪いのかよくわかりませんでしたが、reticulate::repl_python()
関数でPythonコンソールを起動し、そちらでモデルの読み込み処理を実行すると、fugashiがインストールされていない、というエラーの原因がわかりました。
Rからminicondaの仮想環境でライブラリをインストールする、というややこしい形になりますが、以下のようにすることでグローバルではなく {transforEmotion} 用の環境にインストールできました。
これで、日本語に特化したモデルが動かせるようになります。試してみましょう。初回はモデルのダウンロード、インストールに時間がかかります。
こちらは、どうも値の大小が逆になっているようです。0が最大、1が最小なのかもしれません。 その振る舞いを理解していれば、多言語モデルよりは多少小さなモデルとして活用できます。
Blueskyのテキストをセンチメント分析する
ということで、環境が整ったので、Blueskyに投稿されたポストをセンチメント分析してみましょう。先ほどの search_post()
関数の実行結果が残っているので、transformer_scores()
関数と組み合わせます。
|
|
200件のポストについて、M3 Macで1分弱かかりました。専門的知識を駆使して🤪ポストの内容と判定結果を見ると、概ね「外した」とか「遅い」といった単語を「哀しみ」「怒り」と判定しているなど、妥当な判定をしているように思います。グラフにしてみましょう。
言語学ではない、Rの講義でハンズオンとして実行する分には、こんなものでよいのではないでしょうか (?)。
…なんかちゃんとした記事になったので、アドベントカレンダーの時期にやればよかったですね。そして、{transforEmotion} パッケージとモデルが講義で使っているPosit Cloudで動くのかが不安です🤪多分メモリもストレージも足りないんだろうなぁ。
-
何年か前に、この { } で囲う記法は推奨されない、とかそんな議論があったように思いますが、R以外のソフトウェア、ライブラリと区別するために、ここでは囲っています。 ↩︎
-
{atrrr}の方は、開発者が実装に向けて協力を求めています。https://github.com/JBGruber/atrrr/issues/23 ↩︎
-
{bskyr} は、ドキュメントを見ると機能が豊富そうですが、実際手元で試すと、最初の認証からうまくいきませんでした。 ↩︎
-
例によってなんだかよくわかっていませんが。 ↩︎
-
例によって(ry ↩︎
-
2つありますが、同じ作者で「長い名前の方を推奨します」と書いてあるので。https://huggingface.co/akiFQC/bert-base-japanese-v3_nli-jsnli ↩︎