Предварително обучените модели за извличане на същности, базирани на spaCy или NLTK, дават отлични резултати, но изискват досаден процес на анотиране и обучение, за да се открият неродствени същности като заглавия на длъжности, номера на ДДС, лекарства и др. Благодарение на големите езикови модели като GPT-3, GPT-J и GPT-NeoX вече е възможно да се извличат всякакви видове същности благодарение на обучение с няколко избора, без анотиране и обучение. В тази статия ще ви покажем как да направите това.
NER (извличане на същности) е основно за извличане на структурирана информация от неструктуриран текст. Ако сте начинаещи в областта на 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 и сега имаме два чудесни еквивалента с отворен код: 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
Както забелязахте, трябва да сме наясно с това как правим примерите с няколко снимки. Може да се случи така, че изобщо да не бъде намерено заглавие на длъжност, поради което създадохме пример, връщащ "none" (така се избягват фалшивите положителни резултати). Може би искате да извлечете няколко заглавия на длъжности едновременно? В този случай е важно да създадете примери, връщащи и няколко заглавия на длъжности (например заглавия на длъжности, разделени със запетая).
Ще получите още по-добри резултати, ако добавите още повече примери. Важно е примерите ви да са възможно най-близки до действителната ви крайна заявка. Например, ако знаете, че ще анализирате цели параграфи, а не само изречения, най-добре е да създадете примери и с параграфи.
Ако нямате достъп до модел на GPT, можете просто да използвате API на NLP Cloud. Налични са няколко клиента (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, ще ви е необходим огромен графичен процесор с много VRAM, например NVIDIA RTX A6000 или A40. Освен това ще има известно забавяне (извличането на единица отнема около 500 ms). Напротив, spaCy или NLTK ще бъдат много по-бързи и по-евтини от гледна точка на инфраструктурата.
В 2022 г. е възможно да се извърши разширен NER много лесно без никакви анотации и обучение! Това значително ще помогне на компаниите да изпълняват по-бързо проектите си за извличане на същности, а също така дава възможност за по-авангардни приложения, базирани на обработка на естествен език.
Големите езикови модели като GPT-3, GPT-J и GPT-NeoX обаче са скъпи, така че не бива да подценявате разходите за инфраструктура.
Надявам се, че тази статия ще ви помогне да спестите време и пари!
Julien Salinas
Технически директор в NLP Cloud