このブログはjekyllを使って作っています。
各記事のページの下部に「Related Posts」として関連する記事へのリンクを載せています。
この関連する記事を取得するのに、jekyllが提供する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 %}
プラグインもありました。
このプラグインでは、TF-IDF(とLSI)のアルゴリズムを使って記事を特定するようです。
このブログでは、タグから関連性を抽出する方式で実現してみました。
するとどうでしょう、このページの下の方に、以前書いたjekyllに関する記事のリンクが表示されるようになったのですが、わかるでしょうか・・・
解決してよかった・・・