はてなブログ関連記事アルゴリズムの研究

はじめに

こんにちは。estieでデータサイエンスをしている齊藤です。この記事はestie真夏のアドベントカレンダーの記事です。

8/10はヤドンの日なので、去年同様ヤドン好きな私が記事を書いています。estieに在籍する限り毎年ヤドンの日を祝う記事を書きたいです。

高松空港でのイベントにて 著者撮影

さて、( ? ) はてなブログには下部に「関連記事」機能があります。

estieのさまざまな記事にこのヤドン記事を関連づけたいです。

どういう記事を書けば関連記事にたくさん選ばれるのでしょうか?解剖していきたいと思います。

関連記事グラフ

関連記事のトップに出てくる記事を辿ることで、連結グラフができます。グラフを眺めてみましょう。

はてな製関連記事

https://johntronik.github.io/blog_20230810/graph.html ← グラフを出力してあるので、触って拡大したり遊んでみることができます。

いくつかのハブになる記事があり、またいくつかのクラスタを形成しています。

集中的にリンクされているブログを見てみましょう。

Whole Product 構想ブログと、 575検知連作記事の最後の記事(!)へものすごい数のリンク(それぞれ17本)が飛んでいます。こういう、たくさんのブログにリンクされるようなブログを再現するのが目標です。

文章の関連度

記事下に「関連記事」を表示します - はてなブログ開発ブログ

記事下の関連記事では、本文の内容から類似するとみられる記事を選出しています。

はてなブログ開発ブログ(名前が好き)を読むと、本文の内容から関連記事を作成しているそうです。

こちらでも本文の内容から類似度を計算することで、検証してみましょう。

OpenAIがembeddings APIを提供しているので、ベンチマークとしてこれを使ってみます。

import openai
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

def get_embedding(text, model="text-embedding-ada-002"):
   # https://platform.openai.com/docs/guides/embeddings/use-cases
   text = text.replace("\n", " ")
   return openai.Embedding.create(input = [text], model=model)['data'][0]['embedding']

def get_similar_item(embeddings):
    emb_array = np.array(embeddings)
    sim_array = cosine_similarity(emb_array, emb_array)
    sim_array[range(len(sim_array)), range(len(sim_array))] = 0 # 自身は除く
    return np.argmax(sim_array, axis=1)

blogs = ['はじめに\nこんにちは。estieの~', ...]
embeddings = [get_embedding(blog_text) for blog_text in blogs]
reccomends = get_similar_item(embeddings)

embeddingsとは、簡単に言えば文章をベクトル化することで、文章同士の関連度や演算を可能にする技術です。

本筋から離れるので詳しく解説しませんが、例えば Document Embedding Techniques大規模言語モデル入門 などで紹介されています。

ベンチマークグラフ

https://johntronik.github.io/blog_20230810/graph_gpt.html

文章類似度だけでみたベンチマークはばらばらとしています。ベンチマークの方はペアがいくつかあってかわいいですね。

前の章で確認した、たくさんの関連記事に登場する2つのブログは全くリンクされていませんでした。グラフの形もかなり異なるようです。既存のブログに似ている文章を書けばリンクされる、というわけではないようです。(注:正確には、OpenAIのembeddings空間で近い記事を書いたとしても)

アクセス数での重み

再掲

記事下に「関連記事」を表示します - はてなブログ開発ブログ

条件(それぞれのブログで相応のアクセスがあるなど)によって一部に「関連記事」を表示しています。

アクセス数が関連記事に表示される一つの条件であるようです。はてな製関連記事のグラフに、アクセス数で重みをつけてみましょう。

アクセス数に応じてノードを大きくしてみました。よく見られた記事だからといって、よく関連記事されるわけではないようです。

記事内での言及

文章中で言及されているブログが多いと、関連記事に現れるかもしれません。

被リンク数

該当記事に対して文章中で言及した記事の数と、関連記事ランクの関係です。(r=0.01)

#

タイトル

被リンク数

関連記事ランク

0

estieが追い求める「Whole Product構想」-マルチプロダクト戦略から1年後の今-

8

#13

1

estieをワールドクラスの会社にする覚悟

3

#40

2

「Whole Product構想」の中心をなすデータと技術的なチャレンジ

2

#1

3

強い組織づくりにむけて - ダブルVPoE青木体制へ

2

#5

4

これからも挑戦を続けたい ~不動産テック企業に入社してみた~

2

#40

リンク数

該当記事が、文章中で言及した記事の数と、関連記事ランクの関係です。(r=0.41)

#

タイトル

リンク数

関連記事ランク

0

「Whole Product構想」の中心をなすデータと技術的なチャレンジ

7

#1

1

AWS Lambdaはプログラム全体ではなく、ハンドラの関数を実行する

3

#1

2

強い組織づくりにむけて - ダブルVPoE青木体制へ

3

#5

3

全力余生

3

#40

4

ゆれるデザインエンジニアの輪郭

3

#40

文章中に同じブログ内でのリンクが多いと、関連記事に表示されやすいようです。

はてなは、リンクの多いまとめ記事へ誘導することでより多くのアクセス数を生むと考えているのかもしれません。

まとめ

ということで、この記事ではestieのブログへたくさんリンクを貼ってみました。

しばらくしてこの記事が関連記事として多く表示されれば、仮説は実証されたことになります。

ぜひ定期的監視していただけたらと思います。

© 2019- estie, inc.