C++ spimi算法误解
我正试图用C语言实现一个单通道内存索引器++ 但是,在算法中,我认为有什么错误或者(很可能)我有误解C++ spimi算法误解,c++,algorithm,dictionary,indexing,information-retrieval,C++,Algorithm,Dictionary,Indexing,Information Retrieval,我正试图用C语言实现一个单通道内存索引器++ 但是,在算法中,我认为有什么错误或者(很可能)我有误解 SPIMI-INVERT(token_stream) output_file = NEWFILE() dictionary = NEWHASH() while (free memory available) token ← next(token_stream) if term(token) ∈ dictionary then posting
SPIMI-INVERT(token_stream)
output_file = NEWFILE()
dictionary = NEWHASH()
while (free memory available)
token ← next(token_stream)
if term(token) ∈ dictionary
then postings_list = ADDTODICTIONARY(dictionary, term(token))
else postings_list=GETPOSTINGSLIST(dictionary,term(token))
if full(postings_list)
then postings_list = DOUBLEPOSTINGSLIST(dictionary, term(token))
ADDTOPOSTINGSLIST(postings_list, docID(token))
sorted_terms ← SORTTERMS(dictionary)
WRITEBLOCKTODISK(sorted_terms,dictionary,output_file)
return output_file
让我们假设我做了所有的分析,并将所有文档转换成一个标记流,其中标记是术语,doc\u id
对
表示为每个块调用SPIMI-INVERT函数
好吧,那我们开始吧
- 我们逐块读取流,所以现在我有一个块和 将其作为参数通过SPIMI-INVERT函数发送
- 该函数对字典的标记进行一些处理
- 该算法中断循环并将当前字典写入 磁盘
因为到目前为止还没有答案,在和我的教授交谈之后,我正在回答我的问题 我必须说算法不是很清楚,因为我的教授也不确定。我回答这个问题就像我如何解释它一样 令牌流是一个包含令牌(术语、文档id对)的文件
我用C++实现的,可能是有用的< /p> ,因为到目前为止还没有答案,和我的教授交谈后,我回答了我的问题。 我必须说算法不是很清楚,因为我的教授也不确定。我回答这个问题就像我如何解释它一样
令牌流是一个包含令牌(术语、文档id对)的文件我用C++实现,可能是有用的< /p>你已经错误地转录了算法;code>ADDTOPOSTINGSLIST()应该在循环内部,而不是外部。如果我理解正确,您将重复调用此过程,直到整个令牌流被消耗,每次调用都会在磁盘上生成一个文件。然后将这些文件合并在一起(基本上是一次mergesort算法)。是的,你是对的,我更正了它。是的,我会为每个街区调用这个程序。我们将拥有与块相同数量的文件。并将它们合并。到目前为止一切正常。但我想问的是,如果while循环中没有任何内存,会发生什么?或者为什么他们在那里设置了一个条件“空闲内存可用”,而不是仅仅为真?你不能称之为“每一个块”;你调用它来生成一个块,它的大小取决于你在内存中有多少空间。我不确定这是否真的适合现代操作系统,因为“可用的可用内存”并不是一个定义明确的限制-你总是可以以虚拟内存的形式获得更多,但它会随着你的移动而变得越来越慢“将每个块的字典写入磁盘,然后为下一个块启动一个新字典。”我不认为它会创建一个块。如果是这样,我认为重复调用此过程将毫无意义……(实际上,您不能这样做,因为您如何知道上一个过程的剩余位置)您知道上一个过程因已消耗的令牌流的数量而中断的位置。您错误地转录了算法;
ADDTOPOSTINGSLIST()
应该在循环内部,而不是外部。如果我理解正确,您会重复调用此过程,直到整个令牌流被消耗,每次调用都会在磁盘上生成一个文件。然后您会将这些文件合并在一起(基本上是一次mergesort算法)。是的,你是对的,我更正了。是的,我将为每个块调用此过程。我们将拥有与块相同数量的文件。并合并它们。到目前为止,一切正常。但我想问的是,如果我们在while循环中没有任何内存,会发生什么?或者为什么他们会在那里设置一个条件“可用内存可用”“而不仅仅是真的吗?你不能称之为“每一个街区”;你调用它来生成一个块,它的大小取决于你在内存中有多少空间。我不确定这是否真的适合现代操作系统,因为“可用的可用内存”并不是一个定义明确的限制-你总是可以以虚拟内存的形式获得更多,但它会随着你的移动而变得越来越慢“将每个块的字典写入磁盘,然后为下一个块启动一个新字典。”我不认为它会创建一个块。如果是这样,我认为重复调用此过程将毫无意义……(实际上,您不能这样做,因为您如何知道上一个过程的剩余位置)您知道上一个过程因已消耗的令牌流的数量而中断的位置。在写入磁盘之前,您没有对ITEN进行排序,这是一个问题,因为无法保证词典将被排序以合并块以获得最终索引。在写入磁盘之前,您没有对ITEN进行排序,这是一个问题,因为e不能保证词典将被命令为最终索引合并块。
while (there is token in token stream)
dict = new dictionary()
while(there is free memory available)
token = next_token()
dict.add_to_postingList(token)
write_dict_to_file(dict)
delete dict
//Assuming posting list is dynamically sized and dictionary knows if a term exist.