2013-09-28 34 views
0

我有3000萬個帖子,600個查詢代表600個品牌。
例如查詢"Harry Potter" OR "Harry"代表品牌哈利波特,
和後可以是:文本挖掘代碼中的時間複雜度問題

Yesterday I went to see harry potter. The movie was great! 

我代表後的文本類Post,還包括處理找到一個長期的操作功能("Harry""Harry Potter")。
另一類是Query,表示查詢,並與Post進行通信。
我跑了超過10萬個帖子的代碼,花了半個小時。

class Post: 

    def __init__(self, post): 
     self._postString = post 
     self._postString = re.sub(r'\s{2,}', ' ', self._postString) 
     self._parsedSen = self._postString.split(' ') 
     self._length = len(self._parsedSen) 


    def isTermAppear(self, term): 
     k = None 
     termArr = term.split(' ') 
     for i in range(self._length): 
      if i + len(termArr) <= len(self._parsedSen): 
       k = i 
       flag = True 
       for j in range(len(termArr)): 
        if not self._parsedSen[k].lower().find(termArr[j].lower()) >= 0: 
         flag = False 
        k += 1 
       if flag: 
        return True 
     return False 

然後我改變函數是微不足道的,並再次運行代碼。這一次花了3分鐘。

def isTermAppear(self, term): 
    return False 

Post怎樣才能更有效率?

+0

這個問題可能更適合[codereview.SE](http://codereview.stackexchange.com/)? – Michael0x2a

+0

你想要ElasticSearch –

回答

1

存放在self._parsedSen的目標詞的小寫,並使用termArr = term.lower().split(' ')然後使用:

def isTermAppear(self, term): 
    termArr = term.lower().split(' ') 
    flag = True 
    for t in termArr: 
     flag &= t in self._parsedSen 
    return flag 

你會驚訝。

+1

'return all(t在termArr中的t中self._parsedSen)'有什麼問題?你的&='不會短路。 – Veedrac

+0

@Steve Barnes,因爲我理解你的解決方案的術語是「哈利波特」,如果在帖子中出現「哈利」和「波特」,不一定相鄰,那麼「isTermAppear」將返回true。只有當「哈利波特」出現在相鄰處時,這纔是正確的。 – Presen

+0

發佈的原始代碼也是如此。 –