我做了一個工作算法,但運行時間非常可怕。是的,我從一開始就知道它會很糟糕,但不是那麼多。只有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)進行分組,並將字段與具有相同第一個字符的樣本相匹配來減少它。我知道那裏有問題。如果該字段在第一個字符上拼寫錯了會怎麼樣?但我認爲這些數字可以忽略不計。樣本拼寫正確,因爲它始終保持不變。
我不明白。你有200,000個項目(是'樣本'?),並且你輸入和搜索與輸入類似的項目?輸入項是相同的200,000項,還是輸入不同?搜索字段是什麼意思?這只是關於_similarity_搜索,還是存在_relevance_的概念(如在信息檢索中)? – jogojapan 2012-04-24 10:56:25
200,000個項目(虛擬數據,實際數據約爲12M)是要搜索的項目,樣本只有500個。搜索項目可能與樣本不同。是的,這不僅僅是相似性,我還必須考慮搜索條目與樣本的相關性。事實上,我在這裏和那裏修改代碼,並將運行時間減少到10-15分鐘。 – MindSeeker 2012-04-25 00:49:15