2012-11-06 79 views
3

這是我在SO上的第一篇文章,如果我的問題變得有點瑣碎,我對編程世界比較陌生,並且我選擇了python for my first「serious 「OOP語言。我通過SO檔案進行了搜索,但是我找不到與我的完全相關的任何問題。好吧,長話短說,這裏的問題:

我正在研究倒排索引。我發現在網上幾個教程和技巧的跟着我做了以下內容:Python - 查詢倒排索引

  • 類文件的詞幹的單詞和他們的開始和結束位置感謝其送回finditer功能。

  • 類Inverted_Index,需要一個文檔的集合(名單列表),令牌化他們,使他們在倒排索引中的

{'word':{document_id:(start_pos, end_pos)}}

形式像 {'cloud': {0: [(5, 10)]}, 'document': {1: [(11, 19)], 2: [(22, 30)]} ...}。 (我沒DOCUMENT_ID與SO話題的幫助下,通過一個文件列舉集合迭代而關於嵌套的字典,我讓他們amateurishly,如:

if nested_dict not in existing_dict: 
    existing_dict[nested_dict] = {} 

當我在讀棧owerflow我注意到,「defaultdict 「數據類型是這樣做的非常優越的方式,但我還沒有找到」集合「模塊。)。

回到正軌:Inside of Inverted_Index我做了一個Query方法(只是一個OR運算符的一個版本),它將字符串作爲查詢,如果該字符串與我的倒排索引中的鍵/項相匹配,返回document_id如:

[(1, [(0, 4), (11, 19)]), ...] 

之後,我被......卡住了。我想創建一個查詢輸出,在文檔中打印出發現的詞以及它的環境,但是我不知道如何從查詢方法(document_id與開始和結束位置)以及倒排索引連接結果,不知道如何在她的環境中突出顯示匹配的查詢。正因爲如此,我做了開始和結束點,但我不知道如何在python中強調它?大膽呢?

我想到結果是這樣的:

###################
您的疑問: '巧克力布丁'
結果:
########
在具有ID的文檔:1個
yaddi yaddi yadda巧克力唧唧歪歪布丁
hocolate唧唧歪歪布丁yaddi yaddi yadda BLA

我的意思是,我在讀http://docs.python.org/2/library/string.html#string.center,並認爲在同一列中對齊找到的單詞/查詢會欺騙。但是我不知道如何到達那裏,所以任何一種提示都會很棒,因爲我不會理解Python背後的邏輯,因爲我並沒有被卡在程序中,在這種情況下,教程不會做正義。(是的,我收到了一些Python書籍,但他們已經擴展了這種方法,可能考慮到它不適合初學者,但我不知道從哪裏開始,我可以使用哪些程序。問題是,我們在大學學習語言理論和IR理論,但我們在實踐中做了一些事情)。

謝謝!

而且抱歉故事的,我的生活爲此:d


我忘了,一個代碼,不使這個話題含糊:

class inverted_index(dict): 

    def __init__(self,collection_of_docs): 
     for doc_id,document in enumerate(collection_of_docs): 
      for word,start,end in document.tokenize(): #form: [('sky', 0, 4)] 
       if word not in self: 
        self[word]={} 
       if doc_id not in self[word]: 
        self[word][doc_id]=[] 
       self[word][doc_id].append((start,end)) 


    def query(self,query_string): 
     result={} 
     for query_term in re.findall(r'\w+',query_string.lower(),re.UNICODE): 
      for doc_id in self.get(query_term,{}): 
       if doc_id not in result: 
        result[doc_id]=self[query_term][doc_id] 
       else: 
        result[doc_id]=result[doc_id]+self[query_term][doc_id] 
     return sorted(result.items(),key=lambda e:-len(e[1])) 
+0

是不是有沒有使用像Solr這樣的現成文檔索引的原因? – jterrace

回答

1

您將需要一個「get_with_surroundings」方法在你的文字上。

它可能看起來像

class inverted_index(dict): 
    def __init__(self,collection_of_docs): 
     self.collection_of_docs = collection_of_docs #to store those 
     # ... rest of your code 

    def get_with_surroundings(document_id, position_tuple): 
     start, end = position_tuple 
     return self.collection_of_docs[document_id].text[start-10:end+10] 

凡+10和-10可能取決於有多少環境你需要顯示更改。 我假設你的Document類有一些'文本'屬性,該屬性是該文檔的純Python字符串。

用您的查詢結果之一調用此方法將會或多或少地實現您的需要。

這個How do I print bold text in Python?可能對python中粗體文本有幫助。