Skip to content

Intents_examples

Nagyfi Richárd edited this page Mar 29, 2018 · 3 revisions

This Wiki page is in Hungarian 🇭🇺

A Lara egy magyar nyelvű, alacsony számítási igényű szövegfeldolgozó osztály Python 3 alá, rövid szöveges üzenetek kulcsszavainak kinyerésére. Automatizálva megállapíthatjuk a szöveg szándékát, úgy, hogy egy dictionary-ben szándékokat definiálunk, amelyekhez a hozzájuk tarrtozó szavak listáját rendeljük. Az elfogadott szavak ezen listájában elegendő a szó szótövét és annak szófaját definiálnunk. Ezek alapján az osztály olyan reguláris kifejezéseket hoz létre, amelyek az adott szótő majdnem minden szófajának megfelelő ragozott alakját képes azonosítani a folyószövegben.

A következő példában 3 szándékot definiálunk, amelyekhez 1-1 szótövet és azok szófajait társítjuk. Az osztály a példamondatban megtalálja ezeket a szándékokat, annak ellenére, hogy a megadott szavak ragozott formában vannak.

import lara
alma_intents	= {
	"alma"		: [{"stem":"alma","wordclass":"noun"}],
	"szed"		: [{"stem":"szed","wordclass":"verb"}],
	"piros"		: [{"stem":"piros","wordclass":"adjective"}]
}
alma_test		= lara.parser.Intents(alma_intents)
print(alma_test.match("Mikor szedjük le a pirosabb almákat?"))

>>> {'alma': 1, 'szed': 2, 'piros': 2}

*A pontozásnál az 'alma' csak 1 pontot kapott, ugyanis nem a megadott szótövet sikerült megtalálni, hanem annak egy megváltozott formáját. A definiálható attribútumokról és a pontozás működéséről a dokumentációban olvashatsz bővebben.

A szótövek mellett elő-, és utótagok is definiálhatók lista elemként. Igék (verb) definiálása esetén az alapértelmezett előtagok a gyakori igekötők.

import lara
busz_intents	= {
	"palyaudvar"	: [{"stem":"pályaudvar","wordclass":"noun","prefix":["busz"]}],
	"auto"		: [{"stem":"autó","wordclass":"noun","affix":["busz"]}],
	"szinten_jo"	: [{"stem":"pálya","wordclass":"noun","prefix":["busz"],"affix":["udvar"]}]
}
busz_test		= lara.parser.Intents(busz_intents)
print(busz_test.match("Lassan beérünk az autóval a pályaudvarra."))
print(busz_test.match("Lassan beérünk az autóbusszal a buszpályaudvarra."))

>>> {'palyaudvar': 2, 'auto': 2, 'szinten_jo': 2}
>>> {'palyaudvar': 2, 'auto': 1, 'szinten_jo': 2}

Teljes-, és részlegeshasonlulás, szótövek megváltozása esetén a szkript nem képes automatikusan, önmagától lekezelni a ragozott formákat. Ebben az esetben az új, megváltozott szótöveket is definiálnunk kell. A "match_stem" kapcsoló segítségével definiálhatunk olyan szótöveket, amelyeket önmagukban állva nem, de tovább ragozva már elfogad az osztály találatként. Az alábbi példában az eszik ige ragozott alakjait találjuk meg, az "esz" és "en" morfémák segítségével, de az "esz" és "en" szavakat nem fogadjuk el találatként.

import lara
hasonul_intents	= {
	"enni"		: [{"stem":"esz","wordclass":"verb","match_stem":False}, {"stem":"en","wordclass":"verb","match_stem":False}]
}
hasonul_test		= lara.parser.Intents(hasonul_intents)
print(hasonul_test.match("Tőmorfémák: esz, en.")) # nem veszi figyelembe
print(hasonul_test.match("Eszel valamit?"))
print(hasonul_test.match("Azt nem lehet megenni."))

>>> {}
>>> {'enni': 2}
>>> {'enni': 2}

Előfordulhat, hogy szókapcsolatok megtalálására van szükségünk a szándékok értelmezéséhez. Ebben az esetben a inc változóban további szándékokat, szavakat definiálhatunk. A pontozás beállításával definiálhatunk olyan eseteket is, amikor egy szó önmagában állva nem elegendő, de más szavakkal együtt már elfogadottá válik.

import lara
egyutt_intents	= {
	"jo_ido"	: [{"stem":"jó","wordclass":"adjective",
				"inc":[{"stem":"idő","wordclass":"noun","affix":["járás"]}, {"stem":"meleg","wordclass":"adjective"}]}]
}
egyutt_test		= lara.parser.Intents(egyutt_intents)
print(egyutt_test.match("Jó.")) # nem veszi figyelembe
print(egyutt_test.match("Meleg van."))	# nem veszi figyelembe
print(egyutt_test.match("Milyen az időjárás?"))	# nem veszi figyelembe
print(egyutt_test.match("Jó meleg van."))
print(egyutt_test.match("Jó az idő."))
print(egyutt_test.match("Jó meleg az idő."))  # dupla pont
print(egyutt_test.match("Jó meleg az időjárás.")) # dupla pont

>>> {}
>>> {}
>>> {}
>>> {'jo_ido': 2}
>>> {'jo_ido': 2}
>>> {'jo_ido': 4}
>>> {'jo_ido': 4}

Hasonlóan, definiálhatunk olyan szavakat is, amelyek megjelenésekor figyelmen kívül hagyjuk az egész szándékot.

import lara
kulon_intents	= {
	"jobb_ido"	: [{"stem":"jó","wordclass":"adjective",
				"inc":[{"stem":"idő","wordclass":"noun","affix":["járás"]}, {"stem":"meleg","wordclass":"adjective"}],
				"exc":[{"stem":"este","wordclass":"noun"}]}]
}
kulon_test		= lara.parser.Intents(kulon_intents)
print(kulon_test.match("Jó."))  # nem veszi figyelembe
print(kulon_test.match("Jó meleg az időjárás."))  # dupla pont
print(kulon_test.match("Jó estét!"))  # nem veszi figyelembe
print(kulon_test.match("Jó meleg esténk van!")) # szintén nem veszi figyelembe

>>> {}
>>> {'jobb_ido': 4}
>>> {}
>>> {}

Fontos megjegyezni, hogy olyan szavakat is elfogadhat az osztály, amelyek ragozott vagy ragozatlan alakjai megegyeznek más szavak ragozott vagy ragozatlan alakjaival. Hasonlóan, nem értelmes, de nyelvtani szabályok szerint lehetséges ragozást és egyes esetekben a reguláris kifejezések miatt teljesen értelmetlen szavakat is elfogadhat az osztály találatként!

import lara
fals_pozitiv	= {
	"megszerel"	: [{"stem":"szerel","wordclass":"verb"}],
	"hibasan"	: [{"stem":"alma","wordclass":"noun"}],
}
hibas_test		= lara.parser.Intents(fals_pozitiv)
print(hibas_test.match("Gyönyörű dolog a szerelem!")) # elfogadja hibásan
print(hibas_test.match("Ezt is elfogadja találatként: Almainüdböz"))  # elfogadja hibásan

>>> {'megszerel': 2}
>>> {'hibasan': 2}
Clone this wiki locally