第7回 パラメーターのテキストからの抽出
今回は、パラメーター(魅力度、読了率、評価衝動率)を本文の情報だけから推定できるようにします。
ひとまず、各パラメーターを復習しておきます(自分で忘れてるので)。
・魅力度:リンクが踏まれる確率
*ジャンル
キーワード
タイトル
あらすじ
*読了時間(◆文字数依存)
★獲得済み評価・ブクマ数・感想数・レビュー数
作者
★ランキング掲載
・読了率
*文章力(◆文字数依存)
*ストーリー(◆文字数依存)
・評価衝動率
*小説種別(短編、連載、完結済み)
読者層(★ランキングから流入した読者の場合)
とりあえずテキスト情報から抽出できそうな項目に*を付けました。
幸いなことに、どのパラメーターも不可能では無さそうですね。
ここからさらに、有用なパラメーターだけを選抜して使うことにします。
まず魅力度の項目のうち、読了時間は文字数から容易に求められます。
短編もしくは連載の一話あたりの文字数が、1万字越え辺りでピークになるように関数を設定すれば悪くないでしょう。
ジャンルで係数を設定することは可能ですが、そうするとジャンルごとの傾向を調査する必要があります。高精度の必要性が生まれるまでは、とりあえず置いておきましょう。
読了率の文章力、ストーリーについては、文章内の単語を簡易的な指標に用いることにします。
文章力は、①一文の長さは適切か、②こそあどの比率、③伝聞推定の比率、④疑問の比率で判定します。
その理由は、それぞれ以下の通り。
① 比喩が多ければ必然的に一文の長さは長くなります。
② 「これ」「それ」といった言葉を使いすぎると、読み手には伝わりにくくなります。文章が上手い人なら使いこなせますが、それでも上限はあるはずです。
③ 作品内容にもよりますが、未知の世界にやってきた物語でなければ、「らしい」「そうだ」が多いのはフィクションとしてどうかな、と思ったので加えました。
④ 「なぜ」「どうして」といった言葉も、安易に使われてしまうことが多いかもしれないと思い、加えてみました。
これを、とりあえず芥川龍之介と宮沢賢治の小説のからデータを集めて、解析した結果から考えます。
ストーリーについては、文章のテンポと、逆接・順接の接続詞で判定してみます。
文章のテンポは、読点と文末で区切られた文章の長さを使いました。苦肉の策です。
文章力の推定に使った一文の長さとは違って、読点も含めることでより場面の転換を反映している……ような気がします。
妥当かどうか分かりませんが、とりあえずこれでやってみましょう。
「だが」「しかし」といった接続詞は、場面の転換点で使われることが多いので、使用頻度は場面の展開の数をある程度反映しているものと予想されます。
また順接の接続詞もついでに解析したので入れてみます。
これも、芥川龍之介と宮沢賢治の小説から得た値を使いましょう。
文章力とストーリーの二つが、高精度に予想する上で最もボトルネックになる予感がします。
評価衝動率については、小説種別は確かに影響しそうですが、再現性が良いかは疑問が残ります。
ここは別のアプローチをしてみます。
最終的な値は、前回の推定から、およそ1.5~3%に収まると思われます。
ここは、邪道ですが、「初期評価衝動率1.5%を用いて初めに得た評価(初期評価)」に応じて最終評価が増加し、最大2倍まで増加するようにパラメーターを設定しましょう。
では以下に結果を示します。
【魅力度】
とりあえず文字数が12000字の時に最大になる関数を設定します。
「一話あたりの文字数を最適化して高い評価を得よう!【訂正版】」のデータから、1000字は魅力度5%、12000字は魅力度20%、20000字は魅力度10%くらいになるように見積もります。
確率密度関数の式に(x,y)=(文字数,魅力度)を代入して、各係数を求めます。
……いえ、求めたいのですが、これを解く能力は無いので、代わりに各(x,y)に近い値を示す各係数を、エクセルのソルバーを活用しつつ、手で補正してパラメーターを求めました。
欲しい形を得るために試行錯誤した結果、式は2つの確率密度関数を足し合わせることにしました。
関数の使い方が間違ってる気がしますが、曲線の形さえ得られれば細かいことは気にしません。
y=a(1/SQRT(2pi)s)exp(-(x-m)^2/2s^2)+a'(1/SQRT(2pi)s')exp(-(x-m')^2/2s'^2)から、
a=2600
s=5500
m=12000
a'=4000
s'=30000
m'=40000
となりました。
パラメーターをあえて解釈すれば、小説のリンクを踏む際に、約12000±5500字を好む層と約40000±30000字を好む層が2600:4000の割合で存在している、という感じでしょうか。
グラフの形を図1に示します。
これでおおよそ問題は無いかなと思います。
後から修正するのも楽そうです。
<図1 文字数に対する魅力度の変化>
【読了率】
まず青空文庫に公開されている芥川龍之介と宮沢賢治の作品を解析しました。
一文の長さは以下の式で求めました。
(総文字数)/(文章数)=(総文字数)/[(句点数)+(閉じ括弧数)+(疑問符)+(感嘆符)-(句点+閉じ括弧数)-(疑問符+閉じ括弧数)-(感嘆符+閉じ括弧数)]
感嘆符+閉じ括弧(……!」)のように二つ合わせて文末に使われている場合があるので、重複して数えた分を後から引いています。特に、芥川龍之介と宮沢賢治の作品には、今は使われていない句点+閉じ括弧(……。」)が多数あるので注意しなければなりません。
こそあど率、伝聞推定率、疑問率は、それぞれ、こそあどの単語(「これ」、「それ」など)、伝聞推定の助動詞「そうだ」「そうで」「らしい」「らしかっ」「らしく」「らしけれ」、5W1H(「なぜ」「いつ」など)の数を計測して、上記の文章数で割ることで、一文あたりの含有率を得られます。
この計測の場合、「それる」という言葉を「それ」として計測してしまうといったエラーが含まれてしまいますが、こればかりは無視するしかありません。それぞれのパラメーターで変な値が出ても、全体としてエラーを軽減するように計算するしかないでしょう。
用いたのは以下の作品です。新字新仮名が公開されているものから選びました。
これだけかよ、と思われるかもしれませんが、仕方ありません。だって面倒だったので。
(余談ですが、「河童」は長すぎて一度にコピペできなかったので、四分割してコピペして後で足し合わせるという力技を使っています。)
・芥川龍之介
河童
蜘蛛の糸
杜子春
トロッコ
鼻
羅生門
・宮沢賢治
セロ弾きのゴーシュ
注文の多い料理店
どんぐりと山猫
やまなし
オツベルと象
狼森と笊森、盗森
カイロ団長
蜘蛛となめくじと狸
水仙月の四日
ツェねずみ
なめとこ山の熊
雪渡り
よだかの星
結果を図2に示します
<図2 芥川龍之介と宮沢賢治の作品における一文の長さ>
特筆すべきは、宮沢賢治の作品における一文の長さのばらつきの少なさですね。
「セロ弾きのゴーシュ」「注文の多い料理店」「どんぐりと山猫」「やまなし」「オツベルと象」「狼森と笊森、盗森」「雪渡り」「よだかの星」に限れば、平均は約26.0文字、ばらつきは驚異の約1.38文字!
今回は作品内での一文あたりの文字数のばらつきを計測できていませんが、それが分かるなら、今度は各作品の一文あたりの文字数とそのばらつきを書かれた年代順にプロットしてみたいですね。
後期に発表されているけれど、実は構想は初期からあったかもしれない、みたいな発見があるかもしれません。
童話というジャンルの性質もあるかもしれませんが、少なくとも本人が一文の長さを意識していたのは間違いないでしょう。縛りプレイでもやってたんですかね。
余談はさておき。関数の形は、魅力度を踏襲しました。
基本的に芥川龍之介と宮沢賢治の平均値がそれぞれピークになるように設定しています。ただし、どちらがより理想的か、の重み付けについては、少し個人的な主観が入っています。
ここについては、もっと多くの小説のデータが集まれば、より客観的にできると思います。
y=a(1/SQRT(2pi)s)exp(-(x-m)^2/2s^2)+a'(1/SQRT(2pi)s')exp(-(x-m')^2/2s'^2)から、
a=2
s=9.7
m=41.1
a'=11
s'=40
m'=27
グラフの形を図3に示します。
<図3 一文あたりの文字数に対する文章力パラメータの変化>
こそあど率、伝聞推定率、疑問率も同様に解析しました。
パラメーターは以下の通り。
こそあど率
a=7
s=12
m=72.2
a'=7
s'=10
m'=41.8
伝聞推定率
a=2
s=1.5
m=1.97
a'=1.2
s'=2.2
m'=2.01
疑問率
a=3.5
s=6
m=3.87
a'=1.2
s'=1.58
m'=3.22
グラフの形を、まとめて図4に示します。
<図4 その他の文章力パラメータの変化>
次に、ストーリーのパラメーターを求めます。
文章のテンポは、一文の長さを求める式の分母に読点の数を足しています。
また同様に逆接(「しかし」「だけど」「けれど」「ところが」「のに」「にもかかわらず」「にも関わらず」「ものの」「でも」)・順接(「だから」「それで」「そのため」「そこで」「したがって」「ゆえに」「すると」「それなら」「それでは」)の接続詞を計測しました。
(「ゆえに」は、疑問の「なにゆえに」と被ってますが、仕方ないですね)
各パラメーターは以下の通り。
テンポ
a=3
s=8
m=14.1
a'=4.5
s'=12
m'=15.4
逆接率
a=3.2
s=6
m=12.9
a'=4
s'=8
m'=5.88
順接率
a=3
s=4
m=7.87
a'=3.2
s'=10
m'=5.27
グラフの形を、まとめて図5に示します。
<図5 ストーリーパラメータの変化>
【評価衝動率】
まず初期評価衝動率は、上述のように1.5(%)とします。
続いて、この初期評価衝動率で得られた初期評価に対して増加するようなパラメーターとして、評価衝動率増加率を設定します。
式の形はシグモイド関数を応用しました。
y=1+1.7/(1+EXP((-1)*((x-b)/a)))
パラメーターは以下の通り。
a=300
b=500
グラフの形を図6に示します。
<図6 評価衝動率増加率の変化>
これで、ひとまず形にはなりました。
ちなみに、この方式で拙作「牛の中の美女」を評価すると、ユニーク数が100人の時、約14.8ポイントになります。
大体合ってるので一安心です。
さて、「この方式」なんて呼ぶのも野暮なので、名前をつけようと思います。
「疑似AI」なんて言葉をつけようかとも思いましたが、あまり気取るのも格好悪いなと。
そこで「小説評価予想プログラム SHIORI 試作1号機」と名付けることにします。
では次のステップに進みましょう。
なぜ、わざわざ「SHIORI」をテキストデータだけで作れるようにしたのか。
それは、皆さんに使って頂くことで、多くのフィードバックを頂き、改良に活かすためです。
ある意味、皆さんを実験台にするようなもので申し訳ないのですが、その分、これからさらに良いものを作っていければと思います。
というわけで、次回は皆さんにSHIORIを使って頂く方法をご紹介致します。