2010-03-09 21 views
1

我需要一個包含有關文件信息的表和一個標識此文件中內容的值。文件類型主要是pdf,我有邏輯從文件中提取內容。生成一個標識字符串的值並查找重複/幾乎重複的值

現在我創建一個內容的哈希值並將其放置在表中。有了這個值,我能夠找到重複的文件。但是,客戶也希望識別幾乎相同的文件。例如,如果版權信息發生變化 - 或者其他一些小變化。這將會有一個人工檢查結果,所以我不需要100%的命中率。

我想到的第一件事就是製作一張包含50個最熱門詞彙的表格,並將它們與一個ID相關聯。比我可以使用這個,並在每個文件中做一個字數。結果將是一個像這樣的字符串(其中單詞1被擊中20次,單詞2 12次)「1:20-2:12 ......」

任何人都有更好的建議如何使一個可以識別幾乎相同的文件/字符串的值?

回答

1

您可以查看Levenshtein distance,它用於比較序列之間的相似性,這裏是C#中的sample implementation

+0

就我所見,Levenshtein距離只能比較兩個值?我必須爲大約70 000個文件生成一個值,然後比較這些值。 – Svendberg 2010-03-09 09:36:37

+0

'value'可以是文件的內容。因此,爲了比較兩個文件是否相同或「close」,您可以計算它們各自字符串內容之間的Levenshtein距離。越接近0,這些文件就越相同。 – 2010-03-09 09:39:36

+0

這絕對是一個解決方案,但缺點是我必須將所有文檔內容存儲在數據庫中。我希望我可以使用一個像散列或其他東西一樣短的值。但是,謝謝你的提示! :) – Svendberg 2010-03-09 09:56:06

0

我想到了兩個解決方案:
1.有許多diff工具可以比較文本,比如WinMerge,它也可以比較整個文件夾。您可以將pdf內容提取到文本文件,然後從程序內部調用該工具並計算差異數,這應該告訴您文件有多不同。
2.您可能正在計算md5或sha1散列,這些散列在輸入的小改動時會發生劇烈變化。嘗試找到(或創建)不會更改哈希值的算法。你可能有很多碰撞,但這應該很容易解決。

+0

解決方案2將是我正在尋找的。唯一的問題是我無法找到任何不會改變的散列算法。我在問題中提出的字數解決方案是一種創建「散列」的方法,但我認爲這不是最有效的方法。 – Svendberg 2010-03-09 10:01:59

+0

你知道文件之間的預期差異嗎?如果它們較小,則可以統計每個字符的換行符和出現次數,並比較結果。這是非常天真的解決方案,這可能會產生一些錯誤,但可能會足夠好,因爲你不需要明確的答案。並應該是微不足道的執行:) – ya23 2010-03-09 10:27:24

+0

我不知道有什麼不同之處,但我會帶着我看看計數換行符! :) – Svendberg 2010-03-09 11:45:32

相關問題