短歌における「文体」と得票数の関係

※この記事はnoteへ投稿した記事をリライトしたものです。

データでわかる #うたの日 【文体と得票数の関係】|さちこ|note

この記事でやること

文芸作品の作者ごとの特徴について考えるとき、文体は興味深いキーワードです。私たちの感じとる文体の違いが実際のところどんな要素に由来するものなのかは明らかではありませんが、計量文体論的なアプローチからは語彙の使用比率にもとづく文体の特徴量が提案されています。

名詞率・MVR・VNRはそうした特徴量の例です。名詞率は自立語の総数に対する名詞の割合で、一般に名詞率が高いと凝縮的・要約的な文体になるといわれています。MVRは動詞の数に対する修飾語(形容詞・副詞・連体詞)の割合で、 この値が小さい(動詞が多い)と動きのある物語的な文章になり、この値が大きい(修飾語が多い)と記述的・描写的な文章になるとされています。VNRは名詞の数に対する動詞の割合で、この値が大きい(動詞が多い)と、よりダイナミックで事件展開型の文章になるといわれています。

こうした特徴量であらわされる「文体の違い」によって短歌において好まれやすい文体の傾向が明らかにできれば話がわかりやすくてよいのですが、いろいろ見比べてみたところ、それほど差があるようには感じられませんでした。

名詞率・MVR・VNRで捉えられる文体の差は、短歌における得票数は関係ないのではないかということを検討するために詳細な分析をおこなってみます。

分析対象

うたの日という短歌投稿サイトに出詠されている短歌をスクレイピングして取得したものを分析の対象とします。このサイトのオープン1001日目から1500日目までの500日間に投稿された短歌(74,857首)のうち、同一の筆名で20首以上出詠がある人の短歌(70,150首)を分析対象としました。

方法

分析対象の短歌をMeCab(NEologd辞書)で形態素解析し、名詞率・MVR・VNRを筆名ごとに集計します。

うたの日では「お題」ごとにユーザーが気に入った作品に「音符」を、そのなかでもっとも気に入った作品ひとつだけに「ハート」を入れることができるようになっています。ここでは得票数は短歌ごとにハートと音符の数を合計した値を計算し、筆名ごとにその値の平均を算出したものを用います。そのうえで、3つの文体の特徴量と得票数との相関関係を確認します。

スニペット

分布のようすを確かめるために、3つの文体の特徴量からなる3次元空間に短歌をプロットしてみます。また、{corrr}パッケージを用いてそれぞれの特徴量間の相関関係を確認します。

以下が実際に分析に用いたコードスニペットです。作図には{plotly}を使ってapi_createでプロットをアップロードしています。

library(tidyverse)
library(corrr)
library(RMeCab)
library(plotly)

Sys.setenv("plotly_username" = "YOUR_USERNAME")
Sys.setenv("plotly_api_key" = "YOUR_API_KEY")

`%without%` <- purrr::compose(`!`, `%in%`)


csv <- read_csv("cache/normalized.csv")
cfilter <- csv %>%
    group_by(names) %>%
    count() %>%
    filter(n >= 20) %>%
    ungroup()

dt <- csv %>%
    drop_na() %>%
    filter(names %in% cfilter$names)

fav <- dt %>%
    mutate(fav = loves + likes) %>%
    group_by(names) %>%
    summarise(mean = mean(fav)) %>%
    rowid_to_column()

tagger <- data_frame(
    X1 = dt$X1,
    pos = sapply(dt$poems, as_mapper(~ RMeCabC(iconv(., from = "UTF-8", to = "CP932"), mecabrc = "config/mecabrc") %>% unlist()))
) %>%
    left_join(select(dt, c(X1, names)), by = "X1") %>%
    group_by(names) %>%
    summarize(grouped = list(flatten_chr(pos))) %>%
    rowid_to_column()

stats <- data_frame(
    nr = map_dbl(
        tagger$grouped,
        as_mapper(~ length(.[names(.) %in% c("名詞")]) / length(.[names(.) %without% c("助詞", "助動詞")]))
    ),
    mvr = map_dbl(
        tagger$grouped,
        as_mapper(~ length(.[names(.) %in% c("形容詞", "形容動詞", "副詞", "連体詞")]) / length(.[names(.) %in% c("動詞")]))
    ),
    vnr = map_dbl(
        tagger$grouped,
        as_mapper(~ length(.[names(.) %in% c("動詞")]) / length(.[names(.) %in% c("名詞")]))
    )
) %>%
    rowid_to_column()

mydata <- stats %>%
    left_join(select(tagger, -grouped), by = "rowid") %>%
    left_join(select(fav, -names), by = "rowid") %>%
    filter(nr != Inf) %>%
    filter(mvr != Inf) %>%
    filter(vnr != Inf)

mydata %>%
    select(-c(rowid, names)) %>%
    correlate()

p <- mydata %>%
    plot_ly(type = "scatter3d", x = ~nr, y = ~mvr, z = ~vnr, color = ~mean, text = ~names) %>%
    layout(scene = list(
        xaxis = list(title = "NR"),
        yaxis = list(title = "MVR"),
        zaxis = list(title = "VNR")
    ))

api_create(p, "tanka-buntai")

cache/normalized.csvはスクレイピングで取得した短歌のテーブルで、次のようなカラムを持っています。

X1 poems names loves likes keys1 keys2
行番号 前処理した短歌 筆名 被ハート数 被音符数 投稿された日の外部キー 投稿されたお題の外部キー

短歌についてはスクレイピングして保存する際にあらかじめ前処理をおこない、不要なスペースを除去したり、記号を正規化したりしています。

「文体」と得票数の関係

相関係数は下図のようになりました。nrは名詞率で、meanが得票数です。

名詞率とVNRとのあいだには一般に負の相関があることが知られています。それ以外のあいだにはやはり相関関係はないように見えます。

散布図でも確認してみます。 散布図へのリンク

名詞率とVNRとのあいだには比較的はっきりした負の相関があるため、各点は名詞率が大きくなるとVNRが小さくなるような平面上に載っているように見えます。それ以外には分布のようすに特徴はなく、得票数が高い筆名が集中しているようなようすは見受けられません。

以上のことから、名詞率・MVR・VNRで捉えられる短歌の文体的特徴とうたの日における得票数とのあいだには必ずしも関連はないことがわかります。

文体の特徴量をどう受けとめるか

名詞率・MVR・VNRで捉えられるかぎりでは、うたの日のなかでとくに好まれる文体があるわけではないということがわかりました。自分の特徴量を眺めながら、もっと評価されるためにはこの値が大きく/小さくなるように詠むべきだなどと考える必要はないということです。

それでも、できればこういう雰囲気の文体で詠みたいという理想はそれぞれあるものだと思います。その雰囲気というのは語彙の使用比率で推し量れるものばかりではないでしょうが、それらを定量的に調べることでつかめるものもあるのではないかと思います。個人的に好きな雰囲気の文体を模索しながら、いろいろな人の文体の特徴量を見比べてみるのも楽しいかもしれません。