ZSL

Hugo 的相關文章演算法

Published:
Updated:

網路上找的到 Hugo 用戶怎麼設定相關文章,但是沒看過有人介紹他的相關文章是怎麼找的,於是本文簡介相關文章的核心邏輯,原始碼在 inverted_index.go,本文撰於 Hugo v0.152.2。

TLDR

簡單來說 Hugo 基本上只以 taxonomy 和 Date 作為判斷依據,如果啟用 fragments 功能的話還會把文章內文的標題拿來比較,並且 100% 完全相同的字串才會計分,大小寫也判斷為不同字串,除非啟用 toLower 設定。

info

「基本上」的意思是 Hugo 還考量其他資訊,但是由於要完全相同才會計分,那些資訊又不太可能相同或是文章建立的同時就確定了無法修改,因此才會說「基本上」。Hugo 額外考量的資訊請見 page.go#L264

處理方式

簡易說明原始碼的邏輯。

預處理階段:

  1. 先取出所有文章的關鍵字 (term)
  2. 每個 term 都標記上有哪些文章
  3. 移除太常見的關鍵字,因為沒有參考價值,可用 cardinalityThreshold 調整閥值

計算階段:

  1. 取出現在文章的所有關鍵字 (term),如果啟用 fragments 會額外取出文章內容的標題
  2. 查找剛才預處理的字典,取出目前文章所有 term,找到有哪些文章也使用這些 term
  3. 對這些 term 進行加權計分
  4. 計算結束後低於 threshold 的文章不會被列入相關文章中

取出所有 term、查找字典、對 term 加權計分這是三重迴圈,不過由於計算很簡單所以就算三重也不會拖累性能。

結論

這個演算法對我這種懶的認真想標籤的人不太有用,因為我的標籤是在 archetypes 裡面先寫好約 10 個然後每次寫新文章就刪掉不相關的標籤,因此很容易出現太常見的問題,不過如果要實現模糊字串匹配、語意理解也不實際就是了。