問題 多項逆回帰を用いて、Amazonレビューデータセットの評価点を識別する単語を明らかにせよ
レビューサイトにおいて、高評価のレビューに含まれている単語と低評価のレビューに含まれている単語を明らかにしたいとしよう。この場合どのようにアプローチするべきだろうか。
テキスト回帰では、テキストにおける各単語数をテキストの属性(レビューの評価など)へと回帰する。しかし、単語の数がデータ数よりも多い場合、モデルの係数を推定する上で問題が生じる。
対して、多項逆回帰(Multinomial Inverse Regression)では、テキストの属性からテキストにおける単語へと回帰する(Taddy, 2013)。事前分布として、ガンマラプラス事前分布を定めているため、正則化がなされており、パラメータ推定上の問題は回避されている。また、本来は単語から属性へと回帰するところを、属性から単語へと回帰しているため「逆回帰」と呼ばれている。
この記事では、amazonのレビューデータセットを対象に多項逆回帰を用いてみる。
#分析用のパッケージ
library(tidyverse)
library(RMeCab)
library(textir)
url <- 'https://s3.amazonaws.com/amazon-reviews-pds/tsv/amazon_reviews_multilingual_JP_v1_00.tsv.gz'
amazon_df <- read_tsv(url) %>% head(5000) #計算時間を減らすためデータ数を絞る
amazon_df[c("star_rating", "review_body")] %>% head(5)
データセットには、レビュー評価点とレビュー文が含まれている。前者をベクトルviとし、テキストにおける単語数xiへと回帰してみよう。
x_y ∼ MN(q_y, m_y) with \ q_{yj} = \frac{exp[αj + yϕ_j]}{\sum^p_{l = 1}exp[α_l + yϕ_l]}
,\ for j = 1, . . . , p, y ∈ Y
amazonRatings <- amazon_df[,"star_rating", drop=FALSE]
docMatrix <- amazon_df$review_body %>% docMatrixDF() %>% t() #単語文書行列を作成し、転置
rownames(docMatrix ) = NULL #インデックスの削除
docMatrix %>% head(3)
RMecabでは、docMatrixDF()を使うことで単語文書行列を作成することができる。
cl <- NULL
fits <- dmr(cl, amazonRatings, docMatrix, bins=5, gamma=1, nlambda=10)
B <- coef(fits)
B[1:2, 1:10]
単語数の数だけ結果の列がある。低いレビュー点数を識別する単語と高いレビュー点数を識別する単語を見てみよう。
mean(B[2,]==0)
#負の効果がある単語ベスト30
B[2,order(B[2,])[1:30]]
#正の効果がある単語ベスト30
B[2,order(-B[2,])[1:30]]
前処理の必要性を感じさせられる結果になっているが、「お粗末」、「返送」という単語が低いレビュー点数を識別しており、「enjoyable」、「thrilling」という単語が高いレビュー点数を識別していることが分かる。
単語から属性を識別したい場合、その指標となるのは予測タスクにおける指標と同じになるが、予測することが本来の目的ではない。このようなタスクを架空の予測問題という(Grimmer et al, 2022)。そのような場合は、多項逆回帰のように予測するための変数と予測したい変数を逆にして回帰することもできるのである。
参考文献