инвертированный индекс в python с пробелом в качестве токенизации и постоянной связью с исходными документами

Я хочу построить инвертированный индекс в 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) к исходным документам, т.е. сохранять его как дополнительный атрибут с каждым документом.


person Georg Heiler    schedule 23.03.2017    source источник


Ответы (2)


Вам может пригодиться словарь doc.user_data. Обратите внимание, что в настоящее время он не сериализуется в выходных данных doc.to_bytes(), поэтому вам нужно будет хранить его отдельно. Сериализация в виде кортежа (pickle(doc.user_dict), doc.to_bytes()) может работать.

person syllogism_    schedule 23.03.2017
comment
Но как заполнить его значениями, то есть путями к файлам во время выполнения nlp.pipe(iter_texts, batch_size=50, n_threads=4)? - person Georg Heiler; 23.03.2017
comment
Есть ли возможность адаптировать метод канала для фактического получения некоторых значений идентификатора? - person Georg Heiler; 25.03.2017

Вот решение 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)
person Georg Heiler    schedule 25.03.2017