回明忠大大: 文章內容可能是Word檔, 網頁, PDF, 純文字檔, eMail..... 都有可能! 但我都會分別先處理成pure text 才丟進去比對, 所以來源不造成效能影響. ^_^
更正: 剛才分析了一下, 真正要輸入比對的文章, 平均大約在25000~27000 字上下; 在我的Dothan 上面每秒比對數目下降至9篇不到...... (哭泣中....)
回明忠大大: no, 直接用二篇裡面的相同字數, 除以二篇字數和.
回明忠大大: 是的, 若如您所說, B文的十個字是在A文的一百字內, 則相似率為10/110 = 9.1% 這個問題在小弟目前的這項應用上, 尚屬可接受.
回Diamond大大: 小弟這個問題是已經寫出一個函數來算出相似度, 所以應該還沒有到NP-complete 那麼難; 只是因為字串長度驚人, 且數量龐大, 所以用正常的暴力法來比對的話, 每篇文章要存入前得耗用六兆次的迴圈. 各位前輩經驗豐富, 小弟想請教是否有較好的演算法, 或是有高效的函式庫? KMP 和Boyer Moore 我去看過, 主要偏向用來在A字串裡面找尋B字串的位置, 有一點不同.
回WJS大大: 是的! 我知道聽起來很不合理, 至少在數學上不應如此; 但是在實際的應用上還OK, 因為上萬字的文章裡, 要出現用字相同, 內容全異的機會不大; 至少這樣的機率和風險, 經評估後還可以承擔.
回Diamond大大: 您所說的 "不為人知" 的用意, 其實還好, 只是一個工程研發的Knowledge-Base. 文章內容..... 嗯..... 要找一個共通的關鍵字可能不容易.....
To WJS大大: 是的, 目前只考慮中文字, 英文還需要斷字, 會更麻煩一點.
To 明忠大大: 是的! 這樣可以讓實際比對的迴圈數少掉45%~60%, 因為有許多常用字, 而小弟目前正是這樣做. 但是多了這個Replace的function所花的時間, 卻又多花掉大約25~30% 造成整體省下的時間效益只有一半不到.
To 明忠大大: Replace的方法我也試過好幾種, 看看能不能再提升一點速度: 1. 用VB內建的Repalce(string1, string2) 2. 用VB.NET 字串物件的 .Replace() 方法 3. 呼叫 strcpy, strcat 的字串處理API 結果速度差異不大; 目前一篇26000字的文章, 光是replace 100次就要花去2.5~2.8秒. 這個迴圈的code 我放在這裡: http://tw.knowledge.yahoo.com/question/?qid=1306062010003
novus大大提的作法愈來愈接近我要問的東西了: 用一個完全不同的演算模式來計算不同字串之間的相似程度. 但是我有一個問題: 即使先用一個欄位把一萬篇文章的s2值事先存下, 要計算s3的時候也是要把x的內容和一萬個既有的A串接, 然後即時作壓縮才能得到s3, 不是嗎? 這樣假使realtime壓縮一篇x+A的時間要花0.1秒, 那一秒鐘的比對數目還是不到十篇, 效能看來並不樂觀 (因為還要串接及其他程序的時間) 還是其實用zip壓一篇二萬字的文章不用0.1秒? 我們估得太慢?
To Diamond 大大: 很感謝各位都對小弟這個難題竭心盡智, 真是各方好漢精銳盡出. 不過如果還要額外的maintain人力來做分類的話, 可能還有些困難需要排除. 目前方向是希望花這一次的effort, 後續就儘量不要再麻煩. ^_^
小弟在此感謝各位大大共襄盛舉,能集各路英雄好漢至此討論,小弟感到相當榮幸 各位所提到的方向,讓小弟受益不少 相信這二天來這版腦力激盪下,各位也應該從其他人身上得到許多靈感 明忠大大的做法和小弟大同小異,讓人一目瞭然 Diamond大大的方向應該是將來如果資料量到達一定水準時,必走的方向 novus大大提到系統化方式給了WJS和小弟很大的靈感,並且還能藉重發展多年高效能的zip壓縮演算法 最後WJS大大將字元數目簡化的做法,則是給了小弟臨門一腳的關鍵
simon最後用的方式是: 開一個65535的integer(),用來代表unicode二個byte的table,分別把A字串和B字串各掃過一次,並將每一字對應字碼填入integer(),每填入一次就計數加一. 最後再用另一個陣列來統計字元出現的次數. 在我的NB 上面,用"原來我不帥" 和"星座搏感情"比對一百次,只花了0.4 秒不到! 實際套到資料庫去,每秒可以比到四百多篇上下. sample code在這裡,小弟不敢藏私,僅供各位參考. http://*****/jxydg
這次答案小弟不想交付投票,因為我想來投票的網友程度,能區分各位大大的功力的可能不會太多 小弟在此僅以對自己幫助最大的答案來選,對其他大大還是致上十二萬分的謝意