jekyllのsite.related_postsはデフォルトで最新の記事を返す件

このブログはjekyllを使って作っています。 各記事のページの下部に「Related Posts」として関連する記事へのリンクを載せています。 この関連する記事を取得するのに、jekyllが提供するsite.related_postsという変数を使っていました。

実は、この変数を使った結果、どう考えても関連する記事ではなく、最新記事が表示されていることに気づいてはいたのですが、 詳細を調べずに放置していました。

重い腰がようやく上がり調べることができたので、纏めておきます。


site.related_posts変数

jekyllの公式ドキュメント(Variables - Jekyll • Simple, blog-aware, static sites)で、次のように説明されていました。

If the page being processed is a Post, this contains a list of up to ten related Posts. By default, these are the ten most recent posts. For high quality but slow to compute results, run the jekyll command with the --lsi (latent semantic indexing) option. Also note GitHub Pages does not support the lsi option when generating sites.

つまり、デフォルトで最新の記事を10件返す、これは仕様です!!

そして、--lsiオプションを使えば、時間はかかるけど制度の高い結果が得られます、でもGithub Pagesではサポートしていません、とあります。

このブログは、Github Pagesでホスティングしているので、--lsiオプションは使えない、ということになります。

そこで、どうしたら本当にRelatedな記事が得られるか調べました。

タグから関連性を探す

Webを調べてみると、記事のタグと、他の記事のタグを比較して、同じタグを含む記事を関連のある記事として抽出するロジックを提案する人が多いようでした。

例えば、次のようなテンプレートを書けば実現できそうです。

{% raw %}
<div class="related">
  <h2>Related Posts</h2>
  <ul class="related-posts">
    {% assign max_related = 3 %}
    {% assign min_common_tags = 1 %}
    {% assign max_related_counter = 0 %}

    {% for post in site.posts %}
      {% assign same_tag_count = 0 %}
      {% for tag in post.tags %}
        {% if post.url != page.url %}
          {% if page.tags contains tag %}
            {% assign same_tag_count = same_tag_count | plus: 1 %}
          {% endif %}
        {% endif %}
      {% endfor %}

      {% if same_tag_count >= min_common_tags %}
        <li>
          <h3>
            <a href="{{ post.url }}">
              {{ post.title }}
              <small>{{ post.date | date_to_string }}</small>
            </a>
          </h3>
        </li>
        {% assign max_related_counter = max_related_counter | plus: 1 %}
        {% if max_related_counter >= max_related %}
          {% break %}
        {% endif %}
      {% endif %}
    {% endfor %}
  </ul>
</div>
{% endraw %}

プラグインを使う

プラグインもありました。

alfanick/jekyll-related-posts

このプラグインでは、TF-IDF(とLSI)のアルゴリズムを使って記事を特定するようです。

このブログでは、タグから関連性を抽出する方式で実現してみました。

するとどうでしょう、このページの下の方に、以前書いたjekyllに関する記事のリンクが表示されるようになったのですが、わかるでしょうか・・・


解決してよかった・・・