Попередньо навчені моделі вилучення сутностей на основі spaCy або NLTK дають чудові результати, але вимагають виснажливого процесу анотування та навчання для виявлення невластивих сутностей, таких як назви посад, номери ПДВ, лікарські препарати тощо. Завдяки великим мовним моделям, таким як GPT-3, GPT-J і GPT-NeoX, тепер можна витягувати будь-які типи сутностей завдяки навчанню з декількох пострілів, без будь-яких анотацій і тренувань. У цій статті ми покажемо, як це зробити.
NER (вилучення об'єктів) - це, по суті, вилучення структурованої інформації з неструктурованого тексту. Якщо ви не знайомі з NER, ви можете спочатку прочитати наш короткий вступ: вступ до ЯРБ.
За останні роки SpaCy практично став стандартом де-факто для NER (дивіться на сайті spaCy). 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, але немає сумнівів, що це лише питання часу, коли спільнота з відкритим вихідним кодом наздожене 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
Як ви помітили, ми повинні бути розумними в тому, як ми робимо наші приклади з кількома пострілами. Може статися так, що жодної назви посади не буде знайдено взагалі, тому ми створили приклад, який повертає "жодної" (це дозволяє уникнути помилкових спрацьовувань). Можливо, ви хочете отримати кілька назв посад одночасно? У такому випадку важливо створити приклади, які також повертають декілька назв посад (наприклад, через кому).
Ви отримаєте ще кращі результати, додавши ще більше прикладів. І важливо, щоб Ваші приклади були максимально наближені до Вашого фактичного кінцевого запиту. Наприклад, якщо ви знаєте, що будете аналізувати цілі абзаци, а не просто речення, краще створювати приклади з абзацами.
Якщо у вас немає доступу до 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" означає, що з результату слід видалити вхідний текст.
"кінець_послідовності" означає, що коли модель зустрічає цей символ, вона повинна припинити генерацію тексту. Оскільки в наших прикладах ми додавали "###" в кінці кожної відповіді, модель автоматично згенерує "###" після генерації відповіді і на цьому зупиниться.
"видалити_кінцеву_послідовність" означає, що ми хочемо видалити з відповіді "###".
Більш детальну інформацію можна знайти в документації до NLP Cloud: подивись тут.
Виконання вилучення сутностей за допомогою GPT-моделі дає велику свободу, оскільки будь-яка нова сутність може бути вилучена "на льоту", навіть якщо модель не була навчена цьому!
Однак це має свою ціну: ці великі мовні моделі величезні і відносно повільні.
Наприклад, якщо ви хочете використовувати GPT-J або GPT-NeoX, вам знадобиться величезний графічний процесор з великою кількістю VRAM, такий як NVIDIA RTX A6000 або A40. І буде деяка затримка (витяг об'єкта займає близько 500 мс). Натомість spaCy або NLTK будуть набагато швидшими і менш затратними з точки зору інфраструктури.
У 2022 році можна буде виконувати просунутий NER дуже легко, без будь-яких коментарів та навчання! Це значно допоможе компаніям швидше реалізовувати свої проекти з вилучення сутностей, а також дозволить створювати більш сучасні додатки, засновані на обробці природної мови.
Однак великі мовні моделі, такі як GPT-3, GPT-J і GPT-NeoX, є дорогими, тому не варто недооцінювати витрати на інфраструктуру.
Сподіваюся, ця стаття допоможе Вам заощадити час і гроші!
Julien Salinas
CTO в NLP Cloud