Python-反向索引查询

Python-反向索引查询,python,string,dictionary,inverted-index,Python,String,Dictionary,Inverted Index,这是我在SO上的第一篇文章,如果我的问题变得有点琐碎,我提前表示歉意。我对编程世界比较陌生,我选择python作为我的第一个“严肃的”OOP语言。我搜索了这么多档案,但找不到任何与我完全相关的问题。好吧,长话短说,问题是: 我正在做反向索引。我在网上找到了一些教程和提示,我做了以下工作: 类文档,用于对单词进行词干分析,并使用finditer函数返回单词的起始和结束位置 类倒排索引,它获取文档集合(列表中的列表),标记它们并以 {'word':{document_-id:(start_-p

这是我在SO上的第一篇文章,如果我的问题变得有点琐碎,我提前表示歉意。我对编程世界比较陌生,我选择python作为我的第一个“严肃的”OOP语言。我搜索了这么多档案,但找不到任何与我完全相关的问题。好吧,长话短说,问题是:

我正在做反向索引。我在网上找到了一些教程和提示,我做了以下工作:

  • 类文档,用于对单词进行词干分析,并使用finditer函数返回单词的起始和结束位置

  • 类倒排索引,它获取文档集合(列表中的列表),标记它们并以


{'word':{document_-id:(start_-pos,end_-pos)}

{'cloud':{0:[(5,10)]},'document':{1:[(11,19)],2:[(22,30)]}.
。 (我在SO topic的帮助下制作了document_id,遍历了一个文档的枚举集合。关于嵌套字典,我业余地制作了它们,比如:

if nested_dict not in existing_dict:
    existing_dict[nested_dict] = {}
当我阅读stack owerflow时,我注意到“defaultdict”数据类型是实现这一点的非常好的方法,但我还没有弄清楚“collections”模块)

回到正轨:在倒排索引中,我做了一个查询方法(只是OR运算符的一个版本),该方法将字符串作为查询,如果该字符串与倒排索引中的键/术语匹配,则返回带有术语起点和终点的文档id,如:

[(1, [(0, 4), (11, 19)]), ...]
从那以后我。。。卡住了。我想做一个查询输出,打印出文档中找到的单词及其环境,但我不知道如何连接查询方法(带有起始和结束位置的文档id)和反向索引的结果,我也不知道如何在她的环境中突出显示匹配的查询。正因为如此,我提出了起点和终点,但我不知道如何在python中强调它?大胆一点

我想到了这样的结果:

###################
您的问题:“巧克力布丁”
结果:
########
在id为1的文档中
雅迪雅迪雅达巧克力布丁
hocolate布拉布拉布拉布拉布丁雅迪雅迪雅迪雅达布拉

我的意思是,我在阅读和思考,在同一列中对齐找到的单词/查询将起到欺骗作用。但我不知道如何实现这一点,所以任何类型的提示都是很好的,因为我并没有像理解python背后的逻辑那样被困在我的程序中,在这种情况下,教程并不能起到应有的作用。(是的,我有一些python书籍,但他们扩展了这类问题的方法,可能考虑到这不是初学者的,但我不知道从哪里开始,我可以利用哪些程序。问题是,我们在大学里学习语言理论和IR理论,但我们在实践中做了一些事情。)

谢谢

对于我生命中的这个故事,我感到很抱歉


我忘了,一个不让这个话题模糊不清的代码:

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]))

您需要在文本上使用“获取周围环境”方法

可能看起来像

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可能会根据您需要显示的环境而变化。 我假设您的文档类有一些“text”属性,它是该文档的纯python字符串

使用查询结果之一调用此方法将或多或少地归档您所需的内容


这对于python中的粗体文本可能很有帮助。

您不使用像Solr这样的现成文档索引有什么原因吗?