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