2011-08-27 118 views
4

我在使用Python的Web應用程序中實現tf-idf算法,但運行速度非常慢。我基本上做的是:Python和tfidf算法,讓它更快?

1)創建2點字典:

  • 第一部字典:關鍵(文檔ID),值的所有找到的單詞(包括重複(名單)在DOC)
  • 二字典;鍵(文檔ID),值(設置包含文檔的唯一字)

現在,有一個用戶獲得文檔d的tfidf結果的請願書。我要做的就是:

2)循環在第二字典文件d唯一字,併爲每個獨特的單詞w得到:

2.1)TF得分(多少次出現W在d:循環遍歷文檔的第一個字典的單詞列表)

2.2)df分數(多少個文檔包含w:遍歷所有文檔的單詞集合(第二個字典)並檢查是否包含w) 。我正在使用一個集合,因爲它似乎更快地檢查一個集合是否包含與列表相比較的單詞。

步驟2.2非常緩慢。例如,具有1000個文檔,並且對於具有2313個獨特單詞的文檔,輸出結果大約需要5分鐘。

有沒有其他方法可以讓步驟2.2更快?字典的迭代速度很慢嗎?

+0

你應該對它進行配置以確保在哪裏花費時間。然後將這部分代碼作爲一個小型自包含工作示例發佈。 –

+1

我們不是心靈的;除非您發佈了代碼,否則我們無法告訴您代碼有什麼問題。 –

+0

@ Tom謝謝,我已經知道哪個是最耗時的部分 –

回答

5

那麼,你不得不重新思考和重新設計,不知爲何,你把你的數據,或者換句話說,實現您的「倒排索引」的「正統」版本的方式。

您的瓶頸是條款文檔頻率(DF)的「即時」計算。這是一個聰明的想法,因爲這是動態的,所以每次更新語料庫(文檔集合)時,都要進行一些處理並更新文檔中每個詞的DF(當然,以一種持久的方式保存結果,又名數據庫等)。

你唯一需要的結構是一個嵌套的字典一樣,

{ "term1" : { "DF" : x, "some_doc_id" : tf , "some_other_doc_id" : tf, etc } , 
    "term2" : ... 
    etc.. 
} 

正確更新每次你「喂」你的文集的時間。

和當然,保持地方你語料庫基數...

由於我工作的一種愛好和部分,我實現一個python - Redis的支持小型搜索引擎。你也可以得到一些其他的想法。看看here

+0

感謝您的回覆!那個結構看起來不錯,會試試看! –

+0

它工作!我建立了一個服務器,用於填寫您告訴我的字典結構的初始處理,然後回覆客戶請求。我幾乎可以實時獲得結果!謝謝!!! –

3

這是一個學術活動還是你在做生產?如果您正在實施生產,爲什麼不使用已有的產品(即http://code.google.com/p/tfidf/)?另一方面,如果你將其作爲學術練習來做,我仍然可以在現有的實現中採取不同的行爲,以查看他們做了什麼不同(如果有的話)。

我也建議使用cProfile來查看您的代碼,看看費用在哪裏。

+0

感謝您的回覆,我想這可以被視爲一個學術項目。我已經發現最耗時的部分是df計算。 –