トピックタイトルの生成
生成したトピックをユーザーに提示するには、トピックがどういう内容であるかを説明する必要があります。トピックキーワードを羅列するだけではあまりにも不親切なため、それぞれのトピックにタイトルを付与します。
トピックタイトル生成の問題設定
複数記事のまとまりに対してタイトルをつけるというのは、自然言語処理分野の要約タスクの一種です。ただし、複数記事のタイトルや本文からきちんとしたタイトルを作ることは人間でも難しい問題です。これまでの自然言語処理での研究結果から、要約に重要となるのは記事のタイトルと本文1文目であることがわかっています(ただし、これはこれまでの自然言語処理の要約の対象として、ニュース記事を扱うことが多かったからでもあります)。この知見を活かし、本稿のトピックタイトル生成では記事のタイトルを利用します。
例えば、以下の5つの記事タイトルをもつトピックに対して、タイトルを作ることを考えます。
- スイスフラン、対ユーロで一時30%上昇 フラン上限廃止で | マネーニュース | 株式市場 | Reuters
- スイスフラン突然の大暴騰!取引が成立しない状況に - Togetterまとめ
- スイスフラン上限撤廃、通貨急騰で波紋 時計大手首脳が批判 :日本経済新聞
- 投資家に巨額の損失 スイスフラン急騰の打撃 日本のFX業者らにも (産経新聞) - Yahoo!ニュース
- スイス中銀がフラン上限撤廃・中銀預金金利一段のマイナス:識者はこうみる | Reuters
トピックタイトルはトピックの内容を表す情報が含まれている必要があるため、スイス、フラン、暴騰、急騰などのキーワードが重要な役割を果たしそうなことはわかります。では、これらのキーワードを並びかえればタイトルが生成できるかというとそう簡単な問題ではありません。というのは、単語の並び順の決定や、暴騰と急騰のような似たキーワードのどちらかを選択するというのは容易ではないためです。
ここでトピックの性質を考えます。生成されたトピックには以下の2つの特徴があります。
- トピックに含まれる記事は同じ話題である。
- 各記事のタイトルはある程度しっかりしている。
これらの性質から、トピックのいずれかの記事のタイトルがトピックタイトルとして成立することが多いと考えられます。そのため、トピックの記事の中から最もトピックタイトルとして正しそうな記事を選ぶという問題にすることができます。こうすることで、複数記事タイトルの要約という複雑な問題を回避して単一記事タイトルの要約という問題にできるとともに、キーワードの並び替えや類似キーワードの選択という問題を考えなくて済むようになります。ただし、記事のタイトルにはサイト名(Reuters、日本経済新聞)や記事固有の内容(「時計大手首脳が批判」「日本のFX業者らにも」)など、トピックタイトルとしては相応しくない箇所もあるため、記事タイトルの中からトピックに重要な箇所のみを利用します。
トピックタイトル生成の流れは、以下の通りです。
- 重要語抽出
- 重要記事タイトル選定
- 文圧縮によるトピックタイトル抽出
まず、トピックタイトル生成に重要となる語を抽出します。次に、トピックタイトル生成に利用する記事タイトルを重要語を用いて選択します。最後に、選択した記事タイトルから文圧縮をすることでトピックタイトルを抽出します。
重要語抽出
トピックタイトル生成に利用する重要語は、トピック生成時に利用したトピックキーワードとは異なるキーワード集合を利用します。本稿では例を示していませんが、記事の本文を対象として生成したトピックキーワードの場合、記事のタイトルにキーワードが含まれていないこともあり、トピックタイトル生成における重要語として利用できないことがあるためです。トピックの記事集合のタイトルを対象として、Significant Terms Aggregationを適用することにより重要語を生成します。
以下はスイスフラン急騰に関するトピックに関連する記事集合に対して、Significant Terms Aggregationを適用した例です。
{ "query": { "filtered": { "filter": { "bool": { "must": [ { "terms": { "id": [1,2,3,4,5,...] } } ] } } } }, "aggs": { "terms": { "significant_terms": { "field": "title", "size": 5 } } } }
{ "aggregations": { "top_terms": { "doc_count": 54, "buckets": [ { "key": "スイスフラン", "doc_count": 41, "score": 48563.83128718192, "bg_count": 748 }, { "key": "上限", "doc_count": 12, "score": 3124.1068471416525, "bg_count": 996 }, { "key": "流言", "doc_count": 1, "score": 2928.5160199882416, "bg_count": 7 }, { "key": "撤廃", "doc_count": 11, "score": 2681.64559916992, "bg_count": 975 }, { "key": "急騰", "doc_count": 15, "score": 1753.1434678758576, "bg_count": 2773 }, ] } } }
スイスフラン、上限、流言、撤廃、急騰という重要語が生成されています。しかし、流言のdoc_count
は1であり、これはトピックの記事中の1記事のみにしか現れていないことを示しています。つまり、流言はトピックを表す重要語ではなく、ある記事でたまたま使われた単語である可能性が高いと考えられます。
流言のような文書固有の単語を重要語として取得しないようにします。Significant Terms Aggregationにはmin_doc_count
という最小出現文書数を指定するオプションがあるため、これを利用してもいいですが、今回はトピック記事数と全体の記事数の割合(doc_count
/ bg_count
)を利用します。この割合が大きい場合、特定の記事集合にしか利用されていない単語と判断して、重要語として取得しません。これにより、流言以外のスイスフラン、上限、撤廃、急騰を重要語として抽出します。