はじめに
こんにちは。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 | 8 | #13 | |
1 | 3 | #40 | |
2 | 2 | #1 | |
3 | 2 | #5 | |
4 | 2 | #40 |
リンク数
該当記事が、文章中で言及した記事の数と、関連記事ランクの関係です。(r=0.41)
# | タイトル | リンク数 | 関連記事ランク |
---|---|---|---|
0 | 7 | #1 | |
1 | 3 | #1 | |
2 | 3 | #5 | |
3 | 3 | #40 | |
4 | 3 | #40 |
文章中に同じブログ内でのリンクが多いと、関連記事に表示されやすいようです。
はてなは、リンクの多いまとめ記事へ誘導することでより多くのアクセス数を生むと考えているのかもしれません。
まとめ
ということで、この記事ではestieのブログへたくさんのリンクを貼ってみました。
しばらくしてこの記事が関連記事として多く表示されれば、仮説は実証されたことになります。