这是我在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