2012-11-06 77 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中粗体文本有帮助。