見出し画像

AIは詩を作ることができるのか?

私は日々、AIを活用した創作活動を行なっている。特にAIの中でも自然言語処理に着目し、AIによる文章の生成について研究をしている。今回はAIを使って自動で詩を作るにはどうしたらよいか自分の作品を交えながら考察したいと思う。

Whispers from Buzz

私はTwitterのトレンドワードを題材に、AIが詩を綴り続けるインスタレーション作品を作った。

その日その時のTwitterで発話数が多い特定の単語「トレンドワード」をリアルタイムに取得し、関連するツイート群 を統計解析し特徴語を割り出す。20万文の日本語を学習したAIが、特徴語から新規の文を生成することで、トレンドワー ドを題材とした詩(に見えるもの)が生成される。
3つの異なる性格付けをしたAIが同じお題(トレンドワード)でテイストの異なる3つの詩を生成し、プリンターから印刷し続ける。SNS上に投稿され、タイムライン上を流れては消えていく現代のコトバの刹那性への関心から制作した作品である。

こちらの作品で採用されている具体的なロジックを解説する。

Generating Sentences from a Continuous Space

コアとなるAIは上記のタイトルの論文のものを参考にした。論文の解説記事はこちらにある。簡単にこのモデルの特徴をいうと、翻訳などに使われているseq2seqのモデル(RNNとRNNを潜在空間で繋いだモデル)をベースに潜在空間をよりよい空間にするためにガウス分布を初期値として、生成モデルで修正をするというような感じである。

コードは以下を参考にした。

もともとはこの論文で、AIで作った英語の詩が作られていたことから着想を得た。特にこのモデルは、潜在空間を綺麗に作ることができることに特化されていて、詩を生成するのに適していると思う。通常のseq2seqのロジックでは(翻訳を例にとると)、inputで何かの日本語の短文をいれるとoutputでその英語訳が出され、その英語訳の精度が良いか悪いかを見るが、詩の生成で必要なのは綺麗な潜在空間、文が綺麗に空間に配置されていること、が重要であると思っているので、このロジックはそういった点で適している。

日本語モデルの作成

公開されているコードには日本語コーパスがない。私はこのモデルで様々な日本語のデータを適応した。
まず最初に実施したものは、wikipediaデータ(をサンプリングしたもの)で出力してみた。学習回数をいろいろ調整したもののあまり、良い出力を得られなかった。outputで助詞が続いてしまい、「わたし は は は 人間 だ だ だ」のようなoutputになってしまうことが多く、そのままの日本語の生データに適応してもうまくいかなかった。
次に試したものは、日本語の歌詞データを試した。今回詩を作りたいと思っていたので、詩のデータをたくさんAIに学ばせれば、詩を出すと思い学習させたが、そもそも歌詞のデータに含まれる日本語は「日本語とは何か?」を学ばせる文としては適切ではないので、よいアウトプットにならなかった。(作詞家を絞って作ってみたが、その作風を再現するには良いが、汎用的な詩を作成するのには向いていなかった。)
3番目に試したものは、小説のデータ。こちらが一番筋がよく採用をした。インターネットにある小説のデータをスクレイピングし、日本語のらしさ、特に文語体っぽさを学習させた。その際にも、助詞の問題が消えなかったので、やさしい日本語コーパスを分析し、文に対する品詞の組み合わせのランキングを作成し、上位の品詞の組み合わせは、やさしい・きれいと定義をして、小説データもそのスクリーニングをかけ、文として綺麗なものを採用した。

VRAEを活用した詩の作り方

今回実施したかったことは、「どんなテーマを入力しても、7~8行のそのテーマの詩を出力する」ことである。7~8行というものは、詩っぽく見えたのが、そのくらいの行数だったのと、実際にアウトプットしてみてちょうどよかったのが、その行数だった。また今回実施したいことに対して、複数回PDCAを回して今回のステップに至った。

STEP1 あるテーマから共起語を抽出する。

あるテーマに対して汎用的な共起語群を出す際に、辞書に載っている単語はその辞書を使えば良いが、そうでない単語では対応できない。今回はそのテーマが含まれるtweetをリアルタイムに引っ張ってきて、そこに含まれる名詞ランキングから作成した。

STEP2 あるテーマから共起語を抽出する。

共起語が含まれる2文を作成する。本来ならばRNNや今回のロジックで生成できればよかったが、今回は共起語が含まれる既存文をランダムに剪定している。

STEP3 2文を潜在空間にプロットする。

スクリーンショット 2021-05-27 11.51.57

共起語が含まれる2文が空間上どこなのかを、VRAEを通し、エンコードする。また潜在空間には上記のイメージ画像のように文章が散らばっていて、近しい文はその近くにまとまっている。

STEP4 直線で結び等間隔にプロットする。

スクリーンショット 2021-05-27 11.52.24

最初に設定した2文を最初と最後の文として間の文章を生成したい。そのために直線を引き、そこの座標を割り出す。

STEP5 プロットした文をデコードする。

スクリーンショット 2021-05-27 11.52.44

プロットした座標は数値なので、その数値を文章として変換し、文章化する。

STEP6 生成された文を並べる。

スクリーンショット 2021-05-27 11.54.48

あるテーマ、今回だと「雨模様」というテーマに対して、「模様」や「階段」などの言葉を共起語として抽出し、AとBの文を選定する。その間の文を1~5として生成することで、全体として詩に見える文章が生成される。

STEP7 文を整える。

今回は3つのAIを作った。その3つを「良い子」、「悪い子」、「素朴な子」という名前をつけた。それぞれ文の長さのパラメータの調整などでチューニングをしているが、特にAIの文章の出力のAIっぽさを生かしたものもあれば、人間が書いたような文章により近づけたものもある。
特に「良い子」の出す詩に関しては、文を整えるために、文ごとにGoogleのAPIを活用し、英語に変換した後、日本語に変換している。この処理により文として綺麗なものを出力するような処理を施している。
(本来ならもっと直接的なやり方があるはずだと思っている。)

考察

画像5

画像の自動生成で画像が段々とかわる動画はよくみられているが、それのテキストバージョンに相当する。ただし画像とテキストで異なるのは、画像は連続的に変化できるのに対して、テキストは離散的にしか変化できない。つまり画像は潜在空間の座標と画像が1対1対応されているが、テキストはそうではない。そういった部分がテキストでやることに面白みを感じている。

AIの利点を生かしつつ、最終アウトプットtwitterのトレンドワードをリアルタイムに抽出して、リアルタイムに詩をつくるインスタレーションを行なった。

画像6

また、合わせて日常的に出力されるtwitter botを作成した。


この記事が気に入ったらサポートをしてみませんか?