blog

DeNAのエンジニアが考えていることや、担当しているサービスについて情報発信しています

2022.11.18 インターンレポート

ライブ配信アプリ「Pococha」におけるコメントデータを用いた話題検知

by Naoki Nishikawa

#pococha #natural-language-processing #anomality-detection #online-algorithm #AI

1. はじめに

夏にAIスペシャリストコースのインターンシップに4週間参加させていただいた西川直輝と申します。普段は機械学習の理論研究をしています。

私は今回のインターンで、ライブ配信アプリ「Pococha」において、ライブの中でどんな内容が盛んに話されているかを抽出して「話題」としてユーザに提示し、さらにその話題に関連した話をしているライブの一覧を示す機能のための手法について調査・実装を行いました。結果として、話題となる単語を抽出するという意味で一定の成果が得られました。

この記事では、「Pococha」における話題を抽出するためにどんなデータを用い、どのような手法・工夫によって実現を試みたのかについて執筆します。

背景

ライブ配信アプリ「Pococha」では、ライブを誰が配信しているかではなく、どんな配信をしているかをライブ配信の内容から探すための機能として「話題タブ」と呼ばれるものが実装されています。

話題タブ

Pocochaには、ライブ配信の内容を一言で表す「タグ」という機能があり、ライブ中に、ライバーのファンの一部である「ファミリー」と呼ばれるリスナーたちが、ライブ配信に対してタグをつけることができます。

ライブ配信につけられるタグ

話題タブは、その目的に照らし合わせれば、ライブ配信の内容から新しく好きな配信者を見つけたりするのに有効であると考えられる一方、現状ではライブにつけられた新しいタグが次々に流れていく機能のみが実装されており、実態として話題を流すことができていません。

ライブ配信につけられるタグは、ファミリーたちが手動でつけるものなので、ライブの内容に即しているという保証はありません。 実際、 以下の「内容の無いタグの例」に示したように、ライブ配信の内容に関するものであるとは考えにくい単語が多く話題タブに表示されています。 また、実際にライブ配信を観察していると、内容の無いタグがひっきりなしにつけられ続けていることがあります。タグの内容に関わらず、常に新しいタグが話題タブに表示され続けるので、話題タブなどで上位に表示されることが目的で内容が無いタグを頻繁につけ続けていると考えられます。

  • 内容のあるタグの例
    • みんなの夕飯メニュー教えて?
    • 大阪大阪大阪大阪大阪大阪大阪
    • 競馬好き集まる枠🈁
  • 内容の無いタグの例
    • 🅱⭕❎🏖️🅱⭕❎🏖️🅱⭕❎🏖️🅱⭕❎🏖️
    • ミュートミュートミュート
    • 還元不要還元不要還元不要

また、Pococha には、「ぽこボックス」と呼ばれる、一定時間視聴をし、コメント投稿を繰り返すことで報酬が得られる機能があります。 上記に示したタグの例には「ボックス」という単語を含むものがありますが、 これらのタグは「ぽこボックス」目当ての視聴者を呼び込むためのものです。 他にも「ボックスで得たコインをライブ配信主に使用しなくてよい」という意味の「還元不要」や、「配信者とコミュニケーションを取らなくても良い」という意味の「ミュート」といった単語を含むタグも、このようなボックス訴求系のタグに該当します。 「ぽこボックス」目当ての視聴者を呼び込むことで視聴者数を増やすことができるので、ボックス訴求系のタグが話題タブに多く表示され、 話題タブの質低下につながっています。

話題タブの質を改善するための糸口として、 コメントなどのPocochaの豊富なテキストデータ が挙げられます。 これらのテキストデータから、今 Pococha のライブ配信でどんな内容が話されているかという情報、すなわち「話題」を抽出することで、 ユーザが好みの話題からライブを探すという、話題タブ機能の本来の目的を達成できると同時に、 現状ボックス訴求系のタグで溢れている「話題タブ」の質を改善することにつながると考えられます。

課題

前節で述べたようなコメントデータからの話題抽出にはいくつかの壁があります。 そのうち大きな2つが、Pocochaのテキストデータのノイズの多さと、 話題抽出のリアルタイム処理の必要性です。

課題1:Pocochaのテキストデータにおけるノイズの多さ

前節でも述べたとおり、Pocochaには「ぽこボックス」とよばれる機能があり、同じ配信を長時間視聴しつつ、一定時間おきにコメントを投稿することで、 報酬としてアイテム消費などに利用できるコインを得ることができます。 ただ視聴だけをしていても、一定時間おきにコメントを投稿しなければ、ぽこボックスを獲得することはできません。 一方で、そのコメントの内容はどんなものでもよいので、一部のリスナーはぽこボックスを得るために定期的に無意味なコメントを投稿することがあります。 このようなコメントのことをボックスコメント、通称、ボッコメといいます。

また、ボッコメではなくても、記号の羅列のみを含んだコメントや、絵文字を多く含んだコメントが多くあります。

テキストデータから話題を抽出しているようなサービスの先例としてTwitterなどが挙げられますが、 Pocochaのコメントは今述べたような理由から、ノイズに該当するようなテキストがより多いと考えることができます。

課題2:リアルタイム処理の必要性

2つめに、ライブで話されている内容の提示がリアルタイムである必要があることです。 話題を提示して、ユーザに現在進行中のライブに参加してもらう、という目的があることから、話題をリアルタイムで表示する必要があります。

現時点でユーザに提示する話題を生成するために、当然未来の情報を使うことはできないため、その分話題の抽出は難しくなります。 また、リアルタイムでの処理をするためには、話題の抽出を高速に行うアルゴリズムを考案する必要があります。

課題解決のための手法

以上のような課題を克服し、精度の高い話題抽出を行うことを今回の4週間のインターンの目標とし、その手法について調査・検討を行いました。

まず、1つめの課題であるノイズの多さに対処するため、Pocochaのコメントデータについて適切な前処理を施しました。この説明を2章で行います。

また、2つめの課題である、リアルタイムな話題抽出については、2つの手法を実装してその性能を観察しました。 1つめは、ライブ中のコメントをいくつかの文書にまとめた上で、文書のグルーピングを行うことでトピックの抽出を行う手法です。これについては3章で手法と実験結果を述べます。2つめは単語の出現頻度を時系列データとしてみなし、オンライン異常検知アルゴリズムを用いることでトレンドと言えるような単語を抽出してトピックとする手法です。この手法については、4章について説明します。

実装した手法の概観

2. 前処理

目的

コメントのテキストデータに対する前処理は、主に以下の2つの目的で行いました。

  1. 記号の削除単語への分解 といった言語処理の基本となる処理を行う
  2. ボッコメなどの意味の無いコメントを排除する

1点目については、記号や絵文字などのデータは自然言語処理の手法を適用する上で妨げとなること、文章全体の意味などを把握する上では単語ごとでの意味をとることが必要になることが理由として挙げられます。

2点目については、Pocochaにおいてボックスコメントが発生する構図が関係しています。

ボックスコメントが発生する背景にあるユーザとライバーの構図

上の図で示したように、Pocochaにおいては、各ユーザには応援しているライバーがいます。応援しているライバーのライブに対しては意味のあるコメントを投稿をし、コミュニケーションを取ろうとする傾向があります。このようなコメントは、いまPocochaのライブでどのようなことが話されているかを抽出する上で貴重なデータとなります。一方で、ユーザの中には、応援するライバーのライブで利用可能なアイテムに必要なコインを得るために、他のライバーのライブでボックスコメントを投稿する人たちがいます。これらのボックスコメントは無意味な内容、特にほとんど同じ文字列の連投であることが多く、今回の目的を達成する上で不要であるどころか、ノイズとなり得ます。したがって、このようなボックスコメントを取り除くことは後の処理の精度を上げる上で重要です。

上図の構造に注目すれば、コメントがボックスコメントであるかどうかを判定するには、「ユーザごと」ではなく「ユーザとライブのペアごと」に対して、投稿しているコメントが同じようなものばかりではないか、すなわち様々なコメントを投稿しているかどうかを観察すればいいことがわかります。 そこで、これらの無意味なコメントを除去できているかどうかの指標として、 ユーザとライブのペアに対する「コメントの多様性」を $$\frac{\text{コメントの種類数}}{\text{コメントの数}}$$ によって定義します。

前処理を行う前のコメントの多様性の分布を下図に示します。

コメントの多様性の分布

1に近いところと0.2〜0.4の範囲にそれぞれピークがあることがわかります。左側のピークに属するコメントは、ボックスコメントであると考えることができるため、前処理によってこれらを除去できれば望ましいと考えることができます。

手法

前処理として、大きく分けて2つの処理を行いました。

  1. 記号の削除など

    Pocochaのコメント中に現れる文字列は、極めてカジュアルなコミュニケーションの一部であるため、記号や絵文字、顔文字などが多く含まれています。まずは、これらを削除しました。

    (例)

    • (* ́ ꒳`人)アリガトウ (* ́ ꒳`人)オリゴトウ → アリガトウ オリゴトウ
    • +:•”:♡.•♬✧ → (全削除)
    • みんなおやすみ💕💕💕 → みんなおやすみ
  2. 単語等への分割 + 意味のない語やストップワードの削除

    単語への分割は形態素解析を用いて行うことができます。ただ短い単語に分割するだけではなく、高い頻度で連続して登場する単語を複合語として1語とみなすなどの工夫も行いました。また、得られた単語列に対し、名詞・動詞・形容詞以外の意味のない品詞の削除や、ボックスに関係していたり不適切であるなどの理由から排除すべき単語としてストップワードリストに登録した単語の削除を行いました。

    (例)

    • そっちモスバーガーをモスバ言わないの? → ‘其方’(名詞) + ‘モスバーガー’(名詞) + “モスバ”(名詞) + “言わない”(形容詞)
    • ボックスボックス失礼します → “失礼為る”(動詞)

観察

前処理の結果、コメントの多様性の分布は下図左から下図右に変化しました。 ボックスコメントの多くが除去されていることがわかります。

コメントの多様性の分布の変化

3. グルーピングによる手法

本節では、まずコメントをまとめた文書を類似トピック同士でグループ分けし、各グループに適切にラベルをつけることでトレンドの抽出と関連するライブの提示を行う手法とその結果について説明します。以下の手法は、文献[2]を参考にしたものです。

手法の概要

この手法ではまず、時系列順にコメントを取得し、ライブごとにコメントをためていって、20個溜まったらそれらを一つの文書としてみなして登録します。登録された文書は、ある基準に従って、今作られているグループと近いかどうか判定されます。近いグループが1つ以上ある場合は、それらのなかで最も近いものの中に文書を入れ、近いグループがない場合は、新たなグループをつくってそこに新しい文書を入れます。

あるグループと新たに作られた文書が近いかどうかは、
「グループに属する文書に現れる単語の頻度上位20個をまとめて文書とみなしたもの」
「新しく作られた文書全体」
のそれぞれに対して、文書ベクトルを定義し、そのコサイン類似度、すなわち内積を両者のノルムの積で割った値によって判定します。 $$ \text{コサイン類似度} =\frac{\mathbf{d_1}\cdot\mathbf{d_2}}{||\mathbf{d_1}||\hspace{1pt}||\mathbf{d_2}||} \hspace{10pt} (\mathbf{d_1}, \mathbf{d_2}\text{は2つの文書の文書ベクトル}) $$

文書ベクトルについて、もとの文献[2]では、tf-idfベクトルを用いる手法が提案されていました。しかし、1度実験を行った結果、同じものを表している2つの単語や片方がもう一方の部分文字列になっている2つの単語が違うグループに分類されてしまうという問題が生じました。そこで今回は、fastText[4]と呼ばれる、単語の部分文字列(subword)を考慮するという特徴を持つ学習済みの単語ベクトルを利用して、SWEM-concat[3]と呼ばれる、文書中に現れる単語のベクトル表現の平均とmax-poolingを結合する手法を用いて文書ベクトルを得ました。

文書ベクトルの計算方法

結果

以上の手法の性能を確認するため、実際のデータを用いて実験を行いました。 実験には7月7日のコメントデータを用いました。 この日のデータからは、七夕などに関連したグループが生成されることが期待されます。 Pocochaでは、「ぽこチャレ」と呼ばれるライバーとリスナーが力を合わせてミッションをクリアするイベントが開催されることがあり、 今年の七夕期間中には、七夕に関連した季節限定のぽこチャレが開催されました。 そのため、こういったイベントに関連した単語がグループをなしていれば望ましい結果であると言えます。

実験の結果、生成されたグループのうち、一部について、各グループ内で高い頻度で 現れていた単語のリストを以下に示します。各行が1つのグループを表しています。

1: ‘シンガーソングライター’, ‘居る’, ‘定期’, ‘ピアノ’, ‘弾く’, ‘ジブリ’, ‘中国語’, ‘歌’

2: ‘ゲーム’, ‘零’, ‘コメント’, ‘願い為る’, ‘マンション’, ‘越す’, ‘定期オカヤマ’, ‘在住’

3: ‘良い’, ‘数字’, ‘ゲーム’, ‘良い’, ‘投げる’, ‘ワハ大’, ‘言う’, ‘l’, ‘ジュリ’, ‘選択’

4: ‘ビタミン’, ‘意味’, ‘留年’, ‘言う’, ‘貴方’, ‘配信’, ‘イズ’, ‘1’, ‘為る’, ‘ライバー’

5: ‘見付ける’, ‘アリガトォ’, ‘フォロー’, ‘パルム’, ‘ユリ’, ‘ウクレレ’, ‘占い’, ‘茱萸’, ‘為る’, ‘行く’

1に示したように、生成されたグループの一部は、ある程度1つのトピックに関連していると解釈できる単語から構成されていました。

一方で、生成された多くのグループが、3, 4, 5に示したように、構成する単語の一覧を見ても、どのようなトピックで集まっているのかわからないようなものでした。

また、2のように、一部では、そのグループを構成する単語の一部を取り出せば1つのトピックに関連していると解釈できる一方で、全体では1つのトピックに関するものであるとは 考えにくいグループも見られました。

また、期待された七夕関連の単語によって構成されているグループは見られませんでした。

結果として、この手法では適切に話題の抽出を行ったグループを生成することはできていないと言えます。 原因としては以下の2点が考えられます。

  • 比較的カジュアルなコミュニケーションがなされるPocochaに現れる単語の類似度を、fastTextの学習済みモデルで測るのが難しかった。
  • Pocochaのチャット内で行われる会話の話題が多岐に渡り、1つのライブ内に現れる話題も短時間で切り替わるため、意味のあるグループに分けるのが難しかった。

Pocochaのチャットにおいてなされるコミュニケーションの特性から、グループに分けることで話題抽出を行うという手法が適切ではないことが今回の検証でわかりました。 また、膨大なデータを利用して行ったグルーピングに対しては、解釈を与えることが難しいため、結果の妥当性や、適当でないグループが生成された場合の改善が難しい結果となりました。

4. 単語の出現頻度に対する異常検知による手法

本節では、コメント中に現れる単語の頻度の分布を時系列データと考え、異常検知を行うことでトレンドとなる単語を抽出する手法とその結果について説明します。以下の手法は、文献[1]を参考にしたものです。

手法の概要

ある単語を含んだコメントは、膨大にあるコメントのなかにごく少数しかありません。したがって、各コメントの中に、ある単語が含まれるという事象が独立で、どのコメントについても同じ確率で現れると仮定すると、ポアソンの少数の法則により、ある単語を含んだコメントの総数はポアソン分布に従うと考えることができます。

コメントのデータを10分おきに$t_0, t_1, \ldots, t_n, \ldots$のように区切ります。$t_i$から$t_{i+1}$の間に現れる単語$w$を含むコメントの数を$c_i$とします。$c_i$が従う分布を平均を$\nu_i$とするポアソン分布であると仮定します。$\nu_i$としてはさまざまな選び方が考えられますが、今回は直近5回分の出現回数の平均としました。

下図に概形を書いたように、ポアソン分布は大きな値ほどその値を取る確率は小さくなっていきます。したがって、観測値がある一定の値よりも大きな値をとっている場合、それは異常値であるとみなすことができます。今回は、出現回数が分布の上位0.1%に属する場合、異常値、すなわちPococha全体における突発的な話題であるとみなすことにしました。

リアルタイム異常検知アルゴリズム

以上のような手法によって、直近3時間に異常が検知された単語を「話題を表す単語」として考えることにしました。

なお、Pococha全体の時間帯によるコメント数の増減にトレンド検知の結果が左右されることを防ぐため、各時間帯にコメント数を50000に規格化しました。

実験結果の観察と改善

実際に上記の異常検知アルゴリズムを用いて実験してみると、「話題を表す単語」、すなわち、出現頻度が急激に上昇してトレンドとして検知された単語の中に、以下のようにどのライブにも現れるような重要度の低い単語も含まれていました。

(例) ”love”、”足す”、”側”、”疲れ”、”貴方”、”フォロー”

このような単語は、Pocochaのライブにおいて話されている「話題」として適切ではありません。

このような「どのライブにも現れるような重要度の低い単語」が話題として抽出されてしまうという問題を解決するため、トレンド検知を行う前に、一定の基準に当てはまる単語を先に選択しておき、それらの単語に対してトレンド検知アルゴリズムを適用することを考えました。ここでは、idfと呼ばれる、「単語の珍しさ」を表す指標を計算し、これが高い単語のみを選ぶことで「どのライブにも現れるような重要度の低い単語」がトレンドとして検知されるのを回避することにしました。単語$w$に対するidfの値$\mathrm{idf}(w)$は次式で定義されます。 $$ \mathrm{idf}(w) = 1+\log\frac{\text{文書の総数}}{\text{ 単語 }w\text{ が現れる文書の数 }}$$ idf の閾値を8.0に設定して、これよりもidfが小さい、すなわち、どの文書にも現れるような珍しくない単語は除去することとしました。 idfの計算を直前(例えば適用するタイミングの直前の24時間)の単語に対して行い、オンラインに更新していくことなども考えられますが、直近のidfの値を用いてしまうと、その日に爆発的に登場回数が増加した単語のidfが低くなり、トレンドとみなせる重要な単語を除去してしまう可能性があります。そこで、現在のコメントに現れる単語の中から前日のidfを利用することで、長期的に重要度の低い単語を、トレンド検知の対象とする単語から除外することにしました。

さらに、トレンド検知を適用する単語について、idf以外にも、以下のような新たな条件を設け、より性能を高くすることを目指しました。

  • 出現回数が急激に増加しても、もともと登場回数が少ない場合はトレンドとは言えません。そのため、規格化後の出現回数について、直近1時間での出現回数が10回以上の場合のみ、トレンドとみなすことにしました。
  • 1つのライブだけで何度も登場する単語は、Pococha全体のトレンドとは言えないので、2つ以上のライブで登場している単語のみ、トレンドとみなすことにしました。

トレンドとなる単語に関連するライブの列挙

トレンドとなる単語を抽出したあと、そのトレンドに関連するライブを列挙する方法として、「話題を表す単語」として選ばれた単語が、コメントに登場している割合が多いライブ上位 10 個を表示することにしました。

結果

以上の手法の性能を確認するため、実際のデータを用いて実験を行いました。 実験には、7月17日のコメントデータを用いました。この日は世界陸上の開催期間中で、10:00, 11:50にサニブラウン・ハキーム選手が男子100m のそれぞれ準決勝、決勝に進出するなどの大きなニュースがあったため、これらに関する単語が話題として検知されることが期待されます。

特に、午前10時から午後11時までの結果について、以下では述べます。 トレンドとなる単語として、18226語が選択されました。これらの中には、アルファベット文字列のみからなる意味のない単語が含まれてしまっていたため、 これらを除くと、15838語が残りました。すべてを列挙することはできないため選ばれていた単語の概要についてまとめます。

  • 本設冒頭で述べたような世界陸上に関する単語が、期待通り、トレンドとなる単語として抽出されていました。具体的には「陸上」「サニブラウン」「100」「決勝」といった単語がトレンドとして認識されました。「サニブラウン」という単語に紐付けられたライブのコメントでのやり取りの例を示します。

    「サニブラウン、いよいよ。100m準決勝」「いま、スタートラインです」「3着かな!?どうかな?」「結果まちでーす」「10.05」「6位くらいかな?結果待ち」「出かけられないな😅」「パリ🇫🇷オリンピックでも、活躍してもろて🏅」「サニブラウン決勝進出確定!」「準決勝から、決勝までが短いね」

    「100m見てるサニブラウン」「決勝いけるかもマジで」「サニブラウン行けそう」「100のファイナリストはヤバい」

    1つのトピックについて意味のあるやり取りがなされており、それらを表す単語として「サニブラウン」という単語が抽出できていることがわかります。 実際、「陸上」という単語の7月7日から7月9日の出現頻度(水色の線)と、トレンドとして検知された点(青色の点)を可視化すると下図のようになり、正しく検知できています。

    「陸上」の出現頻度とトレンド検知点

    「サニブラウン」の出現頻度とトレンド検知点

  • 話題として検知された単語で、他に特徴的なものとしては、「連休」という単語が挙げられます。7/16, 17, 18は、祝日の海の日を含んだ連休であるため、一見妥当ですが、この単語と紐付けられたライブでのコメントは以下のようなものでした。

    1: 「🎹連休は2部制!〇朝9時~17日(日)〇朝9時~18日(月㊗️)〇朝9時~からです」

    2: 「たのしい連休〜」「私連休な〜い」「連休、あ、そうだったw」「やすみないから、連休わすれてた」

    1つめは、同一ライブ内でほぼ同様のコメントが一定の間隔で投稿されており、ライバーもしくはライバーの根強いファンによって、ライブについての説明を与えるために定期的に投稿しているコメントであることがわかります。定期的に投稿されているため登場回数は多くなりますが、話題としては適切でないことがわかります。2つめは会話として成立しているコメントのやり取りの中で現れているコメントですが、それぞれ単発で登場しており、ライバーの発言などに反応して投稿されたに過ぎず、「話題」というほどではない内容でした。このように、「連休」という単語は、Pocochaにおける話題として提示するのは適切ではないことがわかります。

  • トレンドとなる単語として選ばれた18226語の中には、「答える」「時代」「部分」などといった比較的一般的な名詞が依然として残っていたほか、「アクセサリー」「ペットショップ」など、たまたま同じ時間帯に複数ライブで登場したが、話題と言えるほどの単語ではないものが多く含まれていました。したがって、

    • より精度の高い前処理を行うことで不要な単語を予め除外する
    • 抽出する単語に課す条件について、異なる種類の条件を課したり、閾値を変えたりすることによって(話題となる単語を排除しないようにしながら)より強くする

    などの追加の工夫が必要があることがわかりました。

以上のように、実際に起こったニュースなどと照らし合わせて妥当なトレンドとなる単語が得られている一方、意味の無いアルファベット列や、話題として提示するのは適切でない単語が選ばれてしまっているという点で、課題の残る結果となりました。

5. まとめ

今回、私のインターンでは、リアムタイムで最新のタグを表示している話題タブの現状を改良するための手法として、コメントのデータから話題を抽出し、タグとして表示した上で、ユーザに関連ライブを提示する手法を検討し、実装しました。

話題となる単語を抽出するという意味では一定の成果が得られましたが、 不要な語が選択されたり、選択された語が「話題」と言えるほどではない といった問題点があることがわかりました。

今後の展望として、

  • より高い精度で不要な語を取り除くアルゴリズムの開発
  • 出現回数が多いだけではなく、1つのライブの中で長く会話が続いているような、より「話題」といえるような単語の抽出
  • トレンド抽出に関する定量的評価指標の考案
  • トレンドとして抽出された単語を同一トピックについてまとめる手法の考案

などが挙げられます。

参考文献

[1] Scott Hendrickson, Jeff Kolb, Brian Lehman, and Joshua Montague. “Trend detection in social data.” Twitter Blog (2015).

[2] Swit Phuvipadawat, and Tsuyoshi Murata. “Breaking news detection and tracking in Twitter.” International Conference on Web Intelligence and Intelligent Agent Technology. Vol. 3. IEEE, 2010.

[3] Dinghan Shen, Guoyin Wang, Wenlin Wang, Martin Renqiang Min, Qinliang Su, Yizhe Zhang, Chunyuan Li, Ricardo Henao, and Lawrence Carin. “Baseline Needs More Love: On Simple Word-Embedding-Based Models and Associated Pooling Mechanisms. " 56th Annual MEEting of the Association for Computational Linguistics, 2018.

[4] fastText: https://fasttext.cc/

最後まで読んでいただき、ありがとうございます!
この記事をシェアしていただける方はこちらからお願いします。

recruit

DeNAでは、失敗を恐れず常に挑戦し続けるエンジニアを募集しています。