Hugo 的相關文章演算法
Published:Updated:
網路上找的到 Hugo 用戶怎麼設定相關文章,但是沒看過有人介紹他的相關文章是怎麼找的,於是本文簡介相關文章的核心邏輯,原始碼在 inverted_index.go,本文撰於 Hugo v0.152.2。
TLDR
簡單來說 Hugo 基本上只以 taxonomy 和 Date 作為判斷依據,如果啟用 fragments 功能的話還會把文章內文的標題拿來比較,並且 100% 完全相同的字串才會計分,大小寫也判斷為不同字串,除非啟用 toLower 設定。
info
「基本上」的意思是 Hugo 還考量其他資訊,但是由於要完全相同才會計分,那些資訊又不太可能相同或是文章建立的同時就確定了無法修改,因此才會說「基本上」。Hugo 額外考量的資訊請見 page.go#L264。
處理方式
簡易說明原始碼的邏輯。
預處理階段:
- 先取出所有文章的關鍵字 (term)
- 每個 term 都標記上有哪些文章
- 移除太常見的關鍵字,因為沒有參考價值,可用
cardinalityThreshold調整閥值
計算階段:
- 取出現在文章的所有關鍵字 (term),如果啟用
fragments會額外取出文章內容的標題 - 查找剛才預處理的字典,取出目前文章所有 term,找到有哪些文章也使用這些 term
- 對這些 term 進行加權計分
- 計算結束後低於
threshold的文章不會被列入相關文章中
取出所有 term、查找字典、對 term 加權計分這是三重迴圈,不過由於計算很簡單所以就算三重也不會拖累性能。
結論
這個演算法對我這種懶的認真想標籤的人不太有用,因為我的標籤是在 archetypes 裡面先寫好約 10 個然後每次寫新文章就刪掉不相關的標籤,因此很容易出現太常見的問題,不過如果要實現模糊字串匹配、語意理解也不實際就是了。