2012-04-24 68 views
0

我做了一個工作算法,但運行時間非常可怕。是的,我從一開始就知道它會很糟糕,但不是那麼多。只有200000條記錄,該程序運行超過一個小時。NLP - 提高運行時間並回收模糊字符串匹配

基本上就是我做的是:

for each searchfield in search fields 
    for each sample in samples 
     do a q-gram matching 
    if there are matches then return it 
    else 
     split the searchfield into uniwords 
     for each sample in samples 
      split sample into uniwords 
      for each uniword in samples 
       if the uniword is a known abbreviation 
        then search the dictionary for its full word or other known abbr 
       else do a jaro-winkler matching 
      average the distances of all the uniwords 
      if the average is above threshold then make it as a match and break 
     end for 
     if there is a match make a comment that it matched one of the samples partially 
    end else 
end for 

是的,這個代碼是非常循環高興。我正在使用蠻力,因爲召回非常重要。所以,我想知道如何讓它更快,因爲我不僅爲數百萬數據運行它200,000個數據,並且客戶端的計算機不是高端的(1GB-2GB的Ram Pentium 4或雙核,我測試這個程序的計算機是一個帶有4GB Ram的雙核)。我遇到TF/IDF,但我不知道這是否足夠。我想知道Google如何能夠實時搜索。

在此先感謝!

編輯: 此程序是一個數據過濾器。從200,000個虛擬數據(實際數據約爲12M)中,我必須過濾與樣本無關的數據(500個虛擬樣本,但我仍然不知道實際樣本量有多少)。

對於給定的虛擬數據和樣本,運行時間約爲1小時,但經過修改後,我已成功將其縮小到10-15分鐘。我通過將以相同字符開頭的字段和樣本(折扣特殊和非有意義的單詞,例如,a,an)進行分組,並將字段與具有相同第一個字符的樣本相匹配來減少它。我知道那裏有問題。如果該字段在第一個字符上拼寫錯了會怎麼樣?但我認爲這些數字可以忽略不計。樣本拼寫正確,因爲它始終保持不變。

+0

我不明白。你有200,000個項目(是'樣本'?),並且你輸入和搜索與輸入類似的項目?輸入項是相同的200,000項,還是輸入不同?搜索字段是什麼意思?這只是關於_similarity_搜索,還是存在_relevance_的概念(如在信息檢索中)? – jogojapan 2012-04-24 10:56:25

+0

200,000個項目(虛擬數據,實際數據約爲12M)是要搜索的項目,樣本只有500個。搜索項目可能與樣本不同。是的,這不僅僅是相似性,我還必須考慮搜索條目與樣本的相關性。事實上,我在這裏和那裏修改代碼,並將運行時間減少到10-15分鐘。 – MindSeeker 2012-04-25 00:49:15

回答

0

什麼是您的編程語言?我想用q = 2或3就足夠了。我還建議從單克到更高的學位。