Как ускорить SpaCy для разбора зависимостей? - PullRequest
0 голосов
/ 20 апреля 2020

Я использую spacy, чтобы специально получить все amod (модификатор прилагательного) во многих файлах (около 12 гигов заархивированных файлов). Я попытался заставить его работать на папке размером всего 2,8 МБ, и это заняло 4 минуты, чтобы обработать его!

Вот мой код до сих пор:

with open("descriptions.txt", "w") as outf:
    canParse = False
    toParse = ""
    for file in getNextFile():
        # Open zip file and get text out of it
        with zipfile.ZipFile(file) as zf:
            with io.TextIOWrapper(zf.open(os.path.basename(file)[:-3]+"txt"), encoding="utf-8") as f:
                for line in f.readlines():
                    if line[0:35] == "*** START OF THIS PROJECT GUTENBERG":
                        canParse = True
                    elif line[0:33] == "*** END OF THIS PROJECT GUTENBERG":
                        break
                    if canParse:
                        if line.find(".") != -1:
                            toParse += line[0:line.find(".")+1]

                            sents = nlp(toParse)
                            for token in sents:
                                if token.dep_ == "amod":
                                    outf.write(token.head.text + "," + token.text + "\n")

                            toParse = ""
                            toParse += line[line.find(".")+1:len(line)]
                        else:
                            toParse += line

Есть ли способ ускорить работу? spacy (или мой python код в целом) для этого очень конкретного c варианта использования?

1 Ответ

0 голосов
/ 20 апреля 2020

Немного перестройте ваш код, чтобы использовать nlp.pipe(), который обрабатывает тексты в пакетном режиме и работает намного быстрее, и отключите ненужные компоненты (либо с nlp.pipe(), как показано ниже, либо при загрузке модели).

for doc in nlp.pipe(texts, disable=["tagger", "ner"]):
    # process, e.g.:
    print(doc)

См. Дополнительные сведения и примеры: https://spacy.io/usage/processing-pipelines#processing

Вы также можете использовать многопроцессорную обработку с аргументом n_process для nlp.pipe().

...