Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • thfr/taivutin
1 result
Show changes
Commits on Source (2)
......@@ -11,8 +11,8 @@ class Arvain():
```python
syöte_sanat["risti"] = {
"tn": "5" # Taivutusnumero merkkijonona, valinnainen; kaikki yli taivutusluokan 51 hylätään (ei nomineja)
"av": "-" # Astevaihteluluokka tai viiva, valinnainen
"tn": "5", # Taivutusnumero merkkijonona, valinnainen; kaikki yli taivutusluokan 51 hylätään (ei nomineja)
"av": "-", # Astevaihteluluokka tai viiva, valinnainen
}
```
......@@ -20,9 +20,11 @@ class Arvain():
```python
syöte_nimet["Päivyt"] = {
"tn": "43" # Taivutusnumero merkkijonona, pakollinen; kaikki yli taivutusluokan 51 hylätään (ei nomineja)
"av": "-" # Astevaihteluluokka tai viiva, pakollinen
}```
"tn": "43", # Taivutusnumero merkkijonona, pakollinen; kaikki yli taivutusluokan 51 hylätään (ei nomineja)
"av": "-", # Astevaihteluluokka tai viiva, pakollinen
"sointu": "ETU" # Vokaalisointuluokka merkkijonona, joko "ETU" tai "TAKA", pakollinen
}
```
"""
self.sanat = {}
......@@ -79,7 +81,7 @@ class Arvain():
"""
Arvaa sanan taivutusluokan. Hyväksyy joukon käytöstä hieman muokkaavia nimettyjä parametreja.
* `tilastollisesti` (totuusarvo, oletusarvoisesti tosi): Jos tosi, katsotaan kaikki sellaiset sanat, joilla on yhtä pitkä yhteinen suffiksi haettavan kanssa kuin sanalla, jolla on pisin yhteinen suffiksi haettavan kanssa. Näillä sanoilla esiintyvistä taivutusmuodoista valitaan todennäköisin. Esimerkiksi jos haettava sana on teeri (26) ja löydetään sanat ukkoteeri (26), sihteeri (6) ja valtiosihteeri (6), niin tilastollinen haku valitsee yleisimmän taivutusluokan (26, esiintyy kahdesti). Jos `tilastollisesti` on epätosi, valitaan ennustamattomasti (vaikkei välttämättä umpimähkään) jokin sanoista, esimerkiksi sihteeri (6) ja palautetaan sen taivutusluokka. Jos löydetään suora osuma (eli sanakirjassa olisi teeri (6)), valitaan sen mukainen taivutusluokka riippumatta siitä, minkä arvon `tilastollisesti` saa.
* `tilastollisesti` (totuusarvo, oletusarvoisesti tosi): Jos tosi, katsotaan kaikki sellaiset sanat, joilla on yhtä pitkä yhteinen suffiksi haettavan kanssa kuin sanalla, jolla on pisin yhteinen suffiksi haettavan kanssa. Näillä sanoilla esiintyvistä taivutusmuodoista valitaan todennäköisin. Esimerkiksi jos haettava sana on teeri (26) ja löydetään sanat ukkoteeri (26), sihteeri (6) ja valtiosihteeri (6), niin tilastollinen haku valitsee yleisimmän taivutusluokan (26, esiintyy kahdesti). Jos `tilastollisesti` on epätosi, valitaan ennustamattomasti (vaikkei välttämättä umpimähkään) jokin sanoista, esimerkiksi sihteeri (6) ja palautetaan sen taivutusluokka. Jos löydetään lupaava osuma (eli sanakirjassa olisi teeri (6) tai jos haettaessa sanaa ilmapallo (1) löydetään sen suffiksi pallo (1)), valitaan sen mukainen taivutusluokka riippumatta siitä, minkä arvon `tilastollisesti` saa.
* `nimi` (totuusarvo, oletusarvoisesti tosi): Jos tosi, tarkistetaan ensin nimihakurakenne suoran osuman varalta. Jos epätosi, ei tarkasteta nimihakurakennetta. Tämä on hyödyllistä esimerkiksi luontonimien tapauksessa, jossa voidaan haluta erisnimimäinen (Meri - Merin) tai yleissanamainen (Meri - Meren) taivutus.
"""
......@@ -115,29 +117,41 @@ class Arvain():
return self.normalisoi_konsonanttiloppuiset(sana, taivutus)
def sointuluokka_yksinkertaiselle(self, sana):
last_front = -1
last_back = -1
last_middle = -1 # Unused at this time
lowered = sana.lower()
for i in range(len(sana))[::-1]:
if last_front == -1 and lowered[i] in "äöy":
last_front = i
elif last_back == -1 and lowered[i] in "aouå":
last_back = i
elif last_middle == -1 and lowered[i] in "ie":
last_middle = i
if last_back > last_front:
"""
Päättelee vokaalisointuluokan sanalle sillä oletuksella, ettei se ole yhdyssana. Tieto on tarpeen, jos sijapäätteeseen tulee a tai ä: talossa / esimerkissä.
Tämän se tekee etsimällä sanan viimeisen etu- (äöy) ja takavokaalin (aouå). Jos sanasta löytyy takavokaali viimeisimmän etuvokaalin jälkeen (tai löytyy ylipäänsä, sikäli kuin etuvokaaleja ei ole), on sana takavokaalinen (talossa).
Muussa tapauksessa sana on etuvokaalinen (esimerkissä).
"""
viimeinen_etu = -1
viimeinen_taka = -1
pienellä = sana.lower()
for i in range(len(sana)):
if pienellä[i] in "äöy":
viimeinen_etu = i
elif pienellä[i] in "aouå":
viimeinen_taka = i
if viimeinen_taka > viimeinen_etu:
return "TAKA"
else:
return "ETU"
def arvaa_sointuluokka(self, sana, **kwargs):
kwargs = {"hiljaa": True} | kwargs
"""
Päättelee vokaalisointuluokan sanalle yleisessä tapauksessa. Hyväksyy joukon metodin käytöstä muokkaavia nimettyjä parametreja.
* `hiljaa` (totuusarvo, oletusarvoisesti tosi): jos epätosi, tulostaa virheenkorjausviestejä siitä, miten tehtyyn arvaukseen päädyttiin.
* `nimi` (totuusarvo, oletusarvoisesti tosi): tarkistaa aluksi nimisanakirjan suoran tai yhdyssanaosuman varalta. Esimerkiksi moni englantilaisperäinen y-kirjaimeen päättyvä nimi ääntyy i-äänteeseen päättyvänä ja seuraakin takavokaalista vokaalisointua.
Nimisanakirjan tarkistamisen (tai tarkistamatta jättämisen) jälkeen etsitään mahdollista suffiksisanaa: jos haetaan sanaa maantie (etuvokaalisointu), on hyödyllistä havaita sen olevan yhdyssana, joka loppuu sanaan tie (etuvokaalisointu). Jos kyseessä ei olisi yhdyssana, sen alkuosassa oleva pitkä a-äänne tekisi siitä takavokaalisen, siis maantie - maantieta eikä maantietä. Viimeiseksi päätellylle komponentille (joka saattaa olla koko sana, mikäli kyseessä ei ole yhdyssana) arvataan sitten sointuluokka metodilla `sointuluokka_yksinkertaiselle`.
"""
kwargs = {"hiljaa": True, "nimi": True} | kwargs
# Jos ei erikseen kielletty nimeä, katsotaan nimiosumat
if not "nimi" in kwargs.keys() or kwargs["nimi"]:
if kwargs["nimi"]:
loppuosa = sana.split("-")[-1].split(" ")[-1]
if loppuosa in self.nimet.keys():
return self.nimet[loppuosa]["sointu"]
......