More Like This Query を活用した類似記事集約 入門
はじめに
本記事では、ストックマークのプロダクトの実装で工夫している類似記事集約という技術について紹介します。本技術により、多くのドキュメントを扱う機会がある場合に、お客様に高い価値を提供できるようになります。
ストックマークでは社内のResearchチームと連携して、類似記事集約において実装面での工夫をいくつか積み重ねています。本記事ではまずイントロダクションとして、特にコアとなる OpenSearch の More Like This Query について紹介します。今後公開する別記事では、さらに発展的な類似記事集約の仕組みを紹介予定です。
さて、本記事で扱う主なトピックはこちらです。
- 類似記事集約がなぜ必要なのか?
- 類似記事集約の実装方法とロジック
- ストックマーク独自の工夫
- 過去記事を含む再適用
というわけで早速、本題に進みましょう!
類似記事集約がなぜ必要なのか?
ストックマークのプロダクトは、世の中で大量に生成されるニュース記事を情報源として活用しています。ニュース記事は、各種メディアサイトに掲載されるため、ほとんど同一の内容が同日の記事として載ることがあります。たとえば、次の図では自社のプレスリリースが複数メディアで取り上げられており、全て同一記事であると判定している例です。
仮に何の工夫もしないナイーブな状態で、ニュース記事をお客様に見せてしまうと、内容の重複する記事ばかりになってしまいます。そこで、類似の記事はまとめておいて、お客様には1つの記事を返すことでUXを向上できます。
どうやって実装しているのか?
類似記事集約は、技術的には一種の文書クラスタリングであり、様々な実装方法があります。
ストックマークでは類似記事集約実装のために、Amazon OpenSearch Service (以下、OpenSearch) を利用しています。OpenSearchは、Elasticsearch からフォークされており、Elasticsearchの More Like This Query の機能を活用できます。今回の類似記事集約では、まさにこの機能を実現方法の一部として活用しています。
More Like This Query のロジック
そもそも、ある文書Aと文書Bが同一であること(似ていること)をどのように判断すればいいのでしょうか?
OpenSearch Fork元の Elasticsearch の記事にて、tf-idf を活用していると説明があります。本記事ではtf-idfの詳細な説明はしませんが、簡単に言ってしまえば、
- ある単語が多く出現している
- ある単語、文書群の中で、多くの文書に出現するわけではない
という特徴を数値化して、積をとった数値になります。tf-idf のスコアが高い単語は、その文書の特徴を示している可能性が高いと解釈できます。
そこで、ある文書の特徴を示すtf-idfスコア上位k個を保持しておき、文書同士でそれらを比較することで類似度を計算できます。(詳細は Lucene の記事 をご覧ください)
類似度が高ければ同一の文書である可能性が高い、というわけです。ストックマークのプロダクトの類似記事集約では、まずこの機能を利用しています。
過去記事への再適用は大変…
Stockmarkでは独自のクローラーにより、記事を数年分に渡って収集しています。今回の類似記事集約においては、関連する一連のアルゴリズムを見直しもしているため、過去のデータに遡って適用する必要がありました。
過去記事の件数は数千万件を対象とするため、単にシーケンシャル かつ スケールしない構成で類似記事集約を実施してしまうと、処理に非常に時間がかかっていまします。
そこで、
- 適用プログラムの並列化
- レプリカシャードのスケールアップとスケールアウト
- More Like This Query のパラメータチューニング
を併用して実施しました。
まとめと記事予告(ストックマーク独自の工夫)
本記事では類似記事集約の方法について紹介しました。
ストックマークの類似記事集約は OpenSearch の More Like This Query のみで実現しているわけではありません。こちらを説明すると長くなりますので、独自の工夫については別記事で紹介予定です。
ストックマークでは、常により顧客価値の高い機能を実現するために、社内のResearchチームと連携して研究開発を進めています。もし本記事の内容や、研究・開発内容に興味があれば、ぜひカジュアルにお話しましょう!