星野しずるは社会詠の夢を見るか?

短歌生成アルゴリズムとしての「犬猿」

星野しずるのことは、たぶん多くの人が記憶している。しかし、星野しずるがどのような仕組みによって短歌を生成していたのかは、インターネット上の記録からでは、すでに確認しづらくなっている。

以前は、「犬猿」や「犬猿短歌」について、作成者である佐々木あららが簡単に説明しているページがあったのだが、そのページはドメインが切れてしまっていて、インターネットアーカイブから探さないと閲覧できない。

そもそも、オリジナルの「犬猿」も、すでに公開されていない。2024年6月現在、「星野しずる」と検索して上のほうに表示されるだろう以下のサイトは、筆者がもともと2019年ごろに「犬猿」のソースコードを読んだうえで再実装したものである。

Baboon|「犬猿」(星野しずる)クローン

そこで、星野しずるが何をしていたのかを簡単に説明しておきたい。かつて存在した「Q&A:星野しずるの犬猿短歌」というページでは、「犬猿」について次のように説明されていた。

「犬猿(いぬざる)」は、いわゆる「二物衝撃」によって詩的飛躍を感じさせる短歌を自動生成するスクリプトです。ブログ歌人の佐々木あららがつくりました。このスクリプトがつくった短歌を「犬猿短歌」と呼んでいます。この名前は、内部構造が「犬パート」と「猿パート」とにわかれていることに由来します。猿というのはよく言われる「無限の猿定理」の猿を意識しています。猿パートに命令を与える部分は、ことわざの「犬猿(けんえん)の仲」をイメージして「犬」です。これらの呼び名は友人の歌人、仁尾智がつけてくれたものです。

Q&A:星野しずるの犬猿短歌

佐々木あららによるオリジナルの「犬猿」は、古いJavaScriptで書かれていたプログラムで、実際のスクリプトとしてはこういったものである。

文字コードがShift-JISだったので日本語部分が文字化けして読めないだろうが、やっていることとしては、dogという構文のリストからランダムに「レシピ」を抽出し、その「レシピ」について、名詞m・修飾部s・述部jを語彙リストのなかからランダムに選んであてはめることによって、短歌のような日本語文字列を生成している(「レシピ」に語彙をあてはめる関数がapeという名前になっていた)。

構文はだいたい次のようなかたちをしており、たとえばm4であれば、語彙リストのなかから4モーラの名詞を無作為に抽出してあてはめることになっている。

rec <- c(
  "m4+の+m3+j4+s5+s4+m2+j6+m2",
  "s5+m3+の+m2+j6+m3+j4+s4+m3",
  "m4+j5+s3+m4+は+m6+の+m3+j4",
  "m4+j5+s3+m4+j4+s4+m4+j3",
  "m4+j4+m3+の+m4+j5+s3+m4+j3",
  "s5+m6+j6+s3+m3+j6+m2",
  "m4+j5+s3+m4+j8+s5+m2",
  "m4+j4+m3+j6+s7+s3+m4",
  "s5+m6+j6+s7+m2+j5",
  "s5+m2+j5+m4+は+s4+m2+j8",
  "s5+s7+m2+j3+m6+j8",
  "m2+j3+s3+m3+j6+m2+の+m3+j8",
  "m4+j6+m2+ +s5+m2+j5+s3+m4",
  "s5+m3+j4+s5+m3+の+m2+j5+m3",
  "m4+は+m6+の+m2+j3+s4+m2+j6+m2",
  "m4+j4+s4+m4+は+s7+m4+j3",
  "s5+s4+m2+の+m4+j5+s3+m3+j4",
  "s5+m4+j3+m4+j4+s4+m4+j3",
  "m4+j8+s5+m3+の+m2+j4+m4",
  "s5+m2+の+m3+j6+m6+は+s4+m3"
)

いずれの構文についても、少なくとも2個の名詞が含まれており、2つの名詞を対比させるようなものになっている。これはおそらく、「犬猿」がもともと「いわゆる「二物衝撃」によって詩的飛躍を感じさせる短歌を自動生成する」ことを意図して書かれたことによる。

また、語彙リストにはm2~m6、s3~s7、j3~j8の名詞・修飾部・述部が含まれていたが、実際に有効になっているレシピには5モーラの名詞、6モーラの修飾部、7モーラの述部は含まれていないため、必ずしもすべての語彙が使われる可能性があるわけではなかった。

星野しずるの語彙を差し替える

「犬猿」は、実際に実行すると、たとえば次のような日本語文字列が生成されるというものだった(ただし、以下の実行結果は筆者による再実装による)。

ct <- V8::v8()
ct$source("https://raw.githack.com/paithiov909/baboon/master/dist/main.js")
#> [1] "true"

ct$eval("let baboon = new Baboon()")

sapply(seq_len(14), \(i) {
  ct$call("baboon.create")
})
#>  [1] "結末を捨てて素足を映し出す青みがかった笑うゆびさき"        
#>  [2] "退屈な時に伝わるカナリアは真冬の日々に隠されている"        
#>  [3] "アラビアの夢の九月を見た朝に三角巾は無限の素足"            
#>  [4] "太陽を見つめ少女のかなしみが広がる笑うカナリアを見た"      
#>  [5] "夢の日だとけた指紋から飛び出した街の少女を大切にする"      
#>  [6] "鉄塔は死んでしまったとけてゆく悪夢の傘のあとで風景"        
#>  [7] "明け方の神経質な家の日だ小学生に嫌われている"              
#>  [8] "運命を眺めていたらおととしの予言の人を殺し姫君"            
#>  [9] "いじわるなひとつひとつを待っている色とりどりの恋がいっぱい"
#> [10] "弱虫にしたがいなさい金色の涙の歌としての残像"              
#> [11] "三日月のようにみにくい失敗は思い出せないカナリアになり"    
#> [12] "君だけのらせんとともに夕暮れの世界の愛を集めて呪い"        
#> [13] "ありふれた三角巾を見た朝に思い出せない波を待つ日の"        
#> [14] "凛として手紙になった気の毒な羊の死者のリズムで挫折"

ところで、オリジナルの「犬猿」では、構文のリストと語彙リストはスクリプトにハードコーディングされていた。しかし、実際のところ、「犬猿」というのは上で説明したような「「レシピ」に語彙をあてはめる」やり方によって日本語文字列を生成するアルゴリズムのことを指すにすぎないため、構文のリストと語彙リストの中身はそれっぽいものであればなんでもよい。

したがって、たとえば次のように構文や語彙を差し替えることによって、星野しずるの短歌は雰囲気を変えることができる。

rec <- c(
  # "m4+の+m3+j4+s5+s4+m2+j6+m2",
  # "s5+m3+の+m2+j6+m3+j4+s4+m3",
  "m4+j5+s3+m4+は+m6+の+m3+j4",
  "m4+j5+s3+m4+j4+s4+m4+j3",
  "m4+j4+m3+の+m4+j5+s3+m4+j3",
  "s5+m6+j6+s3+m3+j6+m2",
  "m4+j5+s3+m4+j8+s5+m2",
  "m4+j4+m3+j6+s7+s3+m4",
  "s5+m6+j6+s7+m2+j5",
  "s5+m2+j5+m4+は+s4+m2+j8",
  "s5+s7+m2+j3+m6+j8",
  "m2+j3+s3+m3+j6+m2+の+m3+j8",
  # "m4+j6+m2+ +s5+m2+j5+s3+m4",
  # "s5+m3+j4+s5+m3+の+m2+j5+m3",
  # "m4+は+m6+の+m2+j3+s4+m2+j6+m2",
  "m4+j4+s4+m4+は+s7+m4+j3",
  "s5+s4+m2+の+m4+j5+s3+m3+j4",
  "s5+m4+j3+m4+j4+s4+m4+j3",
  "m4+j8+s5+m3+の+m2+j4+m4",
  "s5+m2+の+m3+j6+m6+は+s4+m3"
)
dic <-
  readr::read_csv("aiko-vocab.csv", show_col_types = FALSE) |>
  dplyr::mutate(
    stamp = dplyr::row_number()
  )
ct$assign("rec", rec)
ct$assign("dic", dic, auto_unbox = FALSE)

ct$eval("baboon = new Baboon(dic, rec, { m: 'm', s: 's', j: 'j'})")
#> [1] "[object Object]"

sapply(seq_len(14), \(i) {
  ct$call("baboon.create")
})
#>  [1] "ぎこちない麦わら帽子と思ってた夜の秘密を集めてた海"      
#>  [2] "図書館を抱いた黄色い花束はうつらうつらな街並だよね"      
#>  [3] "キラキラの海に溺れるジーンズは無限の傷の擦り傷のよう"    
#>  [4] "満開の嘘つきだよね横顔にそって魔法の幸せだって"          
#>  [5] "雨を見て今日の炎におやすみをドアののどかの終わりの終わり"
#>  [6] "柔らかい恋しい朝の運命の数だけ空のかけらを秘めた"        
#>  [7] "横顔が終わった熱い公園は黄昏時の両手のままに"            
#>  [8] "花束を好きになりたいゆらめいた涙の星にそってこもれび"    
#>  [9] "告白を抱いたパジャマの灯台の数だけ白の幸せとして"        
#> [10] "心臓にそってまぶたの告白を恐れて今日の公園みたい"        
#> [11] "告白を愛して痛い昼すぎがずっとまばゆくはてどなく箱"      
#> [12] "夏髪の二人に白の髪の毛はひとりぼっちのしずくのままに"    
#> [13] "親指を愛しているとさよならの炎のドアを抱いたポケット"    
#> [14] "そっけないポニーテールが分からない危なっかしい傷を恐れて"

ここでは、構文のリストから一部の候補を消しつつ(もとのリストでは体現止めになる構文が多いため、そのまま使うと若干くどく感じられる)、使用する語彙リストをaikoの楽曲の歌詞に現れる表現をもとに独自に作成したものに差し替えている。

一方で、こうした歌詞に現れるような表現というのは、おそらく、どちらかというと「話しことば」的なものであるため、オリジナルの語彙を使った場合と比べても、生成される短歌のスタイルはさほど変わらないようにも思われる。そこで、さらに雰囲気を変えたい場合、より「書きことば」的な、固い語彙を多めに盛り込んだ語彙リストに差し替えてみるのが有効かもしれない。

additional_vocab <-
  readr::read_csv("vocab_n.csv", show_col_types = FALSE) |>
  dplyr::mutate(
    stamp = dplyr::row_number() + nrow(dic),
    word = token,
    type = "m"
  ) |>
  dplyr::select(word, mora, type, stamp)

dic <- dic |>
  dplyr::filter(type != "m") |>
  dplyr::bind_rows(additional_vocab)

ct$assign("rec", rec)
ct$assign("dic", dic, auto_unbox = FALSE)

ct$eval("baboon = new Baboon(dic, rec, { m: 'm', s: 's', j: 'j'})")
#> [1] "[object Object]"

sapply(seq_len(14), \(i) {
  ct$call("baboon.create")
})
#>  [1] "責任を掴んだままに遠浅の終わりのうつを抱いた勉強"        
#>  [2] "責任じゃなくても風の承認が無闇に遠いゆらめいた夜"        
#>  [3] "精神が聞こえてますかもどかしいパートの椅子を秘めた世の中"
#>  [4] "最高の重心になる団塊を抱いた愛しい支払いのよう"          
#>  [5] "ケアマネになれずに白の感染にそって黄色い難民かしら"      
#>  [6] "さんざめく昼にまかせて残業はやさしい昼に届くだろうに"    
#>  [7] "青白い町を待てども薬局は隣の株であったとしても"          
#>  [8] "判決を知らないボロい困窮を思い出したら土砂降りの服"      
#>  [9] "人生にそって議員に隠されたコンクリートの遠い改正"        
#> [10] "唯一の君の知らない夜みたいライフプランにとらわれている"  
#> [11] "用品を落としてしまうかたことの事例の医師のままに裁量"    
#> [12] "将来にそって昨日の国民は君の知らない挨拶になる"          
#> [13] "真っ白いフリーランスのそばにいて渡り廊下の服を許して"    
#> [14] "実態の不思議と風の退職はパンデミックの市場にそって"

ここでは、衆議院の厚生労働委員会の議事録に出現する表現をもとに作成した名詞のリストによって、上の語彙リストに含まれていた名詞だけを差し替えている。具体的には、2023年5月から2024年5月までに開かれた衆議院の厚生労働委員会の議事録のなかから、「介護」か「ケア」という文字列が含まれた発言で使われた語句を抽出したうえで、それらをもとに人手で作成した名詞のリストを使っている。

「社会詠する」のは誰なのか

こうして生成される文字列の雰囲気を変えてみるとき、たとえば「介護」や「ケア」といったことばと共起するような、私たちの社会にまつわる文脈のもとでよく出現する語彙を与えて文字列を生成させた場合に、星野しずるの短歌はすなわち社会詠になるのだろうか。

そうかもしれないとも言えるし、そうとは言いたくないような変な感じもする。星野しずるの「ガチャの結果次第」と言ってしまえばそれまでなのだが、この「ガチャの結果次第」という状況こそがかえって高度に社会詠っぽくもあり、一方で、星野しずるは実体のない「ヴァーチャル歌人」にすぎないのだから、それで彼女が社会詠しているというふうには言えないだろうという感覚もある。

では、仮に星野しずるの生成する文字列が社会詠たりうるとして、それは誰(にとって)の社会詠なのだろうか。筆者の、あるいは、佐々木あららの社会詠だろうか? それとも、その読者(にとって)の社会詠なのか?

外部に立つことや、抽象化することなど、いずれの方法にも私は満足しません。私は社会詠が社会詠の概念を疑うほどに拡張されることを望んでいます。冒頭の問いに答えましょう。私の望むことは、社会詠とそうでない歌の境界線が攪乱されること。そして当事者と非当事者の境界線が攪乱されることです。

私(たち)の望むものは……。社会詠と短歌の社会的影響力について – 砂子屋書房 月のコラム

ある短歌を社会詠として「よむ」ことを「社会詠する」というふうに表現するとき、そこでは二つの意味の社会詠が混線している。髙良真実が引用する小高賢の「社会詠って全部題詠ではないか」のような評価が言及しているのは、その短歌の詠み手が主体であるような社会詠である一方で、髙良が「社会詠とそうでない歌の境界線が攪乱される」というときの社会詠というのは、それを読むことを通じて私たちの社会に対する認識が異化されるような作品といった意味だろうから、その短歌の読み手を主体とするような社会詠である(少なくとも、必ずしも社会詠を意図して読まれているのではないかもしれない作品について「社会詠のラベル」を貼り直しうるのは作品の読者の側だろう)。

ところで、髙良のような観点から作品を評するのだとすれば、短歌を媒介として「社会詠する」主体は読者の側なのだから、ある短歌を社会詠として読みこなせないことは、実は、必ずしもその作品の表現特徴に起因するのではない。しかし(引用した文章は前半と後半で扱っている「問い」が異なるためでもあるのだろうが)、瀬口真司の短歌を批判する箇所では、髙良は、表現が社会的なものに対して影響力をもちえないと思われたことの責を作品(の作者)の側に負わせてしまっている。

星野しずるを主語にするなら

もっとも、ここで生じているねじれは、別にむずかしいものではない。短歌は、詠み手の意図にかかわらず社会詠たりうるが、それを通じて実際に「社会詠する」のは、あくまで人間であるというだけの話だ。つまり、表現としての短歌は、たしかに「よまれる」ことを通じて私たちにとっての社会的なものを異化するかもしれないのだが、そのように「よむ」ことを通じて社会に対して影響力を及ぼしたり、そうした実践によって社会的な責任を負ったりできるのは、短歌ではなく私たちである。

この意味において、「ヴァーチャル歌人」であるところの星野しずるは、少なくともこの現代社会においては「社会詠する」主体にはなりえない。これは、星野しずるを支えている技術に由来する課題ではない。たとえ、星野しずるの「犬猿」アルゴリズムをもっと高度なAIによる文字列生成機能に置き換えて、彼女がいかにも社会詠っぽい日本語文字列を生成できるようになったとしても、状況は変わらないだろう。これは私たちの社会における慣習の問題であり、私たちの社会では、短歌そのものやそれらを生成する仕組みは、人間的な実践によって責任を負ったりできる主体とは見なされないのである。

しかし、そうだとすれば、私たちが星野しずるの生成した文字列を見て、社会詠だと思ったり、そうではないと思ったりする、そのとき、あえて星野しずるを主語にするならば、彼女は何をしているというべきなのだろうか。実は、短歌の世界には、すでにこの状況を意味するのに便利なことばが再来している――彼女は、社会詠の「夢」を見ているのだ。

「短歌はふたたびの夢の時代に入った」というのは、平岡直子が『みじかい髪も長い髪も炎』のあとがきで書いて有名になったことばだ。

「意図が正確に伝わることを重視するタイプと、思わぬ誤解をされることによろこびを感じるタイプに歌人を二分する」とき、後者だと自認する平岡直子は、同時に「主/副」や「正/誤」や「公/私」あるいは「表/裏」のような区別ができうる。

どちらにしても「意図がある」前提の二択にはなっているのだが、後者のタイプのとき、いわゆる〈無意識〉や〈無根拠〉に頼る場合と最大限に精緻なコントロールした(意図が正確に伝わるように作歌した)上で思わぬ誤読を見出されたい場合があると〈私〉は思う。

短歌時評200回 平岡直子について カリフォルニア檸檬 - 「詩客」短歌時評

平岡のことばについて考察するカリフォルニア檸檬は、そうとは言っていないものの、平岡の「夢」という言い方において核心的な部分の近くにまで迫っているように思われる。実際、平岡が「夢」ということばを用いるとき、おそらく、そこでは「意図」のことがゆるやかに連想されている。なぜなら、私たちにとって、夢を見るということは、まさにそのような夢を見ることの「意図」を問われない地点においてなされることだからである。

ここで指摘したいのは、私たちが眠っているときに見る夢の世界で何かをするときだって、やはり「意図」はあったりするだろうし、同様に「無意識」になされたりすることもあるだろうという話ではない。そうではなくて、夢のなかでなされることというのは、この現実の世界でなされることではないがゆえに、「意図」があるとかないとかが問われる以前の段階として、なされていることの「意図」について問われること自体を(この現実の世界においては)保留されるというところに力点がある。

ことばは「社会詠」の夢を見る

このように、何かが、そのように「よむ」ことのできる機能をそなえていながらも、そうあることの意図について問われるのを保留されているような事態を指して、何かが(その機能の)「夢」を見るという言い方をするとき、そこにおいてはじめて見えるようになるのは、いったいどのような景色だろうか。

まず想像されるのは、たとえば「短歌」であることをあらかじめ意図されている表現についても、必ずしもそうではないものについても、この視座からであれば、とくに区別せずに鑑賞できるだろうということである。

例として、星野しずるによる「犬猿短歌」やWikipediaから抽出された「偶然短歌」、あるいは外国語で書かれた短歌などは、必ずしも日本語・定型の「短歌」であることを意図された表現ではないように思われるが、おそらく「短歌」の「夢」を見ているとは言える。したがって、その意味においては、それらは多くの歌集に載っているような短歌と同じように扱うことができるし、同じように扱われるべきなのではないか、などと言えるようになる。

また、このような言い方は、たとえば、短歌そのものに帰属できる性質と、実際に「短歌」することによって実現される機能とを分けて考えることができるような視座に通じているかもしれない。

このあたりはまだ上手く見通せていないのだが(さらに考えたいという思いをそれほど強く持ち合わせているわけでもない)、ここで機能と呼んでいるのは、私たちがそれを実際に「よむ」ことのなかで、結果的に上手く実現されたり、実現されなかったりすることのあるものだろう。だからこそ、その「夢」を見るという言い方が可能なのだと思うのだが、そうだとすれば、いわば「よみそこねる」という事態がおこりえないような側面については、それを機能と呼ぶのはおかしい気がする。それは、たぶん、性質などと呼ぶべき何かだろう。では、私たちが普段短歌と呼んでいる表現に、私たちが「よみそこねる」ことのないような何かは宿っているのだろうか?

わからないが、いずれにせよ(という取りまとめ方も変なのだが)、私たちは別に、「夢」そのものに興味があるわけではないのではとも思う。

星野しずるだけではない、きっとあらゆることばたちは「社会詠」の「夢」を見るだろうし、もしかしたら(それがどういうことなのかはよくわからないが)、この世界そのものが「社会詠」の「夢」を見ているのかもしれない。しかし、私たちが考えたいと思っているのは、それらを通じて実際に「社会詠する」私たち自身のことではなかっただろうか。

だから、というか、少なくとも筆者は、星野しずるのことはわりとどうでもいいと思っている。彼女を最初につくった佐々木あららのことはもちろんすごいと思うし、彼女が生成する文字列を面白く読んでいる人たちがたくさんいることも興味深いと感じる。でも、星野しずるやことばそのもののことが特別好きだとは思わない。筆者は、オリジナルの星野しずるが持っている「バイオゴリラ」という語彙が好きで、あれがどこからやってきたのか知りたいと思うのだが、星野しずる自身はそんなことは知る由もないだろう。

ところで、「バイオゴリラ」は「社会詠」の「夢」を見るだろうか? つまらない問いだと思う。「バイオゴリラ」を「社会詠」として「よむ」とはどのようなことか? とかだったら、まあ、ちょっとは知りたいかもしれない。つまり、そんな感じなわけで、何が言いたいかというと、この文章のタイトルはなんだか見るからに退屈だと思う。