Originality is all I want.

とある大学院生の雑多なブログ

TED トークの推薦システム

今回から TED トークの推薦システム というプロジェクトに取り組んでいきたいと思います。

まずは、スライドを使いながら、プロジェクトの全体像とその詳細について説明していきます。

プロジェクトの目的

f:id:sm_8612:20201023204135j:plain
プロジェクトの目的

このプロジェクトの目的は、ユーザーの興味・関心に基づいて、関連度の近い最適な TED トークを推薦するシステムの構築です。

推薦システムの内部では、深層学習モデルを用いることで、ユーザーの興味関心と過去の TED トークの関連度計算を自動で行うことを目指します。

プロジェクトの意義

f:id:sm_8612:20201023210520j:plain
プロジェクトの意義

TED トークは世界的にとても有名なスピーチカンファレンスなので、実際に視聴したことがあるんじゃないでしょうか。純粋に興味があって視聴する人もいれば、英語の勉強の題材として使う人もいるかと思います。

英語の勉強の場合だと、特に内容を選ぶ必要はないので問題ないかと思いますが、おもしろいスピーチや自分が興味ある内容のスピーチを聞きたい場合、数あるスピーチの中から探さなくてはいけません。

今は 3,500 件以上のスピーチがあるので、その中から探すのはとても大変ですよね。

もちろん、人気なスピーチから探すという方法もあります。

TED のサイトでは視聴回数ランキングがあるので、上位のスピーチを見るだけでもとてもおもしろいです。

ただ、視聴回数が多いからといって、自分が本当に見たいスピーチとは限らないですよね。

もしかすると、視聴回数はとても少ないけど、自分の興味とマッチするスピーチがあるかもしれません。

おもしろいと感じるスピーチは人それぞれなので、その人に合った最適なスピーチを提案することができれば、人気なスピーチに埋もれていたスピーチを発掘することができ、効率的に見たいスピーチを見るけることができるようになります。

システムの仕様

f:id:sm_8612:20201023204147j:plain
システムの仕様

推薦システムの多くは、同じ興味・関心がある人が見ている、他の記事や曲などを推薦しています。

ですが、これから作ろうとしているシステムは、TED トーク以外で興味・関心がある 何か を元に、TED トークを推薦することができます。

具体例としては、ブログ記事や音楽、本などです。基本的には、文字がある何かを想定しています。

ブログや本はタイトル・本文、曲は歌詞などをテキストとして抽出することができます。

ユーザーは、それらのテキスト情報をシステムに入力します。

入力を受けたシステムは、そのテキストと過去の TED のスピーチの関連度を計算し、関連度が高いスピーチをデータベースから抽出し、スピーチをユーザーに返すことによって、スピーチを推薦が行われます。

とてもシンプルなプロセスですが、テキストとスピーチの関連度の計算が技術的に重要なポイントになります。

手法

f:id:sm_8612:20201023204152j:plain
手法

では、実際にどうやってシステムを実現するのかについて、その手法についてです。

基本的には、以下の 3 つを行うことで TED トークの推薦システムを実現できると思います。

  • データ収集
  • スピーチのトピック予測
  • スピーチの定量

データ収集は、TED のサイトから必要なデータをクローリングという技術を使って自動収集します。

トピック予測は、ユーザーが入力したテキストのトピックを予測するために行います。

そして、関連度を計算するためには、スピーチを数字で表現する必要があるため、スピーチの定量化を行います。

それぞれのついて具体的に説明していきます。

データ収集

f:id:sm_8612:20201023204157j:plain
データ収集

データ収集では、手動で集めることもできますが、さすがに 3,500 件以上のスピーチから、内容やトピック、タイトルなどを抽出するのは骨が折れる作業なので、自動化します。

今回は、Python を使ってクローリングを行い、TED のサイトからトピックとスピーチをそれぞれ抽出していきます。

スピーチにトピックが割り当てられているので、全てのスピーチを抽出すれば、トピック一覧を作成することができますが、ここでは簡略化のために別のタスクとして考えます。

僕がクローリングを行うときは、HTML の構造をチェックしながら小さなコードを書いて、例外確認を繰り返してデータ抽出を行います。

同じサイト内にあるからといって、同じ HTML 構造で組まれているとは限りません。

例えば、TED トークの場合だと、スピーチの内容である Transcript があるスピーチと無いスピーチがあります。

なので、データがある前提でクローリングをするのではなく、もしなかったら という心構えでクローリングをすると、初歩的なエラーを回避することができるようになります。

今回のクローリングは、まずは トピック一覧 を抽出し、それぞれのトピックに含まれるスピーチを抽出することにしています。

実際にプログラムについては、後日説明したいと思います。

スピーチのトピック予測

f:id:sm_8612:20201023204202j:plain
スピーチのトピック予測

ここからは、機械学習を使った手法になります。

ニューラルネットワークは、人間の脳の構造をコンピュータ上にモデル化したものです。

まずは、機械学習の前に、人間がトピック予測をするときには、どのように行なっているのかについて考えてみます。

あるスピーチを聞いたときに、そのスピーチが Technology に関するスピーチなのか、Social change に関するスピーチなのか、それとも Africa に関するスピーチなのかを判断するときには、その内容から判断していますよね。

Technology の話だと、コンピュータや何かのシステムなどについてのワードが出てくるかもしれません。Social change の話だと、環境変化や、人種差別についてのワードが出てくるかもしれません。

では、コンピュータや人種差別についてまったく知らない人だとどうでしょうか?

極端な例ですが、言葉を覚え始めた赤ちゃんが TED トークのトピックを推測することは難しいですよね。

でも、高校生ぐらいになるとできるかもしれません。

それは、いろんな情報を得て、前提知識があるからです。

この原理をコンピュータに応用してみたのが機械学習です。

コンピュータも同じで、前提知識がなければ TED トークのトピックを予測することはできません。

そこで、ニューラルネットワークを使い、過去の TED トークを学習させて、あるトピックに関するスピーチの傾向を学習させようというわけです。

より多くの前提知識を与えるために、ニュース記事や Wikipedia などを使ってニューラルネットワークを事前学習させることもできますが、簡略化のために、このプロジェクトではそのようなことは行いません。

スピーチのトピック予測ができれば、ユーザーが入力するテキストのトピックを自動判別することができるようになります。

この自動判別は、ユーザーの興味関心に関する情報が含まれたテキストと、TED のスピーチの関連度を計算するときに必要になります。

スピーチの定量

f:id:sm_8612:20201023204207j:plain
スピーチの定量

次に、スピーチの定量化についてです。

人間は、テキストとスピーチの関連度を内容から判断することができますが、コンピュータは数値のみを処理するので、スピーチを定量化する必要があります。

定量化するためにはいろいろな方法がありますが、ここでは、AutoEncoder というニューラルネットワークを用いた定量化を行います。

AutoEncoder は、入力されたデータを生成するようにニューラルネットワークを学習させていきます。

その内部には、Encoder、Decoder がありますが、Encoder は、入力データを n 次元のベクトルに変換し、Decoder は、Encoder で変換されたベクトルを元に、入力データを出力します。

Encoder によって入力データを n 次元のベクトルに変換するということは、スピーチの情報をそのベクトルに圧縮することになります。

そのため、スピーチの定量表現はこのベクトルから得ることができるようになります。

関連度計算

f:id:sm_8612:20201023204212j:plain
関連度計算

ここまで説明したことを踏まえて、テキストとスピーチの関連度計算を行います。

ユーザーは、興味・関心のあるブログ記事のテキストを保持しています。

そのブログ記事にはトピックが与えられていないので、構築したトピック予測モデルにテキストを入力し、トピックを自動判別します。

次に、既存の TED トークとユーザーが保持するテキストと、自動判別されたトピックを AutoEncoder に入力し、それぞれを定量化します。

そこで得られた 2 つのベクトルの内積を求めることで、関連度を計算することができます。

ベクトルの内積によって、2 つのベクトルがどれだけ同じ向きを向いているかを計算することになるので、言い換えると、2 つの圧縮された情報がどれだけ似ているかを計算します。

計算の結果から、関連度が高いスピーチをユーザーに推薦することで、このプロジェクトは完成します。

最後に

ここまで説明してきて、そこそこのボリュームになるなあと思いましたが、勉強も兼ねて頑張っていきたいと思います。

また、説明した手法よりももっと良い方法があるかもしれませんが、新しい知識を得ることと、何かを作ることが一番のモチベーションなので、そこはご理解いただければと思います。

次回からは、今回説明した手法の詳細になるので、ソースコードがメインになります。

それでは、お楽しみに。