Python - 查询倒排索引

时间:2012-11-06 21:43:11

标签: python string dictionary inverted-index

这是我关于SO的第一篇文章,如果我的问题变得有点琐碎,我对编程世界相对较新,我选择了python作为我的第一个“严肃的”OOP语言,我提前道歉。我通过SO档案进行了搜索,但我找不到任何与我完全相关的问题。好吧,长话短说,这就是问题:

我正在研究倒排索引。我在网上找到了几个教程和技巧,我做了以下工作:

  • class文档用于通过finditer函数来阻止单词并使用它们的开始和结束位置返回它们。

  • 类Inverted_Index,它接收文档的集合(列表中的列表),对它们进行标记,并以

  • 的形式将它们放入倒排索引中

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

{'cloud': {0: [(5, 10)]}, 'document': {1: [(11, 19)], 2: [(22, 30)]} ...}。 (我在SO主题的帮助下做了document_id,迭代了枚举的文档集。关于嵌套的词典,我做了业余的,比如:

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

当我正在阅读堆栈功能时,我注意到“defaultdict”数据类型是非常优越的方式,但我还没有想出“集合”模块。)。

回到正轨:在Inverted_Index内部我做了一个Query方法(只是OR运算符的一个版本),它将字符串作为查询,如果该字符串与我的反向索引中的键/术语匹配,则返回document_id with start和一个术语的结束点,如:

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

之后我被......卡住了。我想创建一个查询输出,在文档中打印出找到的单词及其环境,但我不知道如何连接查询方法的结果(document_id有开始和结束位置)和倒排索引,我不知道有一个线索如何在她的环境中突出显示匹配的查询。因为我做了起点和终点,但我不知道如何在python中强调它?大胆了吗?

我想到的结果如下:

  

###################
      您的疑问:'巧克力布丁'
      结果:
      ########
      在id为1的文档中       yaddi yaddi yadda巧克力bla bla bla布丁
      hocolate bla bla bla pudding 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]))

1 个答案:

答案 0 :(得分: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类有一些'text'属性,它是该文档的普通python字符串。

使用您的查询结果之一来调用此方法,或多或少可以满足您的需求。

这个How do I print bold text in Python?可能对python中的粗体文本有所帮助。