這是我在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]))
是不是有沒有使用像Solr這樣的現成文檔索引的原因? – jterrace