2012-09-24 26 views
2
index = {'Michael': [['mj.com',1], ['Nine.com',9],['i.com', 34]],/
     'Jackson': [['One.com',4],['mj.com', 2],['Nine.com', 10], ['i.com', 45]],/
     'Thriller' : [['Seven.com', 7], ['Ten.com',10], ['One.com', 5], ['mj.com',3]} 

# In this dictionary (index), for eg: 'KEYWORD': 
# [['THE LINK in which KEYWORD is present,'POSITION 
# of KEYWORD in the page specified by link']] 

例如:邁克爾存在於MJ.com,NINE.com和i.com在位置1,9,各頁的34。Python的多字索引

請幫我一個Python程序,它需要indexKEYWORDS作爲輸入。

當我輸入'MICHAEL'。結果應該是:

>>['mj.com', 'nine.com', 'i.com'] 

當我輸入'MICHAEL JACKSON'.結果應該是:

>>['mj.com', 'Nine.com']

爲 'Michael'和' Jackson'存在於'mj.com''nine.com'連續即,在位置(1,2 )&(9,10)。結果不應該顯示'i.com',即使它包含兩個關鍵字但它們不是連續放置。

當我輸入'MICHAEL JACKSON THRILLER',結果應該是

['mj.com']

作爲3個字'MICHAEL', 'JACKSON', 'THRILLER'在分別(3 1,2,)'mj.com'即位置連續放置。

如果我輸入'THRILLER JACKSON''THRILLER FEDERER',結果應該是NONE

+0

我想建立一個多字的搜索引擎。 – VeilEclipse

+1

你使用的是數據庫嗎?這是爲了現實生活還是學校?如果是現實生活,你可能想重新考慮你的設計...... –

+0

它不是現實生活。我只是嘗試了2或3頁。 – VeilEclipse

回答

0

作爲一個側面說明,Udacity簡介CS恰恰涵蓋了這個問題。這對於正確的輸入做出了一些假設(基本上它從未遇到任何不正確的輸入)。

def lookup(index,KEYWORDS): 
    kw = KEYWORDS.split() 
    if len(kw) == 1: 
     return [site[0] for site in index[kw[0]]] 
    else: 
     positions = {} 
     result = [] 
     kw = KEYWORDS.split() 
     for kword in kw: 
      for site in index[kword]: 
       positions[(kword,site[0])]=site[1] 
     for i in range(0,len(kw)-1): 
      cur_urls = [site[0] for site in index[kw[i]]] 
      next_urls = [site[0] for site in index[kw[i+1]]] 
      if i == 0: 
       result = cur_urls 
      for url in cur_urls: 
       if url in next_urls: 
        if not (positions[kw[i+1],url]-positions[kw[i],url]) == 1: 
         result.remove(url) 
       else: 
        if url in result: 
         result.remove(url) 
     return result 
+0

非常感謝!我從udacity向CS做了介紹,很高興你認識到我的問題。 – VeilEclipse

+0

我的建議發生錯誤,修復了它。您需要解決這個問題,以處理短語中的搜索字詞不是字典鍵的情況 - 這會在我建議的代碼中產生錯誤。 – selllikesybok

+0

不用擔心,再次感謝 – VeilEclipse

0

使用集和交集:

def func(key,dic): 
    keys=key.split() 
    values=[set(y if i==0 else y if dic[x][y]-dic[keys[i-1]].get(y,-10000)==1 \ 
       else None for y in dic[x]) for i,x in enumerate(keys)] 
    sett=values[0] 
    for y in values[1:]: 
     sett &= y 
    print(sett) 

index = {'Michael': {'mj.com':1,'Nine.com':9,'i.com':34}, 
     'Jackson':{'One.com':4,'mj.com':2,'Nine.com':10,'i.com':45}, 
     'Thriller' : {'Seven.com':7,'Ten.com':10,'One.com':5,'mj.com':3}} 

輸出:

>>> func("Michael",index) 
{'Nine.com', 'mj.com', 'i.com'} 
>>> func("Michael Jackson",index) 
{'Nine.com', 'mj.com'} 
>>> func("Michael Jackson Thriller",index) 
{'mj.com'} 
+0

非常感謝您的幫助! :)但結果是顯示i.com wch不要求MICHAEL JACKSON,因爲MICHAEL和JACKSON不是連續放置在i.com – VeilEclipse

+0

@ManabChetia解決方案編輯,我認爲,而不是使用清單列表,你應該使用字典字典。這是一個更合適的數據結構。 –

+0

你是一個強大的程序員。非常感謝你的幫助。但是僅僅使用列表是不可能的,因爲我必須改變代碼中的許多其他功能。再次感謝。 – VeilEclipse

0

首先,由於您的搜索似乎忽略大小寫,您應該大寫(或小寫)您的索引。

index = dict((key.upper(), val) for (key, val) in index.iteritems()) 

現在這裏是一個遞歸方法。首先,接口功能:

def search(query): 
    return [site for (site, pos) in search2(query.split())] 

下一個函數做實際的工作。如果只給出一個單詞,則返回該單詞索引中的條目;否則過濾那些位置匹配的指數。

def search2(words): 
    if len(words) == 1: 
     return index[words[0]] 
    else: 
     return [(site1, pos1) for (site1, pos1) in index[words[0]] 
           for (site2, pos2) in search2(words[1:]) 
           if (site1 == site2 and pos1 == pos2-1)] 

當然,事情變得更加複雜,如果pos其實是可以爲每個站點位置的列表 ...

+0

謝謝了很多。你知道使用whoosh嗎? – VeilEclipse