这是我关于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]))
答案 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中的粗体文本有所帮助。