【发布时间】:2012-11-06 21:43:10
【问题描述】:
这是我关于 SO 的第一篇文章,如果我的问题有点琐碎,我提前道歉,我对编程世界还比较陌生,我选择 python 作为我的第一个“严肃”OOP 语言。我通过 SO 档案进行了搜索,但找不到与我的完全相关的任何问题。好吧,长话短说,问题来了:
我正在研究倒排索引。我在网上找到了一些教程和提示,我做了以下事情:
借助 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] = {}
当我阅读堆栈 owerflow 时,我注意到“defaultdict”数据类型是执行此操作的非常好的方法,但我还没有想出“集合”模块。)。
回到正轨:在 Inverted_Index 内部,我做了一个 Query 方法(只是 OR 运算符的一个版本),它将字符串作为查询,如果该字符串与我的倒排索引中的键/术语匹配,则返回带有 start 和的 document_id术语的结束点,例如:
[(1, [(0, 4), (11, 19)]), ...]
然后我就……卡住了。我想制作一个查询输出,打印出文档中找到的单词及其环境,但我不知道如何连接查询方法的结果(document_id 与开始和结束位置)和倒排索引,我不知道不知道如何在她的环境中突出显示匹配的查询。正因为如此,我做了起点和终点,但我不知道如何在 python 中强调它?加粗吗?
我想到了类似的结果:
###################
您的查询:'巧克力布丁'
结果:
########
在 id 为 1 的文档中
yaddi yaddi yadda 巧克力 bla bla bla 布丁
巧克力 bla bla bla 布丁 yaddi yaddi yadda bla
我的意思是,我正在阅读 http://docs.python.org/2/library/string.html#string.center 并认为在同一列中对齐找到的单词/查询会起到欺骗作用。但我不知道如何到达那里,所以任何类型的提示都会很棒,因为我没有被困在我的程序中,因为我一直在理解 python 背后的逻辑,在这种情况下,教程不会做正义。 (是的,我有一些 python 书籍,但是他们对这种事情有扩展的方法,可能考虑到它不适合初学者,但我不知道从哪里开始,我可以使用什么程序。问题是,我们在大学里学习语言理论和国际关系理论,但我们在实践中做了一些事情。)。
谢谢!
对于这个我生命中的故事结束感到抱歉: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 这样的现成文档索引?
标签: python string dictionary inverted-index