なろう小説APIを読んでいたら面白いコマンドを見つけたので紹介と分析をしてみる
会話率
|パラメータ| 値| 説明|
|:--|:--|:--|
|kaiwaritu |int string |抽出する小説の会話率を%単位で指定できます。範囲指定する場合は、最低数と最大数をハイフン(-)記号で区切ってください。
なるほど。会話率……
会話ばっかりとか地の分とかそういうのかな
ではでは早速
ロードの準備とライブラリの読み込みをし
import pandas as pd
import requests
import numpy as np
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt
%matplotlib inline
url = "http://api.syosetu.com/novelapi/api/"
st = 1
lim = 500
data = []
while st < 2000:
payload = {'of': 't-gp-gf-n-ka', 'order': 'hyoka',
'out':'json','lim':lim,'st':st}
r = requests.get(url,params=payload)
x = r.json()
data.extend(x[1:])
st = st + lim
df = pd.DataFrame(data)
df.head()
payload = {'of': 't-gp-gf-n
この部分にkaという部分を追加すればロードができる。(上では追加済み)
そして出てくるデータが
| title | kaiwaritu(%) |
|---|---|
| 転生したらスライムだった件 | 14 |
| ありふれた職業で世界最強 | 40 |
| とんでもスキルで異世界放浪メシ | 36 |
| 無職転生 - 異世界行ったら本気だす - | 22 |
| デスマーチからはじまる異世界狂想曲( web版 ) | 38 |
なるほど。ありふれ結構高いな(ファン)
ただ、そもそもこれがどれくらい高いのか分からないのでdescribe()してみる
| kaiwaritu | |
|---|---|
| count | 2000.00000 |
| mean | 38.00800 |
| std | 10.66831 |
| min | 0.00000 |
| 25% | 31.00000 |
| 50% | 38.00000 |
| 75% | 45.00000 |
| max | 96.00000 |
なるほど。平均が38%となると平均くらいなのか。
というか、ありふれくらい文字数が多くてこの割合って結構多いのか?
文字数を少し絞ってみようか。
読了時間
あえて文字数を指定せずに読了時間というものを使ってみる
といっても読了時間とは
|パラメータ |値 |説明|
|:--|:--|:--|
|time|int string|抽出する小説の読了時間を指定できます。読了時間は小説文字数÷500を切り上げした数字です。範囲指定する場合は、最小文字数と最大文字数をハイフン(-)記号で区切ってください。|
と、ある通り文字数に比例した数字なので数字が小さくなる以外はそこまで問題はないはず。
payload のof にtiを追加して早速ロード
せっかくなのでtimeをdescribe()してみて
| time | |
|---|---|
| count | 2000.000000 |
| mean | 1395.985500 |
| std | 1823.680635 |
| min | 11.000000 |
| 25% | 434.750000 |
| 50% | 889.500000 |
| 75% | 1608.250000 |
| max | 26130.000000 |
一応最低でも5001文字以上はあるようだ。
(...というかmaxってサモナーさんじゃないだろうな)
df[['title','time']].sort_values('time').tail()
| title | time |
|---|---|
| マギクラフト・マイスター | 14868 |
| 境界迷宮と異界の魔術師 | 16410 |
| 異世界料理道 | 17653 |
| サモナーさんが行く | 25536 |
| レジェンド | 26130 |
違いました
読了時間(文字数)と会話率の関連性
# 時間で四分位する
df['part']=pd.qcut(df.time,4,labels=['D','C','B','A'])
# パート毎に平均する
df.groupby('part').agg({'kaiwaritu':['mean']})
※文字数はD<C<B<A
| part | kaiwaritu(平均:%) |
|---|---|
| D | 36.990 |
| C | 38.180 |
| B | 38.322 |
| A | 38.540 |
これは驚いた。特に長編だろうが短編だろうが会話率は変わらないようだ。
文体
悔しかったので、もう一つ文体という機能を使ってみた
これはまだ試作段階のようで、はっきりとデータが出ない場合がある(そもそもあいまい)のと、ofに設定ができないのでデータフレーム読み込みを2種類作ることにする
|パラメータ |値 |説明|
|:--|:--|:--|
|buntai |int string| 文体を指定できます。ハイフン(-)記号で区切ればOR検索できます。 1:字下げされておらず、連続改行が多い作品 2:字下げされていないが、改行数は平均な作品 4:字下げが適切だが、連続改行が多い作品 6:字下げが適切でかつ改行数も平均な作品|
まず、それぞれdf1、df2、df4、df6にわける
- df1
失格紋の最強賢者 ~世界最強の賢者が更に強くなるために転生しました~
公爵令嬢の嗜み
転生賢者の異世界ライフ ~第二の職業を得て、世界最強になりました~
乙女ゲームの破滅フラグしかない悪役令嬢に転生してしまった…
ライブダンジョン!
- df2
異世界食堂
誰かこの状況を説明してください
針子の乙女
私はおとなしく消え去ることにします
中堅(中年)サラリーマンのまったり異世界産業革命
- df4
ありふれた職業で世界最強
無職転生 - 異世界行ったら本気だす -
デスマーチからはじまる異世界狂想曲( web版 )
Re:ゼロから始める異世界生活
陰の実力者になりたくて!【web版】
- df6
転生したらスライムだった件
とんでもスキルで異世界放浪メシ
私、能力は平均値でって言ったよね!
蜘蛛ですが、なにか?
聖女の魔力は万能です
一部納得いかない分類もあるが、ここは我慢する
||df1|df2|df4|df6|
|:--|--:|--:|--:|--:|--:|
|count |500.000000 |500.000000 |500.00000 |500.000000|
|mean |36.506000 |35.246000 |38.74200 |37.668000|
|std |11.489211 |14.927396 |9.70091 |13.106691|
|min |1.000000 |0.000000 |6.00000 |0.000000|
|25% |28.000000 |25.000000 |32.75000 |30.000000|
|50% |36.000000 |35.000000 |39.00000 |38.000000|
|75% |44.000000 |44.250000 |45.00000 |46.000000|
|max |70.000000 |98.000000 |71.00000 |96.000000|
この結果を見ると、大きな差は無いもののdf2が全体的に少なく、逆にdf6が多い結果になった。
尚、母数を500ずつにしているのは最初の母数が2000だったからであって、2000ずつ表示にしたときdf2はさらに下がり34%であった。
こうみると会話率は文体にもかかわってないようだ。やっぱりジャンルなのかな
感想
あまり上手くいかない分析結果になってしまったが、今後仕事としてやっていくときの練習にはなったのかなとは思った。
また面白いデータ分析を思いついたらやってみたいと思う。
読み返してみたら転スラの会話率の低さに驚いた。心の中の会話が多いからか?