AIのニュースを見るたびに、もし私が開発するなら……を想像してしまうのはもはや職業病とも言えるかもしれません。

さまざまな業界に広がりつつあるAIですが、ついにここにも来たか、と思わされるニュースがありました。今秋、サンディアスが発表した新サービス「BLソムリエ powerd by AI」です。

このサービスでは、「ボーイズラブ(BL)」と呼ばれる漫画/小説のジャンルで好きな作家を3人登録しておくと、後はその日の気分やジャンルなどを選択することで、好みの似ているユーザーを探し、「好きな作家」と「ユーザーの評価」をベースに本をレコメンドしてくれるそうです。平たく言えば、自分の好みと似た好みの人が読んでいる本のうち、高評価なものを薦めるシステムだと言えるでしょう。

今回は、「もし私がBLレコメンドAIを開発するならどうするか」を考えてみたいと思います。

本の内容にまで踏み込んだ推薦

好みが似ている人を探し出し、さらに評価に基づいて推薦するのはもちろん面白そうです。しかし、同じ作家が好きだからと言って興味の方向性が同じだとは限りません。なぜなら、同じ作家でも、その作風は作品や発売元のレーベルによって変わることがあるからです。そこで本稿では、好きな作家ではなく好きな本を複数冊登録して、その情報を基に推薦する方法を考えたいと思います。

単純な実現方法としては、作者を登録するときと同様に、ある人が登録している本と同じ本を複数登録している人を見つけ出し、その人が登録している別の本を紹介するというやり方が考えられますが、ここではもう少し、本の内容に言及してみましょう。

今回考案するのは、「どんな作品が好きか」という傾向を読み取り、同じ傾向の作品を勧める方法です。この手法は、単に好みが似たユーザーからのレコメンドだけでは見つけられない、本の内容にまで踏み込んだ推薦が行える点が魅力だと言えます。

BL作品にはさまざまなジャンルがありますが、便宜上、ここでは小説に限定したいと思います。また、本のテキストデータは既に存在するものと仮定させてください。

作品の傾向を把握する方法を考える

作品の傾向を把握する手法として、最も単純な方法は単語の出現頻度を見ることです。その本に頻出する単語から、物語の雰囲気をつかもうというわけです。ただし、全ての単語をカウントした場合、助詞の「は」や助動詞「です」のような内容を表さない単語も対象となってしまうため、このような場合は、名詞(「今日/男/声」など)、動詞(「行く/泣く/見つける」など)、形容詞(「美しい/痛い/熱い」など)などに限定して頻度を計算すると良いでしょう。

しかしこの方法では、一般的によく使われる単語が多く出てきてしまう、という問題があります。「一般的によく使われる単語」とは、どの本にも満遍なく登場する単語のことで、例えば「俺」「今日」といった単語が該当します。

たくさん出現する単語はその本を表している単語だと考えられますが、どの本にも表れるような単語は省かなければ、その本ならではの言葉とは言い難いでしょう。そうした単語を省く方法として、「tf-idf」という手法があります。

「tf」は単語の出現頻度、「idf」は単語のレア度です。tfは出現頻度が高いほど大きな値になり、idfはレアな単語ほど大きな値になります。tf-idfはこのtfとidfとの掛け算の値で、出現頻度が高く、レアであればあるほど大きな数値になるため、「tf-idfの値が大きい単語がその作品を表すのによりふさわしい単語」と考えるわけです。

例えば、ここに3冊のBL本があるとします。BL本1は「俺」が最も出現頻度が高く4回、次に「看守」と「言葉」が3回ずつ出現していました。同じようにBL本2と3における単語の出現回数も数えたところ、次の表のようになりました。

●BL本1

単語 頻度
4
看守 3
言葉 3

●BL本2

単語 頻度
4
言葉 3
3

●BL本3

単語 頻度
恋人 4
3
言葉 3

単純に出現頻度だけを見れば、BL本1をより適切に表現する言葉は「俺」になります。しかし、「俺」はほかの本にも満遍なく登場しているので、BL本1を表現する単語としてはふさわしくないことがわかるでしょう。

それではBL本1の単語のtf-idfの値を計算してみましょう。興味のある方向けに、計算式も下記に記載しておきます。

tf(俺, 本1)=4/10=0.4
tf(看守, 本1)=3/10=0.3
tf(言葉, 本1)=3/10=0.3

tfは単語の出現頻度を表す値なので、該当単語の出現頻度を全単語の出現頻度の和で割ります。例えば、「tf(俺, 本1)」では本1における「俺」の出現頻度「4」を、「俺」「看守」「言葉」の出現頻度の和「10」で割っています。

idf(俺, 本1)=log(3/3)+1=1
idf(看守, 本1)= log(3/1)+1=1.48
idf(言葉, 本1)= log(3/3)+1=1

idfは単語のレア度を表す値です。対象としている本の数(ここでは3冊のBL本をターゲットにしているので「3」)を、該当の単語が出現している本の数で割った値のlogをとったものに1を足します。1を足しているのは、「log(3/3)」のような場合、値が0になってしまい、tf-idfを計算した際にtfの値によらず結果が0になってしまうためです。例えば、「idf(俺, 本1)」では「俺」は本1~3のすべてに出現しているので「log(3/3)」となり、「idf(看守, 本1)」では「看守」は本2、本3には出現していないのでlog(3/1)となります。

●BL本1のtf-idf値

単語 頻度 tf-idf
4 0.4
看守 3 0.44
言葉 3 0.3

tf-idfの値を見ると、出現頻度が高い「俺」よりも「看守」という単語のほうがBL本1を表現するのにふさわしい単語だということがわかります。これは頻度だけではわからなかった特徴です。

ここまでは非常に単純な計算なので、このままでは通常AIと呼ぶことはありませんが、これだけでもそれなりに面白い結果が得られそうですよね。

BL本ごとにtf-idf値の大きい単語を集めてレコメンド

BL本ごとにtf-idfの値が一定以上の単語を集めれば、それがそのBL本を表現する単語集、つまりその作品の「特徴」ということになります。この特徴を利用してレコメンドを行う場合によく使われるのは、特徴から本と本の類似度(ある本とある本がどの程度似ているか)を計算し、より似ている本を推薦する方法です。類似度の計算方法はいろいろあり、詳細は割愛しますが、有名な「コサイン類似度」と呼ばれる手法は検索エンジンなどにも使われています。

AIで何かをやろうとしたとき、真っ先にディープラーニングなどの機械学習の手法が浮かぶかもしれません。しかし、最初は今回取り上げたtf-idfくらい簡単な方法から試していき、それでも性能が芳しくない場合は機械学習の手法を用いると良いでしょう。AIでなくても(機械学習でなくても)、面白い結果が出ることが実は結構あるのです。

著者紹介


株式会社NTTドコモ
R&Dイノベーション本部 サービスイノベーション部
大西可奈子

2012年お茶の水女子大学大学院博士後期課程修了。博士(理学)。同年、NTTドコモに入社。2016年から国立研究開発法人 情報通信研究機構 研究員(出向)。2018年より現職。一貫して自然言語処理、特に対話に関する研究開発に従事。人工知能(主に対話技術)に関する講演や記事執筆も行う。
著書に『いちばんやさしいAI〈人工知能〉超入門』(マイナビ出版)。
twitter:@WHotChocolate