很久沒有認真寫博客了,乘最近有空,于是想寫寫專案總結,只分享思路,沒有具體代碼,因為代碼實在又長又臭,很多都是互相配合,單獨分享某些代碼完全沒啥用的,所以分享一下思路,希望對有類似需求的同學能有所啟發就行了,
專案背景與需求:
年前承接了一個小專案,客戶是一個文庫網站的運營方,資料量已有一百多萬了,為了合規化經營,網站運營方需要每天由人工審核用戶發布的檔案,但在運營程序中發現用戶會不斷重復上傳已存在的檔案(一般標題會不同,無法通過只分析標題判斷),這個比例還不少,不僅僅造成網站內容重復,還增加了不少的審核成本,于是想到能否通過技術的方式查重,把重復度過高的內容直接過濾掉,這樣就節省了大量的人工審核成本,
溝通解決方案:
為了兼顧運行效率和開發成本,因為預算有限,經過溝通,初步確定了這樣一個簡化處理方案:
1,客戶網站已有搭建基于全文檢索技術的站內搜索系統,這個平臺可以加以利用,
于是查重第一步確定為:由于查重不可能每篇文章與上百萬文章做比對,這樣效率太低了,根本無法使用,考慮到現有基于Lucene的站內搜索,搜索效率比較高,通過站內搜索初步篩出重復度高的前N個檔案,實作方式就是每一句話去搜索一次,然后得到一個匹配度由高到低的檔案集合,為下一步做精確比對做準備,
2,通過分析研究,發現用戶上傳的大部分的檔案,通過分析檔案的前300字左右的重復度大致就可以認定是否重復,計算出重復率了,
通過第一步分析最相關的檔案集合,每個檔案的前300個字與目標檔案的前300個字,分表建立字表,然后兩個字表做相似度計算,用百分比顯示相似百分比,便于審核時使用,
實作程序遇到的問題與解決思路:
1,通過站內搜索結果篩選目標集合,如何計算重復率的高低?
解決思路:基于Lucene的站內搜索,搜索結果會回傳一個相關度的值,這個值的高低可以簡單地理解為與這個關鍵詞(這里是一個句子)的匹配度(為什么說可以簡單理解為,而不能完全等同,后面會解說),建立一個鍵值對<檔案ID,相關度總和>,每一次搜索結果,把這個相關度值新增或累加到這個鍵值對,排序后,就能從一百萬多檔案里找出疑似重復率最高的10個檔案了,
存在問題:這種方法有可能會出現,相關度高的未必是文字重復率高的,長句子出現概率不高,但特別是一些短的句子,偏差特別大,所以實作程序中,由當初設計的一句一句去搜索,改為固定的每次30個字去搜索,如果只分析300個字,那判斷一篇檔案,剛好需搜索10次,
2,為什么不直接使用搜索相關度來計算重復率,再次通過建立字表,分析重復率,不是多此一舉嗎?
簡單的說,搜索的基礎理論是基于tf/idf,簡單地說,個別字詞的重復會影響最終的相關度的計算,相關度高有一定比例的重復是必然的,但不代表一定是重復率最高的,反之亦然,所以通過字表來進一步分析重復率更加準確,當然我們最早是通過建立詞表來分析,因為比較的樣本不大(只有300個字),發現分詞的準確率對分析結果影響比較大,反而使用字表更加簡單,效率更高,準確率反而更加理想,所以說,沒有實踐就沒有發言權,理論可以指導行動,但最后效果好壞是判斷理論是否好用的唯一標準啊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260247.html
標籤:其他
上一篇:求一個vivado2019.2 能用rapidIO 4.1的 License~~~ 謝謝
下一篇:pod的資料持久化2 NFS
