python 中的倒排索引,具有 spacy 作为标记化和与原始文档的持久关系

inverted index in python with spacy as tokenization and persistent relation to original documents

我想在 python 中构建一个倒排索引,使用很棒的 https://spacy.io/ 库来标记单词。

他们提供了一个很好的示例,说明如何同时执行预处理并最终得到一个准备好编制索引的文档列表。

texts = [u'One document.', u'...', u'Lots of documents']
# .pipe streams input, and produces streaming output
iter_texts = (texts[i % 3] for i in range(100000000))
for i, doc in enumerate(nlp.pipe(iter_texts, batch_size=50, n_threads=4)):
    assert doc.is_parsed
    if i == 30:
        break
    print(i)
    print(doc)

到目前为止我不明白的是如何使用这种方法维护与原始文档的关系(文件路径/ URL),即将它作为每个文档的附加属性存储。

您可能会发现 doc.user_data 词典很有用。请注意,它当前未在 doc.to_bytes() 输出中序列化,因此您需要单独存储它。序列化为元组 (pickle(doc.user_dict), doc.to_bytes()) 可能有效。

这是解决方案 https://github.com/explosion/spaCy/issues/172

def gen_items():
    print("Yield 0")
    yield (0, 'Text 0')
    print("Yield 1")
    yield (1, 'Text 1')
    print("Yield 2")
    yield (2, 'Text 2')

gen1, gen2 = itertools.tee(gen_items())
ids = (id_ for (id_, text) in gen1)
texts = (text for (id_, text) in gen2)
docs = nlp.pipe(texts, batch_size=50, n_threads=4)
for id_, doc in zip(ids, docs):
    print(id_, doc.text)