Я уже давно подумываю об использовании spaCy. Это было довольно устрашающе; они говорят об этом хорошо продуманном data_model и API 😨. Как бы то ни было, я дошел до того, чтобы использовать его сегодня утром в академическом наборе данных yelp и подумал, что напишу быстрое обновление о том, что я узнал об ускорении spaCy.

Заявление об ограничении ответственности: я играю с этим API менее часа или двух, приношу свои извинения за заблуждения или заблуждения 🔥

API

Центральным элементом их модели данных является этот объект nlp , и его использование описано ниже.

Ключевые выводы

  • Объект по умолчанию nlp выполняет несколько операций, которые могут не понадобиться для ваших целей, а именно Part-Of-Speech tagging, Named Entity Recognition и Dependency parsing. IIUC spaCy использует синтаксический анализ зависимостей для токенизации предложения, поэтому parser может понадобиться для нескольких задач. Удаление любого / всех из них поможет ускорить вашу программу.
  • Вы можете отключить большинство этих операций с помощью настраиваемых конвейеров.
  • Обязательно используйте метод pipe для многопоточной обработки текста. Я знаю, о чем вы думаете, но Вишну, что насчет GIL? (GIL означает Global Interpreter Lock. Короче говоря, многопоточность python не может использовать несколько ядер, поэтому вы не можете выполнять операции nlp параллельно для каждого документа). Cy в spaCy означает Cython, а стандартный Cython трюк, который я видел, - это отключить GIL для for-loop’s. Метод pipe spaCy делает то же самое (это означает, что ваши потоки фактически выполняются на нескольких ядрах 😄)
# Where texts is an iterator over your documents (unicode)
for doc in nlp.pipe(texts, batch_size=10000, n_threads=3):
    pass

Вот полная суть того, как я преобразовал кричащие обзоры в предложения, а затем каждое предложение в токены.