Предварительно обученные модели извлечения сущностей на основе spaCy или NLTK дают отличные результаты, но требуют утомительного процесса аннотирования и обучения для обнаружения неродных сущностей, таких как названия должностей, номера НДС, лекарства и т.д. Благодаря большим языковым моделям, таким как GPT-3, GPT-J и GPT-NeoX, теперь можно извлекать сущности любого типа благодаря обучению за несколько кадров, без аннотации и обучения. В этой статье мы покажем, как это сделать.
NER (извлечение сущностей) - это извлечение структурированной информации из неструктурированного текста. Если вы новичок в NER, вы можете сначала прочитать наше краткое введение: введение в NER.
SpaCy практически стал стандартом де-факто для NER в последние годы. (см. веб-сайт спа-центра). SpaCy - очень привлекательный фреймворк, потому что он прост в использовании, а его скорость делает его хорошо подходящим для производственного использования.
SpaCy - это система обработки естественного языка на языке Python, которая предлагает множество предварительно обученных моделей на нескольких языках, что позволяет легко извлекать несколько типов сущностей (компании, города, адреса, даты и т.д.) на вашем родном языке без необходимости обучения собственной модели.
NLTK также является интересным выбором для извлечения сущностей с помощью Python, но он предлагает меньше сущностей по умолчанию, и в целом NLTK не рекомендуется для производства (это скорее образовательный и исследовательский фреймворк).
Однако при работе с этими платформами вы быстро столкнетесь с ограничением: количество поддерживаемых сущностей ограничено. Большинство компаний хотят использовать NER для извлечения специфической бизнес-информации, такой как информация о человеке, финансовые данные, медицинские процедуры и т.д. Конечно, эти сущности не поддерживаются по умолчанию предварительно обученными моделями spaCy, поэтому для достижения этой цели вам придется создать свой собственный набор данных и обучить на его основе свою собственную модель.
Обучение собственной модели spaCy - это долгий и утомительный процесс аннотирования: один или несколько человек должны сотрудничать, чтобы создать огромный набор хороших примеров и аннотировать их. Для правильного обучения модели требуется очень большой объем примеров. Существуют хорошие инструменты аннотирования (например, Prodigy, от компании spaCy), но это все еще остается мучительной задачей, из-за которой многие проекты НЛП прерываются.
Аннотационная иллюстрация
Хорошая новость: с появлением больших языковых моделей, таких как GPT-3, GPT-J и GPT-NeoX, появилась возможность извлекать любые сущности без аннотации и обучения новой модели!
Большие языковые модели для генерации текстов начали появляться недавно с GPT-3 (подробнее о GPT-3 на сайте OpenAI). Когда OpenAI выпустила свою модель GPT-3, состоящую из 175 миллиардов параметров, это стало революцией, поскольку открыло путь для многих передовых приложений ИИ, основанных на обработке естественного языка и не требующих дополнительного обучения.
Первоначальная цель моделей GPT, таких как GPT-3, заключается в генерации текста: просто дайте модели входные данные и позвольте ей сгенерировать остальное за вас. На основе генерации текста можно решить практически любую задачу по обработке естественного языка: классификация, обобщение, разговорный ИИ, перефразирование... и, конечно, извлечение сущностей!
Поскольку GPT-3 не является моделью с открытым исходным кодом, сообщество разработчиков с открытым исходным кодом работало над альтернативами GPT-3, и теперь у нас есть 2 отличных аналога с открытым исходным кодом: GPT-J и GPT-NeoX. Они все еще не так велики, как GPT-3, но нет сомнений, что это лишь вопрос времени, когда сообщество open-source догонит OpenAI.
Для правильного использования этих моделей требуется новая техника, называемая "обучение несколькими выстрелами".
Эти крупные модели GPT настолько велики, что могут очень быстро учиться у вас.
Допустим, вы хотите, чтобы GPT-3 сгенерировал для вас краткое описание продукта. Вот пример без обучения по нескольким снимкам:
Generate a product description containing these specific keywords: t-shirt, men, $50
Ответ, который вы получите, будет бесполезен. Это может быть, например, что-то вроде этого:
Generate a product description containing these specific keywords: t-shirt, men, $50 and short.
The product description needs to be a few words long. Don’t use plurals, use the keywords in the order they are
Хорошая новость: вы можете добиться гораздо лучших результатов, просто приведя пару примеров для модели!
Generate a product description containing specific keywords.
Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1499
Result:
Результат будет выглядеть примерно так:
Generate a product description containing specific keywords.
Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1,499
Result: The best gaming GPU on the market, at the price of $1,499 only.
Как вы можете видеть, ответ модели теперь полностью соответствует цели, благодаря 3 примерам, которые мы дали ей вначале. Тем не менее, эта модель никогда не обучалась на подобной задаче создания описания продукта. В этом и заключается суть техники "обучения с нескольких выстрелов": вы выполняете "обучение с переносом" на лету, используя всего пару примеров. Для достижения такого результата обычно требуется обучить модель обработки естественного языка на тоннах примеров, но не здесь.
Теперь мы выполним извлечение сущностей благодаря обучению по методу нескольких кадров.
Допустим, вы хотите извлечь названия должностей с веб-сайтов. Просто приведите пару примеров извлечения названий должностей, прежде чем делать запрос:
Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:
Результат будет следующим:
Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title: CTO
Как вы заметили, мы должны с умом подходить к созданию наших примеров. Может случиться так, что ни одно название должности вообще не будет найдено, поэтому мы создали пример, возвращающий значение "none" (это позволяет избежать ложных срабатываний). Может быть, вы хотите извлечь несколько названий должностей одновременно? В этом случае важно создать примеры, возвращающие несколько названий должностей (например, названия должностей, разделенные запятыми).
Вы получите еще лучшие результаты, если добавите еще больше примеров. И важно, чтобы ваши примеры были как можно ближе к вашему реальному окончательному запросу. Например, если вы знаете, что собираетесь анализировать целые абзацы, а не просто предложения, лучше создать примеры с абзацами.
Если у вас нет доступа к модели GPT, вы можете просто использовать NLP Cloud API. Доступно несколько клиентов (Python, Go, Node.js, Ruby, PHP...). Приведем пример использования GPT-J с клиентом Python:
import nlpcloud
client = nlpcloud.Client("gpt-j", "your API token", gpu=True)
client.generation("""Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:""",
top_p=0.1,
length_no_input=True,
remove_input=True,
end_sequence="###",
remove_end_sequence=True
)
Результат будет: CTO
Позвольте мне дать вам небольшое пояснение по поводу параметров генерации текста, которые мы только что использовали.
Мы установили очень низкое верхнее значение p, потому что не хотим, чтобы GPT-J создавал слишком оригинальные результаты: мы просто хотим, чтобы он придерживался того, что увидел в вашем запросе.
"length_no_input" означает, что максимальное значение длины не должно учитывать входной текст.
"remove_input" означает, что вводимый текст должен быть удален из результата.
"end_sequence" означает, что когда модель встретит этот символ, она должна прекратить генерацию текста. Поскольку в наших примерах мы добавили "###" в конце каждого ответа, модель автоматически сгенерирует "###" после генерации ответа и на этом остановится.
"remove_end_sequence" означает, что мы хотим удалить "###" из ответа.
Более подробную информацию вы можете найти в документации NLP Cloud: посмотреть здесь.
Извлечение сущностей с помощью GPT-модели дает большую свободу, поскольку любая новая сущность может быть извлечена на лету, даже если модель не была обучена для этого!
Однако за это приходится платить: эти большие языковые модели огромны и относительно медленны.
Например, если вы хотите использовать GPT-J или GPT-NeoX, потребуется огромный GPU с большим объемом VRAM, например NVIDIA RTX A6000 или A40. И будет некоторая задержка (извлечение сущности занимает около 500 мс). Напротив, spaCy или NLTK будут намного быстрее и менее затратными с точки зрения инфраструктуры.
В 2022 году можно будет легко выполнять продвинутый NER без аннотации и обучения! Это значительно поможет компаниям быстрее реализовывать проекты по извлечению сущностей, а также позволит создавать более современные приложения, основанные на обработке естественного языка.
Однако такие крупные языковые модели, как GPT-3, GPT-J и GPT-NeoX, являются дорогостоящими, поэтому не стоит недооценивать затраты на инфраструктуру.
Надеюсь, эта статья поможет вам сэкономить время и деньги!
Julien Salinas
Технический директор NLP Cloud