從 30 分鐘無盡頭到 5 秒:SPV Pipeline 大規模文件相似度偵測

更新 發佈閱讀 7 分鐘

整理 Obsidian 筆記庫時,需要把 60 個新匯入的筆記跟現有 4,836 個檔案做相似度比對——找出內容相近(90% 以上)但可能檔名不同的筆記。

Claude 暴力做法:60 × 4,836 = 290,160 次 SequenceMatcher,每次都是 O(n²) 字元運算。實際跑起來風扇狂轉,等超過 30 分鐘還沒結果。

最後用三層過濾架構,把實際執行的 SequenceMatcher 降到 103 次,5 秒跑完。效能提升 99.96%

為什麼不用排序演算法?

找完全相同的文件,按檔案大小排序就夠了——大小相同的相鄰比對,O(n log n) 搞定,連 hash 都不需要。

但這次要找的是內容相近,不是完全相同。相近文件的特徵:

  • 不同檔名,但內容幾乎一樣
  • 加了 YAML frontmatter 或標題略有改動
  • 排版差異、空白行不同

這類情況兩個檔案大小可能差了幾十 bytes,排序演算法和 hash 都抓不到,卻有 95% 的內容相同。這才是需要特別處理的模糊地帶。

SPV Pipeline:三層過濾架構

命名為 SPV Pipeline,三個字母各對應一層:

  • S:Size Filter(大小過濾)
  • P:Position-sampled Fingerprint(固定位置指紋)
  • V:Verification(精確驗證,SequenceMatcher)

資料流向:

所有候選對 → [Layer 1: 大小過濾][Layer 2: 指紋過濾][Layer 3: SequenceMatcher]
290,160 ↓ 跳過 272,955 ↓ 跳過 17,042 ↓ 實際執行 103

每一層都是前一層的前置條件,候選集單調收縮:290,160 → 17,205 → 103 → 39 對相似文件。

Layer 1:大小過濾

內容相似的文件,清洗後的字元數應在彼此 ±20% 以內。一篇 100 字、另一篇 500 字,相似度不可能達到 90%。

規則很直白:若兩篇文件大小差異超過 20%,直接跳過,不做任何比對。

這一層直接跳過了 272,955 對,跳過率 94%,幾乎零計算成本。

Layer 2:固定位置指紋

對清洗後的文字,每隔 10 個字元取 1 個字元,組成固定位置指紋:

fingerprint = cleaned_text[::10]  # 每 10 個字取 1 個,位置固定

兩份指紋做逐位比對,若匹配率低於 80% 則跳過,不進入 SequenceMatcher。

為什麼固定位置而非隨機取樣? 隨機每次結果不同,無法預先建 index。固定步長確保同一文件永遠產生相同指紋,可快取、可 hash,適合大規模場景。

這層又跳過 17,042 對,通過 Layer 1 的部分跳過率 99%

Layer 3:SequenceMatcher 精確比對

Python 標準庫的 SequenceMatcher 找出兩段文字所有最長公共子序列區塊,計算相似度:

  • 90% 意味兩篇文章有 9 成的字元序列互相對應

前處理先去掉 frontmatter 和多餘空白,避免排版差異影響判斷:

def clean(text):
lines = text.splitlines()
if lines and lines[0].strip() == "---":
try:
end = lines.index("---", 1)
lines = lines[end+1:]
except ValueError:
pass
return " ".join(" ".join(lines).split()).lower()

實際執行:103 次(從 290,160 降至 103)。

實驗結果

  • 原始候選對:290,160
  • Layer 1 大小過濾後:17,205(跳過 272,955)
  • Layer 2 指紋過濾後:103(跳過 17,102)
  • Layer 3 最終相似對:39 pairs

39 個新檔被標記為相似(不同檔名、相同內容),全數移除。

閾值是可以調整的

90% 不是固定值,依需求調整:

  • 90%:抓出「幾乎一樣」的文件(本次使用值)
  • 70%:抓出「同一主題不同版本」
  • 50%:抓出「內容大量重疊」的文件

閾值越低找到的對越多,但誤判率也越高。

實作重點

# 一次性把所有文件讀入記憶體
vault = [(path, len(cleaned), cleaned, fingerprint(cleaned)) for ...]

for new_file in new_files:
for v_path, v_sz, v_clean, v_fp in vault:
# Layer 1
if size_diff > 0.20: continue
# Layer 2
if fp_similarity(fp_new, v_fp) < 0.80: continue
# Layer 3
s = SequenceMatcher(None, c_new, v_clean).ratio()
if s >= 0.90: report_similar()

記憶體策略:全部讀入、一次掃描。現代機器記憶體充裕,避免反覆 I/O 是正確取捨。

核心原則

最快的計算,是根本不做那次計算。

越早、越便宜的過濾放越前面;SequenceMatcher 是最貴的,放最後、用最少。排序演算法處理完全相同;SPV Pipeline 處理內容相近——兩者解決不同層級的問題。

SPV Pipeline 與學術界的 Filter-and-Verify 正規化一致,相關研究可參考 Broder (2000) 的 shingling 指紋演算法奠基之作,以及 Google Research 的 Web 規模實際系統(Manku et al., 2007)。

本文原載於 blog.stanwu.org,歡迎至原文閱讀完整版本與後續更新:
https://blog.stanwu.org/posts/spv-pipeline-near-duplicate-detection/


留言
avatar-img
Stan Wu
107會員
207內容數
Stan Wu 吳信典 減法是一種紀律,不是風格。 文字比較慢,也因此比較利於回看。 Blog 是文字輸出的主渠道,用來整理技術、經濟、生活、理財與實作筆記,讓思考能被慢慢讀回來。
Stan Wu的其他內容
2026/04/25
睡覺前把電鍋設定好,隔天早上起床就有熱騰騰的飯可以吃了。用 Claude Code 跑長時間任務也可以這樣——睡前設好 /loop,token 斷了它會一直等,reset 之後自己繼續,早上醒來結果已經在那裡了。
Thumbnail
2026/04/25
睡覺前把電鍋設定好,隔天早上起床就有熱騰騰的飯可以吃了。用 Claude Code 跑長時間任務也可以這樣——睡前設好 /loop,token 斷了它會一直等,reset 之後自己繼續,早上醒來結果已經在那裡了。
Thumbnail
2026/04/24
同樣一份規格文件,丟給五個不同的 AI 工具,讓它們各自從零實作一個 FastAPI 後端服務。結果差距大到出乎意料——從 95 分到 63 分,有的直接服務啟動即壞,有的則交出幾乎 production-ready 的程式碼。
Thumbnail
2026/04/24
同樣一份規格文件,丟給五個不同的 AI 工具,讓它們各自從零實作一個 FastAPI 後端服務。結果差距大到出乎意料——從 95 分到 63 分,有的直接服務啟動即壞,有的則交出幾乎 production-ready 的程式碼。
Thumbnail
2026/04/22
最近和一位印度工程師 R 的對話,表面上看是 Claude 使用方式的理解落差,但往深處看,真正浮現的不是工具操作問題,而是認知框架(mental model) 的差異。
Thumbnail
2026/04/22
最近和一位印度工程師 R 的對話,表面上看是 Claude 使用方式的理解落差,但往深處看,真正浮現的不是工具操作問題,而是認知框架(mental model) 的差異。
Thumbnail
看更多
你可能也想看
Thumbnail
ETF 不需要選時機、不需要盯盤,設定好定期定額它自己在工作。從開戶到下單,新手第一次買 ETF 的完整步驟,30 分鐘就能搞定。
Thumbnail
ETF 不需要選時機、不需要盯盤,設定好定期定額它自己在工作。從開戶到下單,新手第一次買 ETF 的完整步驟,30 分鐘就能搞定。
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
東村誠的網路寫作經驗,說明如何快速產出時事評論文章,關鍵在於善用社群媒體(Facebook、X、Threads、LINE)掌握議題,並利用Evernote等工具記錄靈感,再透過社群平臺測試及擴充,形成高效創作流程,最後強調推播管道的重要性。
Thumbnail
東村誠的網路寫作經驗,說明如何快速產出時事評論文章,關鍵在於善用社群媒體(Facebook、X、Threads、LINE)掌握議題,並利用Evernote等工具記錄靈感,再透過社群平臺測試及擴充,形成高效創作流程,最後強調推播管道的重要性。
Thumbnail
如果在一片平地上放上一塊木板,請你走在木板上到另一邊,我想你應該會用不屑的眼神看著我,然後跟我說:小意思。但如果今天是同一片木板,把場景換成兩棟大樓之間,這個時候你可能不會這麼篤定了吧?明明是同一片木板,行走能力也沒有變化的情況下,為什麼答案有了變化呢?
Thumbnail
如果在一片平地上放上一塊木板,請你走在木板上到另一邊,我想你應該會用不屑的眼神看著我,然後跟我說:小意思。但如果今天是同一片木板,把場景換成兩棟大樓之間,這個時候你可能不會這麼篤定了吧?明明是同一片木板,行走能力也沒有變化的情況下,為什麼答案有了變化呢?
Thumbnail
《原子目標:早上1分鐘,改變一整年!》書評:這本書幫助我養成好習慣,關鍵不在於訂下宏大的目標,而在於每天持續的「原子級行動」。透過微小的改變,例如每天一分鐘的自我對話、呼吸練習等,累積成就感,找回與自己的連結。推薦給容易設定宏大目標卻半途而廢的人,以及希望找回與自己連結的人。
Thumbnail
《原子目標:早上1分鐘,改變一整年!》書評:這本書幫助我養成好習慣,關鍵不在於訂下宏大的目標,而在於每天持續的「原子級行動」。透過微小的改變,例如每天一分鐘的自我對話、呼吸練習等,累積成就感,找回與自己的連結。推薦給容易設定宏大目標卻半途而廢的人,以及希望找回與自己連結的人。
Thumbnail
很多碩博士生每天花很多時間讀文獻,卻總覺得自己還停留在「吸收知識」的階段。 朱騏 在《復盤寫作術》中的 3 個觀點,搭配「每天 30 分鐘讀 Paper」的習慣,可以讓你更快從被動學習者,轉變為主動生產知識的研究者。 ▋智慧 1:把每日讀 Paper 的自省,變成你獨特的研究素材 “自己記錄的
Thumbnail
很多碩博士生每天花很多時間讀文獻,卻總覺得自己還停留在「吸收知識」的階段。 朱騏 在《復盤寫作術》中的 3 個觀點,搭配「每天 30 分鐘讀 Paper」的習慣,可以讓你更快從被動學習者,轉變為主動生產知識的研究者。 ▋智慧 1:把每日讀 Paper 的自省,變成你獨特的研究素材 “自己記錄的
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
本文以「口頭介紹是最誠實的摘要測試」為核心,提出三層濃縮訓練:3分鐘版本用來暴露思路漏洞,1分鐘版本逼出核心結構,30秒版本定義整份作品存在的理由。主張是:說清楚才算想清楚,文字可以掩蓋思路的漏洞,說話不行。每一次的濃縮,都同時訓練三件事:讀者意識、核心論點的辨識、以及冗餘的自我診斷。
Thumbnail
本文以「口頭介紹是最誠實的摘要測試」為核心,提出三層濃縮訓練:3分鐘版本用來暴露思路漏洞,1分鐘版本逼出核心結構,30秒版本定義整份作品存在的理由。主張是:說清楚才算想清楚,文字可以掩蓋思路的漏洞,說話不行。每一次的濃縮,都同時訓練三件事:讀者意識、核心論點的辨識、以及冗餘的自我診斷。
Thumbnail
理解大腦的運作方式,讓潛意識和意識合作,找到真正想做的事,自然取代滑手機習慣。 將目標從壓力圈退回本能和成長圈,並運用「捕捉好主意」和「邊做邊改」的策略,讓潛意識成為盟友,重新導向注意力,建立自信心,減少對手機的依賴。
Thumbnail
理解大腦的運作方式,讓潛意識和意識合作,找到真正想做的事,自然取代滑手機習慣。 將目標從壓力圈退回本能和成長圈,並運用「捕捉好主意」和「邊做邊改」的策略,讓潛意識成為盟友,重新導向注意力,建立自信心,減少對手機的依賴。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
Alright mate 學英文可以很享受,而不是很難受! 如何看影片學英文? 關於看影片學英文的流程,網路上有很多說法。 有人說先開中文字幕了解劇情,再開啟英文字幕去學習。 有的人說直接開英文字幕,然後去猜劇情的意思。 但作者用他的這套方法,讓他高三的時候,在沒什麼準備的情況下,第一次考多益就考了
Thumbnail
Alright mate 學英文可以很享受,而不是很難受! 如何看影片學英文? 關於看影片學英文的流程,網路上有很多說法。 有人說先開中文字幕了解劇情,再開啟英文字幕去學習。 有的人說直接開英文字幕,然後去猜劇情的意思。 但作者用他的這套方法,讓他高三的時候,在沒什麼準備的情況下,第一次考多益就考了
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News