-
Notifications
You must be signed in to change notification settings - Fork 4
Intents
This Wiki page is in Hungarian 🇭🇺
Ez a szócikk a lara.parser.Intents() osztály használatát mutatja be, amellyel megadhatunk olyan szavakat, melyek ragozott formáit akarjuk megtalálni egy szövegben. További példákat ezen a lapon találsz.
Minden intenció elemnek tartalmaznia kell minimum egy stem
változót, amiben a ragozatlan szótő, morféma kell, hogy álljon stringként. A stem
változóban, főnevek és melléknevek esetén a ragozatlan szótövet kell megadni, igék esetén viszont tőmorfémákat, vagy az E/3 alanyi ragozott, azaz a legrövidebb formát kell megadni. Tehát {"stem":"nézni","wordclass":"verb"}
❌ helyett a {"stem":"néz","wordclass":"verb"}
✔️ lesz a helyes!
Ez azért hasznos, mert így olyan morfémák is megadhatóak, amelyek "ni" képző hozzáadása után sem lennének valós főnévi igenevek (például: "enni" és "eszni" helyett az "en" és "esz" morfémákat kell külön megadni).
Az alábbi szófajok adhatók meg a wordclass
változóban:
Szófaj | Magyarázat |
---|---|
special |
Alapértelmezett érték. Ebben az esetben semmilyen reguláris kifejezés nem generálódik a szó ragozott formáinak megtalálásához. Egy az egyben történő szóbeli egyezés esetén ad csak találatot. Alapértelmezetten nem tesz különbséget a kis-, és nagybetűk között. |
noun |
Főnevek esetén alkalmazandó. |
verb |
Igék esetén alkalmazandó. Alapértelmezetten a gyakori igekötők automatikusan hozzáadódnak a 'prefix' listához. |
adjective |
Melléknevek esetén alkalmazandó. Alapértelmezetten a 'leg' és 'legesleg' fokozások hozzáadódnak a 'prefix' listához. |
regex |
Saját reguláris kifejezések megadásához használható (alapértelemzetten r'\b' kapcsolók közé fog kerülni a stringként megadott definíció). Ebben az esetben nem ajánlott további tulajdonságok definiálása. Alapértelmezetten nem tesz különbséget a kis-, és nagybetűk között. |
emoji |
Emojik kinyeréséhez alkalmazandó. Ebben az esetben sem ajánlott további tulajdonságok definiálása. |
Az NLTK tagsetjével való kompatibilitás megőrzéséhez ADJ, NOUN és VERB érétékek is megadhatóak.
Amennyiben valamelyik tulajdonság (a stem
kulcson kívül) nincs megadva, a hozzátartozó alapértelmezett értéket fogja kapni az Intents objektum eleme.
Tulajdonság | Alapértelmezett érték | Magyarázat |
---|---|---|
score |
1 (0 ha inc elem is definiálva van) |
Minden alapértelemzett találat esetén a megadott értékkel növeli meg az intenció pontszámát. Egy intencióra, ha egyszerre található meg alapértelmezett és elgépelt találat a szövegen belül, akkor kiértékeléskor a score és a typo_score együttes értékét kapja az intenció. |
prefix |
[] (de wordclass :"verb" esetén gyakori igekötőket, wordclass :"adjective" esetén a leg és legesleg előtagokat fogja tartalmazni) |
Keresendő előtagok string listája. Összetett főneveknél is alkalmazható. |
affix |
[] | Az elfogadott utótagok string listája. Összetett szavaknál használandó. Vigyázzunk arra, hogy a listában olyan további elemeket adjunk meg, amelyek nem változtatják meg a szófajt. |
match_stem |
True |
Boolean érték, ami azt adja meg, hogy a stem változóban megadott morfémát önmagában állva is elfogadja-e az osztály találatként. False esetén csak a ragozott alakokat, "affix"-szel álló alakokat és/vagy "prefix"-szel álló alakokat fogad el. (Tehát például többalakú tövek esetén, hangzóhiányos tőmorfémák definiálhatók külön a segítségével, amiket önmagukban állva nem, de ragozott alakban már találatként elfogadunk.) |
inc |
[] | Including rövidítése. További intenció dictionaryk definiálhatóak az együttjárások pontozásához. Csak egy mélységig ellenőriz az osztály, tehát az itt deklarált további intenciók inc tulajdonságait már nem veszi figyelembe pontozásnál. Amennyiben az eredeti stem nem lett megtalálva, az itt megtalált, további stem deklarációk sem lesznek figyelembe véve. Ha itt nincs külön score definiálva, akkor bármely definiált intenció megtalálása találatot jelent. |
exc |
[] | Excluding rövidítése. További intenció dictionaryk definiálhatóak, amelyek megtalálásakor a tulajdonos intenció nem kap pontot (függetlenül attól, hogy milyen értékű score volt hozzá beállítva). Szintén csak egy mélységig ellenőriz. Ha itt nincs külön score definiálva, akkor bármely definiált intenció megtalálása esetén nem kapunk találatot. |
ignorecase |
True | Figyelmen kívül hagyja-e a kis-, és nagybetűk közötti különbséget a stem változóban. Hasznos tulajdonnevek vagy mozaikszavak megadásánál. |
boundary |
True (wordclass :"emoji" esetén False) |
Ritka esetekben, speciális "regex" stem deklarálásánál lehet hasznos: ha True, akkor a deklarációt r'\b' kapcsolók közé teszi automatikusan, egyébként nem teszi hozzá a plusz reguláris kifejezést. |
max_words |
0 | Amennyiben az értéke 0-nál nagyobb, csak akkor fogad el találatot, ha a szövegben lévő szavak (emoji-k nem számítanak) száma nem nagyobb az itt megadott értéknél. 1 a minimális érték, mivel magának a keresendő szónak amúgy is benne kell lennie a szövegben. Nagyobb korpusz esetén célszerű mondatonként ellenőrizni az ilyen típusú találatok meglétét. |
Chatbotokkal történő kommunikáció esetén a felhasználók ritkán figyelnek a helyesírásra. Emiatt az osztály a találatok során engedékenyebb: a megadott Intents elemet és annak valamilyen lehetséges elgépelt formáját is keresni fogja a szövegben. A találatok finomítása érdekében tehát a megadott tulajdonságok alapján generálódik egy alapértelmezett és egy elgépelt forma is, amit az osztály két különböző, helyes találtként értékelhet. Az elgépeltforma az alapértelmezetten megadott formából jön létre:
- Az osztály kicseréli az ékezetes betüket az ékezet nélküli megfelelőire (távolabb->tavolabb) valamint eltávolítja a vesszőket.
- Az egymás után egynél többször megjelenő karakterekből az ismétlődéseket törli (tavolabb->tavolab).
- Engedélyezi két karakter felcserélését (3-nál hosszabb szavak esetén), mint helyesírási hibát, amennyiben az nem az első vagy az utolsó karakter (tavolab -> tavloab).
- Engedélyezi egy-egy karakter kihagyását (5-nél hosszabb szavak esetén), mint helyesírási hibát, amennyiben az nem az első vagy utolsó karakter (tavolab -> tavlab) de ilyenkor további karakter felcserélést már nem engedélyez.
- Amennyiben a
stem
szóközt tartalmazott, az egybeírt vagy kötőjellel írt formákat is elfogadja (jó éjt->joejt).
Az elgépelt formák segítségével egyes, speciális ragozott alakok könnyebben detektálhatóak (ékezetessé vált vagy megváltozott szótöveket is detektálhatunk velük). Az elgépelt formákat az osztály nem az eredeti, hanem egy hasonló logika alapján átalakított szöveggel veti össze találatokért.
A typo_
előtagú attribútumok, az előtag nélküli párjaikból, automatikusan generálódnak, definiálásuk csak nagyon ritka esetekben indokolt. A typo_
előtagú változók a gyakori elgépelések (dupla karakterek helyett csak egy gépelése, ékezetek elhagyása, két karakter felcserélése, vagy ragozás folyamán ékezetessé vált szótövek, stb.) esetén is találatot ad(hat)nak.
Elgépelt megfelelőhöz tartozó, automatikusan generált attribútumok a következők (ezek manuálisan felülírhatók deklarációkor, azon ritka esetekben, amikor indokolt) :
Tulajdonság | Alapértelmezett érték | Magyarázat |
---|---|---|
typo_stem |
stem alapján automatikusan generált |
Elgépelt szótő, ami megkönnyíti egyes esetekben a találatot. A typo_score az erre való találat esetén nő. |
typo_score |
score értéke |
Minden elgépelt találat esetén a megadott értékkel növeli meg az intenció typo_score pontszámát. Egy intencióra, ha egyszerre található meg alapértelmezett és elgépelt találat a szövegen belül, akkor kiértékeléskor a score és a typo_score együttes értékét kapja az intenció. |
typo_prefix |
wordclass beállításoktól függ, egyéni prefix megadása esetén alapértelmezetten az egyéni prefix listából generálódik |
Keresendő elgépelt előtagok string listája. Összetett főneveknél is alkalmazható. |
typo_affix |
[], egyéni affix megadása esetén alapértelmezetten az egyéni affix listából generálódik |
Az elfogadott elgépelt utótagok string listája. Összetett szavaknál használandó. |
A megadott tulajdonságok alapján, inicializáláskor generálódik még egy nem definiálható pattern
és typo_pattern
attribútum is, ami egy-egy gyorsítótárazott reguláris kifejezést tartalmaz a szövegen belüli kereséshez.
A lara.parser.Intents() osztály publikus funkciói az alábbiak:
from lara import parser
example = parser.Intents()
A konstruktor meghívható intenciókkal vagy további feldolgozást nem igénylő, raw intenciókkal is (lásd lejjebb).
def __init__(self, new_intents={}, is_raw=False):
self.intents = {}
if new_intents:
if is_raw:
self.raw(new_intents)
else:
self.add(new_intents)
A példány létrejöttekor az alábbi funkciók érhetők el:
Funkció | Leírás |
---|---|
example.match(text="...",[zeros=False]) |
Egyezések keresése a megadott szövegben. Egy dictionary-vel tér vissza, amely "intent" : score párokat tartalmaz, olyan elemekből, ahol a score 0-nál nagyobb volt. Ha a zeros értéke True, akkor a nullás score -t kapott elemek is benn maradnak a dictionary-ben. |
example.match_set(text="...") |
Ugyanaz, mint az előző, de set-tel tér vissza. Kevesebb erőforrást használ, mert 0-nál magasabb score után továbblép a következő elemre. |
example.match_best(text="...",[n=1]) |
Egy olyan dictionary-vel tér vissza, ami csak az utolsó n legnagyobb score -ral rendelkező értékpárt tartalmazza. Ha kevesebb, mint n elem lett megtalálva, akkor mindet visszaadja. Azonos score -ú elemek esetén nem ajánlott a használata. |
example.match_order(text="...",preference=[],[reverse=False]) |
A preference listában megadott elemeken végig haladva a legelőször megtaláltat adja vissza str-ként. Ha nem talált Intent key-t a preference listából, akkor a legnagyobb pontszámú megtalált elemet adja vissza. Egyébként üres str-t. Ha reverse=True akkor a lista elején lévő Intent elemeket fogja a legutoljára elfogadni találatként. |
example.clean(text="...",[deep=False]) |
Eltávolítja az egyező részeket a szövegből. Figyelembe veszi mind a inc , mind a exc deklarációkat. Amennyiben deep=True az inc attribútum megtalált elemeit is törli, egyébként csak magát a megtalált, ragozott stem formákat a beállításainak megfelelően. Elgépelt typo_stem formákat is képes törölni. A score értékeket nem veszi figyelembe törlésnél, csak a találat meglétét. Ritka esetekben előfordulhat, hogy speciális, több szavas stem deklarációk vagy boundary=False attribútumú deklarációk esetén bizonyos szavakat, szórészeket nem fog kitörölni, amennyiben a találatok között átfedés van és a törlés sorrendjétől függően, adott szavak vagy szórészek már nem lesznek jelen a szövegben. |
A megadott intenciók alapértelmezetten még feldolgozódnak úgy, hogy biztosan használhatóak legyenek az egyezések keresésénél.
További funkciók | Leírás |
---|---|
example.add(new_intents={}) |
További intenciók hozzáadása a meglévőkhöz (a + összeadás hívásával megegyező funkció). A teljesen megegyező duplikációkat nem veszi figyelembe. |
example.raw(new_intents) |
Optimalizációhoz ajánlott. Felülírja az eddigi intenciókat az itt megadottakkal, mely elemeket már nem dolgoz fel. Megadható intenciókat tartalmazó (előzőleg deklarált és feldolgozott) dictionary, string vagy létező Intents() osztály példánya. |
Az str(), repr(), len() funkciók, logikai műveletek (== és !=) valamint az összeadás szintén implementálva vannak.
Az str() függvény már a feldolgozott elemeket adja vissza (nem a felhasználó által megadott formát), így az itt visszaadott, szöveges reprezentációt elmenthetjük és is_raw=True
kapcsolóval felhasználhatjuk egy másik Intents() példány inicializálásakor.
- Több, különböző attribútum megadásával jobban körülhatárolható, hogy mely ragozott formákat, milyen kontextusban szeretnénk megtalálni.
- Szótöveken kívül, saját reguláris kifejezések is megadhatóak
stem
-ként ainc
ésexc
attribútumok esetén is. -
prefix
ésaffix
elemek egyszerre megadhatóak. - Amennyiben a ragozás megváltoztatná a megadott szótövet, adjunk meg további elemeket az intenció listában és deklaráljunk a
"match_stem" : False
attribútummal olyan formákat, amelyeket önállóan állva nem, de ragozott formában már hajlandóak vagyunk találatként elfogadni. - Amennyiben nem vagyunk biztosak abban, hogy egy adott formát a deklarációink alapján egyezésként detektálnak-e majd a funkciók, próbáljuk ki manuálisan.
- Ha valamilyen gépi tanulási rendszerhez használjuk a Lara funkcióit, célszerű új verziók megjelenésével magát a generált modelleket is frissíteni.
- Gyorsítótárazásról ezen a lapon olvashatsz.