A spaCy vagy NLTK alapú, előre betanított entitás-kivonatoló modellek nagyszerű eredményeket adnak, de fáradságos annotálási és betanítási folyamatot igényelnek a nem anyanyelvi entitások, például a munkakörök, áfaszámok, gyógyszerek stb. felismeréséhez. Az olyan nagy nyelvi modelleknek köszönhetően, mint a GPT-3, a GPT-J és a GPT-NeoX, most már bármilyen típusú entitást kinyerhetünk a néhány lépéses tanulásnak köszönhetően, mindenféle annotáció és képzés nélkül. Ebben a cikkben bemutatjuk, hogyan lehet ezt megtenni.
A NER (entitások kinyerése) alapvetően strukturált információk kinyeréséről szól egy strukturálatlan szövegből. Ha még nem ismeri a NER-t, először olvassa el rövid bevezetőnket: bevezetés a NER-be.
A SpaCy az utóbbi években a NER de facto szabványává vált. (lásd a spaCy weboldalát). A SpaCy egy nagyon vonzó keretrendszer, mert könnyen használható, és a gyorsasága miatt jól használható a termelésben.
A SpaCy egy Python természetes nyelvi feldolgozó keretrendszer, amely számos előre betanított modellt kínál több nyelven, így könnyen kinyerhetünk többféle entitástípust (cégek, városok, címek, dátumok stb.) a saját nyelvünkön anélkül, hogy saját modellt kellene betanítanunk.
Az NLTK szintén érdekes választás a Python segítségével történő entitások kinyerésére, de alapértelmezésben kevesebb entitást javasol, és általában az NLTK-t nem ajánljuk gyártásra (inkább oktatási és kutatási keretrendszer).
Ezekkel a keretrendszerekkel azonban gyorsan elér egy határt: a natívan támogatott entitások száma korlátozott. A legtöbb vállalat a NER-t konkrét üzleti információk, például személyi információk, pénzügyi adatok, orvosi kezelések stb. kinyerésére kívánja felhasználni. Természetesen ezeket az entitásokat a spaCy előre betanított modelljei alapértelmezés szerint nem támogatják, így ennek eléréséhez saját adathalmazt kell létrehozni, és abból saját modellt kell betanítani.
A saját spaCy-modell képzése hosszú és fárasztó annotációs folyamat: egy vagy több személynek kell együttműködnie ahhoz, hogy egy hatalmas mennyiségű jó példát hozzon létre, és annotálja azokat. Nagyon nagy mennyiségű példára van szükség ahhoz, hogy a modell megfelelően tanuljon. Léteznek jó annotációs eszközök (mint például a spaCy által készített Prodigy), de ez még mindig egy fájdalmas feladat, amely miatt sok NLP-projekt megszakad.
Jó hír: a nagy nyelvi modellek, mint a GPT-3, a GPT-J és a GPT-NeoX elterjedésével mostantól bármilyen entitás kinyerhető annotálás és új modell képzése nélkül!
A szöveggeneráláshoz használt nagyméretű nyelvi modellek a közelmúltban jelentek meg a GPT-3 segítségével. (további információk a GPT-3-ról az OpenAI weboldalán). Amikor az OpenAI kiadta a 175 milliárd paraméterből álló GPT-3 modelljét, az forradalomnak számított, mivel megnyitotta az utat számos, természetes nyelvi feldolgozáson alapuló, élvonalbeli mesterséges intelligencia-alkalmazás előtt, anélkül, hogy további képzést igényelne.
A GPT-3-hoz hasonló GPT-modellek kezdeti célja a szöveggenerálás: egyszerűen adjon meg egy bemeneti adatot a modellnek, és hagyja, hogy a többit generálja ön helyett. A szöveggenerálás alapján nagyjából bármilyen természetes nyelvi feldolgozási felhasználási eset megvalósítható: osztályozás, összegzés, társalgási AI, parafrazálás... és természetesen entitás-kivonatolás!
Mivel a GPT-3 nem nyílt forráskódú modell, a nyílt forráskódú közösség a GPT-3 alternatíváin dolgozott, és most már 2 nagyszerű nyílt forráskódú megfelelője van: GPT-J és GPT-NeoX. Ezek még mindig nem olyan nagyok, mint a GPT-3, de nem kétséges, hogy csak idő kérdése, hogy a nyílt forráskódú közösség utolérje az OpenAI-t.
Ezeknek a modelleknek a megfelelő kihasználásához egy új technikára van szükség, amelyet "néhány lövéses tanulásnak" neveznek.
Ezek a nagy GPT modellek olyan nagyok, hogy nagyon gyorsan tanulhatnak Öntől.
Tegyük fel, hogy azt szeretné, hogy a GPT-3 generáljon egy rövid termékleírást az Ön számára. Íme egy példa néhány lövéses tanulás nélkül:
Generate a product description containing these specific keywords: t-shirt, men, $50
A válasz, amit kapni fog, haszontalan lesz. Ez lehet például valami ilyesmi:
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
Jó hír: sokkal jobb eredményt érhetsz el, ha egyszerűen adsz néhány példát a modellnek!
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:
Az eredmény valami ilyesmi lesz:
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.
Amint láthatod, a modell válasza most már tökéletesen megfelel a célnak, köszönhetően a 3 példának, amit először adtunk neki. Mégis, ezt a modellt soha nem képeztük ki ilyen termékleírás-generálási feladatra. Erről szól a "few-shot learning" technika: "transzfer tanulást" végzünk menet közben, mindössze néhány példával. Ahhoz, hogy ilyen eredményt érjünk el, általában arra számítunk, hogy egy természetes nyelvfeldolgozó modellt rengeteg példával kell betanítani, de itt nem.
Most az entitások kinyerését fogjuk elvégezni a few-shot tanulásnak köszönhetően.
Tegyük fel, hogy munkakörök címeit szeretné kinyerni weboldalakról. Egyszerűen csak adjon néhány példát a munkakörök címének kinyerésére, mielőtt a tényleges kérését benyújtaná:
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:
Az eredmény a következő lesz:
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
Mint észrevetted, okosan kell eljárnunk a néhány lövéses példáink elkészítésével kapcsolatban. Előfordulhat, hogy egyáltalán nem találunk munkaköri címet, ezért hoztunk létre egy "none" értéket visszaadó példát (így elkerülhetőek a téves pozitív eredmények). Lehet, hogy egyszerre több álláscímet szeretne kinyerni? Ebben az esetben fontos, hogy olyan példákat is hozzon létre, amelyek több munkakörcímet adnak vissza (például vesszővel elválasztott munkakörcímeket).
Még jobb eredményeket érhet el, ha még több példát ad hozzá. És fontos, hogy a példák a lehető legközelebb álljanak a tényleges végső kéréshez. Ha például tudod, hogy egész bekezdéseket fogsz elemezni a puszta mondatok helyett, akkor a legjobb, ha bekezdéseket is tartalmazó példákat készítesz.
Ha nincs hozzáférése GPT-modellhez, egyszerűen használhatja az NLP Cloud API-t. Számos kliens áll rendelkezésre (Python, Go, Node.js, Ruby, PHP...). Mutassunk itt egy példát a GPT-J használatára a Python klienssel:
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
)
Az eredmény: CTO
Hadd adjak egy gyors magyarázatot az imént használt szöveggenerálási paraméterekről.
Nagyon alacsony felső p-értéket állítottunk be, mert nem akarjuk, hogy a GPT-J túl eredeti eredményeket hozzon létre: csak azt akarjuk, hogy ragaszkodjon ahhoz, amit a kérésében látott.
A "length_no_input" azt jelenti, hogy a maximális hosszérték nem veszi figyelembe a bemeneti szöveget.
"remove_input" azt jelenti, hogy a beírt szöveget el kell távolítani az eredményből.
A "end_sequence" azt jelenti, hogy amikor a modell találkozik ezzel a karakterrel, le kell állítani a szöveggenerálást. Mivel a néhány lövéses példáinkban minden egyes válasz végére "###"-et adtunk, a modell a válasz generálása után automatikusan "###"-et fog generálni, és ott megáll.
A "remove_end_sequence" azt jelenti, hogy a "###" szót el akarjuk távolítani a válaszból.
További részleteket az NLP Cloud dokumentációjában talál: itt láthatja.
Az entitás-kivonatolás GPT modellel történő végrehajtása nagy szabadságot ad, mivel bármilyen új entitás menet közben is kivonható, még akkor is, ha a modell nem erre lett kiképezve!
Ennek azonban ára van: ezek a nagy nyelvi modellek hatalmasak és viszonylag lassúak.
Ha például a GPT-J vagy GPT-NeoX rendszert szeretné használni, akkor egy hatalmas, sok VRAM-mal rendelkező GPU-ra lesz szükség, például egy NVIDIA RTX A6000 vagy A40 típusú GPU-ra. És lesz némi késleltetés (egy entitás kivonása körülbelül 500 ms-ot vesz igénybe). Ezzel szemben a spaCy vagy az NLTK sokkal gyorsabb és kevésbé költséges az infrastruktúra szempontjából.
2022-ben nagyon egyszerűen lehet fejlett NER-t végezni mindenféle annotáció és képzés nélkül! Ez nagyban segíti majd a vállalatokat abban, hogy gyorsabban teljesítsék entitás-kivonási projektjeiket, és lehetővé teszi a természetes nyelvi feldolgozáson alapuló élvonalbeli alkalmazások megvalósítását is.
Az olyan nagy nyelvi modellek, mint a GPT-3, GPT-J és GPT-NeoX azonban költségesek, ezért nem szabad alábecsülni az ezzel járó infrastrukturális költségeket.
Remélem, ez a cikk segít időt és pénzt megtakarítani!
Julien Salinas
CTO az NLP Cloud-nál