前説のポエム 〜Qiitaと絶頂度と私〜
4年ほど前にバズったこの記事、みなさま覚えていらっしゃいますでしょうか?
あまりに感動したわたくしは、拙いながらも「文章の絶頂度」を計算するロジックを考えてみたりなどしました
その時のわたくしは、こう考えておりました
文章の絶頂度とはなんと素晴らしい概念が生み出されたのだろう
これが世に知られた以上、ちゃんとした賢い誰かがすでにどこかで「絶頂度」を計算する研究を進めているに違いない
感動のあまりいっちょ噛みしてみたけれど、こんなものは先例にも先鞭にもならない。
真の絶頂度計算ロジックがどこぞの研究機関から発表されて、未熟が過ぎる自分の記事をそっと非公開にする日が楽しみだ……と
あれから3年余
時は流れ
時代は進み
ExcelでPythonが使えるようになり
AIという言葉もすっかり社会に浸透しました
こんな進化した世の中で……
Googleで「絶頂度計算ロジック」と検索すると……
なんと自分の記事が検索結果のトップに表示されます
なお
先日100万記事到達を達成したQiitaにおいて(おめでとうございます)
絶頂度
というタグがついた記事もいまだにこれだけです
えぇ……(困惑)
もしかして、みんな絶頂度とか興味ないのぉ……?(混迷)
というわけで
前置きが長くなりました。
そんなわけで、絶頂度計算ロジックに再チャレンジした結果がこの記事です。
なお、以前から、特にExcelでPythonが使えるようになってから「それならもうPython使ってもExcelでやったも同然」とかいう理屈をつけてやりなおしたい、とずっと思っていたのですが、いやその、ほら、忙しいじゃないですか人って。
しかしこのたびClineという最強のAIツールを手に入れた私を止められるものはもうなにもありません。マジで「Clineが一晩でやってくれました」状態で、思いついてからこの記事作成まで片手間3日ほどで走り抜けました。
一番時間がかかったのは機能実装ではなく、はじめてhuggingfaceでサービス公開するところでした。そこで詰まらなければ2日でいけました。Clineしゅごい……
なお、正直いうと元記事の内容からはまったく乖離した仕様になり、そしてまだまだ改良の余地だらけではあるのですが、ちょっと面白い結果が出たので見せたかったのです。へへへ。見ていってくださぁ〜い。
基本の方針
文章の「絶頂度」=「エモさ」と解釈し、「事実の羅列だけを目的としたWikipediaに比べて、文学作品である青空文庫の収蔵コンテンツはエモい」という仮説のもと、Wikipediaのコンテンツをエモ度0の教師データ、青空文庫のコンテンツをエモ度1の教師データとして文章のエモ度をスコア化する機械学習モデルを作成します
具体的なやりかた(実装経緯)
- 上記の方針を与えてClineにコードを書いてもらいました
- そうしたらWikipediaや青空文庫にバンバンスクレイピングをかけるコードが出てきたので、怒られないよう調整してもらいました。(Clineも「気をつけて使用してください」って言ってきたけど、だったら気をつけ済みのやつを書いて欲しいんだけどなー、なんてー)
- Wikipediaはダウンロード用として公開されているデータを使用するようにしてもらいました
- 青空文庫はスリープを多めに挟む処理を追加してもらいました
- 取得したデータをローカルにキャッシュして再利用する処理を追加してもらいました
- 教師データは多いほうがよいはずではありますが、多いとそれだけ処理が重くなりますし、スクレイピングしすぎて怒られたらいやだな...とWikipedia・青空文庫それぞれ500件ずつとしました
- なお文章の特徴量化にはBertを使っているとか最適化のアルゴリズムがどうとか有識者のかたには一番気になるであろう部分については、Clineが書いたので何をしているのかほとんど把握していません。きかないでください
- ためしに実行してみたら、ほとんど1の文章が1に近い値を出してパッと見のスコア差がわかりづらかった...のですが、なんとなくいい感じの値が出ているような感じがするので、1行ごとに絶頂度を出して、その変化をチャート化してみるとよさそう...と思いやってもらうことにしました
- 文章全体の平均値に対して、1行(改行まで)ごとの値の差分をチャートで表しました
- 上記を簡単に実行するUIとしてgradioを入れてもらい、さらに公開用の実行環境としてhuggingfaceにあげました
- URL下においておきますので、ぜひさわってみてください!
こんな結果になりました
基本のあえぎ声
Average Score: 0.99730122
Line 1: [0.99832183] (Difference from average: +0.00102061)
んっ……
Line 2: [0.99463391] (Difference from average: -0.00266731)
あんっあんっ
Line 3: [0.99894792] (Difference from average: +0.00164670)
んほぉぉぉぉ! あああぁぁん!!
「あんっあんっ」が下がっているのは気になりますが、「んほぉぉぉぉ! あああぁぁん!!」が一番高いのはいいですね
元記事の最後3文
Average Score: 0.99941377
Line 1: [0.99975735] (Difference from average: +0.00034358)
さて、お気づきの方もいるかもしれないが、この文章もここまで少しずつ絶頂度を高めるように書いてきた。
Line 2: [0.99953604] (Difference from average: +0.00012227)
かなり高まってきているので、この辺りで文章を終わりにしたい。
Line 3: [0.99894792] (Difference from average: -0.00046585)
んほぉぉぉぉ! あああぁぁん!!
記事の内容通りなら右肩上がりになるのが正しいはずですが、右肩下がりになっています。
しかし徐々にある方向に近づいている、という意味では何か近いようなことを表せてい……る……???
羅生門全文
Average Score: 0.99974495
Line 1: [0.99971968] (Difference from average: -0.00002527)
ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。
Line 2: [0.99981266] (Difference from average: +0.00006772)
広い門の下には、この男のほかに誰もいない。ただ、所々丹塗の剥げた、大きな円柱に、蟋蟀が一匹とまっている。羅生門が、朱雀大路にある以上は、この男のほかにも、雨やみをする市女笠や揉烏帽子が、もう二三人はありそうなものである。それが、この男のほかには誰もいない。
Line 3: [0.99979919] (Difference from average: +0.00005425)
何故かと云うと、この二三年、京都には、地震とか辻風とか火事とか饑饉とか云う災がつづいて起った。そこで洛中のさびれ方は一通りではない。旧記によると、仏像や仏具を打砕いて、その丹がついたり、金銀の箔がついたりした木を、路ばたにつみ重ねて、薪の料に売っていたと云う事である。洛中がその始末であるから、羅生門の修理などは、元より誰も捨てて顧る者がなかった。するとその荒れ果てたのをよい事にして、狐狸が棲む。盗人が棲む。とうとうしまいには、引取り手のない死人を、この門へ持って来て、棄てて行くと云う習慣さえ出来た。そこで、日の目が見えなくなると、誰でも気味を悪るがって、この門の近所へは足ぶみをしない事になってしまったのである。
Line 4: [0.99981362] (Difference from average: +0.00006867)
その代りまた鴉がどこからか、たくさん集って来た。昼間見ると、その鴉が何羽となく輪を描いて、高い鴟尾のまわりを啼きながら、飛びまわっている。ことに門の上の空が、夕焼けであかくなる時には、それが胡麻をまいたようにはっきり見えた。鴉は、勿論、門の上にある死人の肉を、啄みに来るのである。――もっとも今日は、刻限が遅いせいか、一羽も見えない。ただ、所々、崩れかかった、そうしてその崩れ目に長い草のはえた石段の上に、鴉の糞が、点々と白くこびりついているのが見える。下人は七段ある石段の一番上の段に、洗いざらした紺の襖の尻を据えて、右の頬に出来た、大きな面皰を気にしながら、ぼんやり、雨のふるのを眺めていた。
Line 5: [0.99979848] (Difference from average: +0.00005353)
作者はさっき、「下人が雨やみを待っていた」と書いた。しかし、下人は雨がやんでも、格別どうしようと云う当てはない。ふだんなら、勿論、主人の家へ帰る可き筈である。所がその主人からは、四五日前に暇を出された。前にも書いたように、当時京都の町は一通りならず衰微していた。今この下人が、永年、使われていた主人から、暇を出されたのも、実はこの衰微の小さな余波にほかならない。だから「下人が雨やみを待っていた」と云うよりも「雨にふりこめられた下人が、行き所がなくて、途方にくれていた」と云う方が、適当である。その上、今日の空模様も少からず、この平安朝の下人の Sentimentalisme に影響した。申の刻下りからふり出した雨は、いまだに上るけしきがない。そこで、下人は、何をおいても差当り明日の暮しをどうにかしようとして――云わばどうにもならない事を、どうにかしようとして、とりとめもない考えをたどりながら、さっきから朱雀大路にふる雨の音を、聞くともなく聞いていたのである。
Line 6: [0.99978620] (Difference from average: +0.00004125)
雨は、羅生門をつつんで、遠くから、ざあっと云う音をあつめて来る。夕闇は次第に空を低くして、見上げると、門の屋根が、斜につき出した甍の先に、重たくうす暗い雲を支えている。
Line 7: [0.99978739] (Difference from average: +0.00004245)
どうにもならない事を、どうにかするためには、手段を選んでいる遑はない。選んでいれば、築土の下か、道ばたの土の上で、饑死をするばかりである。そうして、この門の上へ持って来て、犬のように棄てられてしまうばかりである。選ばないとすれば――下人の考えは、何度も同じ道を低徊した揚句に、やっとこの局所へ逢着した。しかしこの「すれば」は、いつまでたっても、結局「すれば」であった。下人は、手段を選ばないという事を肯定しながらも、この「すれば」のかたをつけるために、当然、その後に来る可き「盗人になるよりほかに仕方がない」と云う事を、積極的に肯定するだけの、勇気が出ずにいたのである。
Line 8: [0.99980086] (Difference from average: +0.00005592)
下人は、大きな嚔をして、それから、大儀そうに立上った。夕冷えのする京都は、もう火桶が欲しいほどの寒さである。風は門の柱と柱との間を、夕闇と共に遠慮なく、吹きぬける。丹塗の柱にとまっていた蟋蟀も、もうどこかへ行ってしまった。
Line 9: [0.99981493] (Difference from average: +0.00006998)
下人は、頸をちぢめながら、山吹の汗袗に重ねた、紺の襖の肩を高くして門のまわりを見まわした。雨風の患のない、人目にかかる惧のない、一晩楽にねられそうな所があれば、そこでともかくも、夜を明かそうと思ったからである。すると、幸い門の上の楼へ上る、幅の広い、これも丹を塗った梯子が眼についた。上なら、人がいたにしても、どうせ死人ばかりである。下人はそこで、腰にさげた聖柄の太刀が鞘走らないように気をつけながら、藁草履をはいた足を、その梯子の一番下の段へふみかけた。
Line 10: [0.99980026] (Difference from average: +0.00005532)
それから、何分かの後である。羅生門の楼の上へ出る、幅の広い梯子の中段に、一人の男が、猫のように身をちぢめて、息を殺しながら、上の容子を窺っていた。楼の上からさす火の光が、かすかに、その男の右の頬をぬらしている。短い鬚の中に、赤く膿を持った面皰のある頬である。下人は、始めから、この上にいる者は、死人ばかりだと高を括っていた。それが、梯子を二三段上って見ると、上では誰か火をとぼして、しかもその火をそこここと動かしているらしい。これは、その濁った、黄いろい光が、隅々に蜘蛛の巣をかけた天井裏に、揺れながら映ったので、すぐにそれと知れたのである。この雨の夜に、この羅生門の上で、火をともしているからは、どうせただの者ではない。
Line 11: [0.99979955] (Difference from average: +0.00005460)
下人は、守宮のように足音をぬすんで、やっと急な梯子を、一番上の段まで這うようにして上りつめた。そうして体を出来るだけ、平にしながら、頸を出来るだけ、前へ出して、恐る恐る、楼の内を覗いて見た。
Line 12: [0.99979967] (Difference from average: +0.00005472)
見ると、楼の内には、噂に聞いた通り、幾つかの死骸が、無造作に棄ててあるが、火の光の及ぶ範囲が、思ったより狭いので、数は幾つともわからない。ただ、おぼろげながら、知れるのは、その中に裸の死骸と、着物を着た死骸とがあるという事である。勿論、中には女も男もまじっているらしい。そうして、その死骸は皆、それが、かつて、生きていた人間だと云う事実さえ疑われるほど、土を捏ねて造った人形のように、口を開いたり手を延ばしたりして、ごろごろ床の上にころがっていた。しかも、肩とか胸とかの高くなっている部分に、ぼんやりした火の光をうけて、低くなっている部分の影を一層暗くしながら、永久に唖の如く黙っていた。
Line 13: [0.99977773] (Difference from average: +0.00003279)
下人は、それらの死骸の腐爛した臭気に思わず、鼻を掩った。しかし、その手は、次の瞬間には、もう鼻を掩う事を忘れていた。ある強い感情が、ほとんどことごとくこの男の嗅覚を奪ってしまったからだ。
Line 14: [0.99979466] (Difference from average: +0.00004972)
下人の眼は、その時、はじめてその死骸の中に蹲っている人間を見た。檜皮色の着物を着た、背の低い、痩せた、白髪頭の、猿のような老婆である。その老婆は、右の手に火をともした松の木片を持って、その死骸の一つの顔を覗きこむように眺めていた。髪の毛の長い所を見ると、多分女の死骸であろう。
Line 15: [0.99980956] (Difference from average: +0.00006462)
下人は、六分の恐怖と四分の好奇心とに動かされて、暫時は呼吸をするのさえ忘れていた。旧記の記者の語を借りれば、「頭身の毛も太る」ように感じたのである。すると老婆は、松の木片を、床板の間に挿して、それから、今まで眺めていた死骸の首に両手をかけると、丁度、猿の親が猿の子の虱をとるように、その長い髪の毛を一本ずつ抜きはじめた。髪は手に従って抜けるらしい。
Line 16: [0.99977678] (Difference from average: +0.00003184)
その髪の毛が、一本ずつ抜けるのに従って、下人の心からは、恐怖が少しずつ消えて行った。そうして、それと同時に、この老婆に対するはげしい憎悪が、少しずつ動いて来た。――いや、この老婆に対すると云っては、語弊があるかも知れない。むしろ、あらゆる悪に対する反感が、一分毎に強さを増して来たのである。この時、誰かがこの下人に、さっき門の下でこの男が考えていた、饑死をするか盗人になるかと云う問題を、改めて持出したら、恐らく下人は、何の未練もなく、饑死を選んだ事であろう。それほど、この男の悪を憎む心は、老婆の床に挿した松の木片のように、勢いよく燃え上り出していたのである。
Line 17: [0.99980515] (Difference from average: +0.00006021)
下人には、勿論、何故老婆が死人の髪の毛を抜くかわからなかった。従って、合理的には、それを善悪のいずれに片づけてよいか知らなかった。しかし下人にとっては、この雨の夜に、この羅生門の上で、死人の髪の毛を抜くと云う事が、それだけで既に許すべからざる悪であった。勿論、下人は、さっきまで自分が、盗人になる気でいた事なぞは、とうに忘れていたのである。
Line 18: [0.99976617] (Difference from average: +0.00002123)
そこで、下人は、両足に力を入れて、いきなり、梯子から上へ飛び上った。そうして聖柄の太刀に手をかけながら、大股に老婆の前へ歩みよった。老婆が驚いたのは云うまでもない。
Line 19: [0.99962556] (Difference from average: -0.00011938)
老婆は、一目下人を見ると、まるで弩にでも弾かれたように、飛び上った。
Line 20: [0.99957556] (Difference from average: -0.00016939)
「おのれ、どこへ行く。」
Line 21: [0.99976975] (Difference from average: +0.00002480)
下人は、老婆が死骸につまずきながら、慌てふためいて逃げようとする行手を塞いで、こう罵った。老婆は、それでも下人をつきのけて行こうとする。下人はまた、それを行かすまいとして、押しもどす。二人は死骸の中で、しばらく、無言のまま、つかみ合った。しかし勝敗は、はじめからわかっている。下人はとうとう、老婆の腕をつかんで、無理にそこへじ倒した。丁度、鶏の脚のような、骨と皮ばかりの腕である。
Line 22: [0.99970347] (Difference from average: -0.00004148)
「何をしていた。云え。云わぬと、これだぞよ。」
Line 23: [0.99978536] (Difference from average: +0.00004042)
下人は、老婆をつき放すと、いきなり、太刀の鞘を払って、白い鋼の色をその眼の前へつきつけた。けれども、老婆は黙っている。両手をわなわなふるわせて、肩で息を切りながら、眼を、眼球がの外へ出そうになるほど、見開いて、唖のように執拗く黙っている。これを見ると、下人は始めて明白にこの老婆の生死が、全然、自分の意志に支配されていると云う事を意識した。そうしてこの意識は、今までけわしく燃えていた憎悪の心を、いつの間にか冷ましてしまった。後に残ったのは、ただ、ある仕事をして、それが円満に成就した時の、安らかな得意と満足とがあるばかりである。そこで、下人は、老婆を見下しながら、少し声を柔らげてこう云った。
Line 24: [0.99978727] (Difference from average: +0.00004233)
「己は検非違使の庁の役人などではない。今し方この門の下を通りかかった旅の者だ。だからお前に縄をかけて、どうしようと云うような事はない。ただ、今時分この門の上で、何をして居たのだか、それを己に話しさえすればいいのだ。」
Line 25: [0.99976355] (Difference from average: +0.00001860)
すると、老婆は、見開いていた眼を、一層大きくして、じっとその下人の顔を見守った。の赤くなった、肉食鳥のような、鋭い眼で見たのである。それから、皺で、ほとんど、鼻と一つになった唇を、何か物でも噛んでいるように動かした。細い喉で、尖った喉仏の動いているのが見える。その時、その喉から、鴉の啼くような声が、喘ぎ喘ぎ、下人の耳へ伝わって来た。
Line 26: [0.99971944] (Difference from average: -0.00002550)
「この髪を抜いてな、この髪を抜いてな、鬘にしようと思うたのじゃ。」
Line 27: [0.99981099] (Difference from average: +0.00006605)
下人は、老婆の答が存外、平凡なのに失望した。そうして失望すると同時に、また前の憎悪が、冷やかな侮蔑と一しょに、心の中へはいって来た。すると、その気色が、先方へも通じたのであろう。老婆は、片手に、まだ死骸の頭から奪った長い抜け毛を持ったなり、蟇のつぶやくような声で、口ごもりながら、こんな事を云った。
Line 28: [0.99981767] (Difference from average: +0.00007272)
「成程な、死人の髪の毛を抜くと云う事は、何ぼう悪い事かも知れぬ。じゃが、ここにいる死人どもは、皆、そのくらいな事を、されてもいい人間ばかりだぞよ。現在、わしが今、髪を抜いた女などはな、蛇を四寸ばかりずつに切って干したのを、干魚だと云うて、太刀帯の陣へ売りに往んだわ。疫病にかかって死ななんだら、今でも売りに往んでいた事であろ。それもよ、この女の売る干魚は、味がよいと云うて、太刀帯どもが、欠かさず菜料に買っていたそうな。わしは、この女のした事が悪いとは思うていぬ。せねば、饑死をするのじゃて、仕方がなくした事であろ。されば、今また、わしのしていた事も悪い事とは思わぬぞよ。これとてもやはりせねば、饑死をするじゃて、仕方がなくする事じゃわいの。じゃて、その仕方がない事を、よく知っていたこの女は、大方わしのする事も大目に見てくれるであろ。」
Line 29: [0.99954683] (Difference from average: -0.00019812)
老婆は、大体こんな意味の事を云った。
Line 30: [0.99980563] (Difference from average: +0.00006068)
下人は、太刀を鞘におさめて、その太刀の柄を左の手でおさえながら、冷然として、この話を聞いていた。勿論、右の手では、赤く頬に膿を持った大きな面皰を気にしながら、聞いているのである。しかし、これを聞いている中に、下人の心には、ある勇気が生まれて来た。それは、さっき門の下で、この男には欠けていた勇気である。そうして、またさっきこの門の上へ上って、この老婆を捕えた時の勇気とは、全然、反対な方向に動こうとする勇気である。下人は、饑死をするか盗人になるかに、迷わなかったばかりではない。その時のこの男の心もちから云えば、饑死などと云う事は、ほとんど、考える事さえ出来ないほど、意識の外に追い出されていた。
Line 31: [0.99916649] (Difference from average: -0.00057846)
「きっと、そうか。」
Line 32: [0.99977535] (Difference from average: +0.00003040)
老婆の話が完ると、下人は嘲るような声で念を押した。そうして、一足前へ出ると、不意に右の手を面皰から離して、老婆の襟上をつかみながら、噛みつくようにこう云った。
Line 33: [0.99972004] (Difference from average: -0.00002491)
「では、己が引剥をしようと恨むまいな。己もそうしなければ、饑死をする体なのだ。」
Line 34: [0.99979085] (Difference from average: +0.00004590)
下人は、すばやく、老婆の着物を剥ぎとった。それから、足にしがみつこうとする老婆を、手荒く死骸の上へ蹴倒した。梯子の口までは、僅に五歩を数えるばかりである。下人は、剥ぎとった檜皮色の着物をわきにかかえて、またたく間に急な梯子を夜の底へかけ下りた。
Line 35: [0.99980050] (Difference from average: +0.00005556)
しばらく、死んだように倒れていた老婆が、死骸の中から、その裸の体を起したのは、それから間もなくの事である。老婆はつぶやくような、うめくような声を立てながら、まだ燃えている火の光をたよりに、梯子の口まで、這って行った。そうして、そこから、短い白髪を倒にして、門の下を覗きこんだ。外には、ただ、黒洞々たる夜があるばかりである。
Line 36: [0.99959117] (Difference from average: -0.00015377)
下人の行方は、誰も知らない。
これはいい! これで記事書こう! となった理由がそうですこれです。
キャラのギャップ萌え、あるいはストーリーに意外性を感じたとき、心を惹かれるように。
「読んでいく流れの中で文章の雰囲気に落差を感じる」 とき、人はエモさを感じるのでは? と。
この場合、途中までの平坦さに対し、起承転結の転、にあたる部分。話が大きく展開する周辺で、スコアが乱高下しています。特に31行目の下人の心もちがはっきりときりかわったセリフのところは、非常に印象的な落差が生まれていますね。
また、1行目と2行目、最後から1行目と2行目の落差も比較的大きく、つかみと余韻のバッチリ感も読み取れます。
公開ページ
謝辞
- Wikipedia
- 青空文庫
-
元記事のはてな匿名ダイアリー
- この記事やClineへの指示出しには「エモさ」「スコア」という言い回しを使っていますが、元記事への敬意をこめて公開時の呼び名は「絶頂度」といたしました
感想
- 絶頂度計算自体の内容の正しさはともあれClineやhuggingfaceについてかなりレベルアップしました。やってよかったです
- ちなみに「羅生門」以外は特に確認していないので、他の文学作品だと全然大した結果にならない可能性も高いです。面白い結果が出たらおしえていただけると嬉しいです
- 元記事そのものをAIに渡して計算仕様から考えさせてもいいなと思いました。今度やってみます