Blob Blame History Raw
# -*- coding: utf-8 -*-

# Copyright 2007-2009, 2013 Hannu Väisänen (Etunimi.Sukunimi@uef.fi
# Program to generate lexicon files for Suomi-malaga Sukija edition.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA


# This code is heavily based on code written by Harri Pitkänen.

import codecs
import generate_lex_common
import hfconv
import voikkoutils
import re
import sys


# Historical inflections in alphabetical order.
historical = [
	(u'aavistaa', u'sw', [(u'tt',u'(.*O)ittAA',u'kirjoittaa'),
			      (u'tt',u'(.*O)ttAA',u'ammottaa'),
			      (None,u'(.*t)AA',u'aavistaa'),
			      (u'tt',u'(.*eUt)tAA',u'kuluttaa'),
			      (u'tt',u'(.*[AeiU]t)tAA',u'alittaa'),
			      (u't',u'(.*h)tAA',u'astahtaa')]),
	(u'ahven',    u'ws', [(None,u'(.*CVC)',u'ahven')]),
	(u'altis',    u'ws', [(None, u'(.*t)is', u'altis')]),
	(u'antautua', u'sw', [(u't',u'(.*)tUA',u'antautua')]),
	(u'arvailla',   u'-',  [(None,u'(.*[AOU]])illA',u'arvailla')]),
	(u'arvelu',   u'sw', [(None,u'(.*e)istO',u'aarteisto')]),
	(u'autio', u'-', [(None,u'(..*C)aatio',u'obligaatio'),
			  (None,u'(..*C)uutio',u'resoluutio'),
			  (None,u'(..*C)uusio',u'illuusio'),
			  (None,u'(..*C)itio',u'traditio'),
			  (None,u'(.*)ktio',u'funktio'),
			  (None,u'(.*)',u'autio')]),
        (u'banaali',  u'sw', [(None,u'(..*[^aeouyäö]o)di',u'symboli_di'),
			      (None,u'(..*[^aeouyäö]o)fi',u'symboli_fi'),
			      (None,u'(..*[^aeouyäö]o)gi',u'symboli_gi'),
			      (None,u'(..*[^aeouyäö]o)li',u'symboli_li'),
			      (None,u'(..*[^aeouyäö]o)mi',u'symboli_mi'),
			      (None,u'(..*[^aeouyäö]o)ni',u'symboli_ni'),
			      (None,u'(..*[^aeouyäö]o)ri',u'symboli_ri'),
			      (None,u'(..*[^aeouyäö]o)vi',u'symboli_vi'),
			      (None,u'(..*a)di',u'balladi'),
			      (None,u'(pisto)oli',u'pistooli'),
			      (None,u'(poli)isi',u'poliisi'),
			      (None,u'(.*)i',u'banaali'),
                              (u'nt',u'(.*n)ti',u'hollanti'),
			      (u'nk',u'(.*n)ki',u'killinki'),
			      (u'kk',u'(.*k)ki',u'kajakki'),
			      (u'tt',u'(.*t)ti',u'salaatti'),
			      (u'pp',u'(.*p)pi',u'sinappi'),
			      (u't',u'(.*)ti',u'konvehti') ]),
        (u'bébé', u'-', [(None,u'(.*V)',u'bébé')]),
        (u'haastaa', u'sw', [(None,u'(.*Ct)AA',u'haastaa')]),
	(u'hame', u'ws', [(u't',u'(..*CO)ite',u'osoite'),
			  (u't',u'(..*CO)te',u'tiedote')]),
	(u'herttua', u'-', [(None,u'(.*tU)A',u'herttua')]),
	(u'hohtaa',  u'sw', [(u'tt',u'(.*t)tAA',u'heittää')]),
	(u'huutaa', u'sw', [(u'nt',u'(.*Vn)tAA',u'alentaa'),
			(u't',u'(.*V)tAA',u'huutaa')]),
	(u'iäkäs',   u'ws', [(u'k',u'(.*[mntv]e)ikAs',u'maineikas'),
			     (u'k',u'(.*k)As',u'iäkäs')]),
        (u'kaihtaa', u'sw', [(u't',u'(.*)tAA',u'kaihtaa')]),
	(u'kaivaa',     u'sw', [(None,u'(.*aj)AA',u'ajaa')]),
        (u'kantaja', u'-', [(None,u'(.*)jA',u'kantaja')]),
	(u'katsella',   u'ws', [(None,u'(.*[AOU])illA',u'arvailla')]),
        (u'kirjoitella', u'ws', [(None,u'(...*O)itellA',u'kilvoitella'),
                                 (None,u'(.*O)tellA',u'ilotella')]),
        (u'kirjoittaa', u'sw', [(u'tt',u'(.*O)ittAA',u'kirjoittaa'),
				(u'tt',u'(.*O)ttAA',u'ammottaa'),
				(u'tt',u'(.*[AeiU]t)tAA',u'asettaa')]),
        (u'karahka', u'-', [(None,u'(.*lo)gia',u'analogia'),
			    (None,u'(.*so)fia',u'filosofia'),
			    (None,u'(.*gra)fia',u'topografia')]),
        (u'koiras', u'ws', [(None,u'(.*A)s',u'koiras')]),
	(u'kohota', u'ws', [(u'k',u'(.*ik)OtA',u'laota'),
			    (u'k',u'(.*Vk)OtA',u'saota'),
			    (u'>k',u'(hi|la)OtA',u'laota'),
			    (u'>k',u'(C[AiU])OtA',u'saota')]),
	(u'kulkija', u'-', [(None,u'(.*lo)gia',u'analogia'),
			    (None,u'(.*so)fia',u'filosofia'),
			    (None,u'(.*gra)fia',u'topografia')]),
        (u'kuollut', u'-', [(None,u'(.*neits)yt',u'neitsyt'),
			    (None,u'(.*C)lUt',u'kuollut'),
			    (None,u'(.*)nUt', u'punonut'),
			    (None,u'(.*C)rUt',u'purrut'),
			    (None,u'(.*C)sUt',u'juossut')]),
	(u'kutiaa', u'-',  [(None,u'(.*Cia)a',u'kutiaa')]),
        (u'laittaa', u'sw', [(u'tt',u'(.*t)tAA',u'laittaa')]),
	(u'lampi', u'-',   [(None,u'(.*kam)pi',u'lampi')]),
	(u'lovi', u'sw',   [(None,u'(rips|sin)i',u'kiiski')]),
	(u'nainen', u'-', [(None,u'(hevo)nen',u'hevoinen'),
			   (None,u'(.*Co)rinen',u'allegorinen'),
			   (None,u'(.*Co)finen',u'filosofinen'),
			   (None,u'(.*Co)ginen',u'psykologinen'),
			   (None,u'(.*Co)ninen',u'ironinen'),
			   (None,u'(.*gra)finen',u'topografinen'),
			   (None,u'(.*(?:aa|ee|ii|oo|uu|yy|ää|öö)p)pinen',u'eeppinen'),
			   (None,u'(.*(?:aa|ee|ii|oo|uu|yy|ää|öö)t)tinen',u'kriittinen'),
			   (None,u'(.*(?:aa|ee|ii|oo|uu|yy|ää|öö)k)kinen',u'psyykkinen'),
			   (None,u'(.*[ts]i)ivinen',u'relatiivinen'),  # Myös massi(i)vinen yms.
			   (None,u'(.*)nen',u'nainen')]),
	(u'neiti', u'sw', [(u't',u'(.*)ti',u'neiti')]),
        (u'nuori', u'-', [(None,u'(.*C)i',u'nuori')]),
	(u'onneton', u'ws', [(None,u'(.*)tOn',u'alaston'),
			     (u't',u'(.*)tOn',u'onneton')]),
        (u'paahtaa', u'sw', [(u't',u'(.*)tAA',u'paahtaa')]),
        (u'paistaa', u'sw', [(None,u'(.*C)AA',u'paistaa')]),
        (u'palata', u'ws', [(None,u'(.*)AtA',u'palata')]),
        (u'palaa', u'ws', [(None,u'(.*C)AA',u'palaa')]),
        (u'paperi',  u'sw', [(None,u'(..*[^aeouyäö]o)di',u'symboli_di'),
			     (None,u'(..*[^aeouyäö]o)fi',u'symboli_fi'),
			     (None,u'(..*[^aeouyäö]o)gi',u'symboli_gi'),
			     (None,u'(..*[^aeouyäö]o)li',u'symboli_li'),
			     (None,u'(..*[^aeouyäö]o)mi',u'symboli_mi'),
			     (None,u'(..*[^aeouyäö]o)ni',u'symboli_ni'),
			     (None,u'(..*[^aeouyäö]o)ri',u'symboli_ri'),
			     (None,u'(..*[^aeouyäö]o)vi',u'symboli_vi'),
			     (None,u'(kam)ari',u'kamari'),
			     (None,u'(pisto)oli',u'pistooli'),
			     (None,u'(poli)isi',u'poliisi'),
			     (None,u'(..*a)di',u'balladi')]),
        (u'pasuuna', u'sw', [(None,u'(.*)A',u'pasuuna')]),
	(u'punoa',   u'sw', [(u't',u'(...*AU)tUA',u'antautua')]),
	(u'rakentaa', u'-', [(None,u'(.*n)tAA',u'rakentaa')]),
        (u'risti',   u'sw', [(None,u'(..*[^aeouyäö]o)di',u'telefoni_di'),
			     (None,u'(..*[^aeouyäö]o)fi',u'telefoni_fi'),
			     (None,u'(..*[^aeouyäö]o)gi',u'telefoni_gi'),
			     (None,u'(..*[^aeouyäö]o)li',u'telefoni_li'),
			     (None,u'(..*[^aeouyäö]o)mi',u'telefoni_mi'),
			     (None,u'(..*[^aeouyäö]o)ni',u'telefoni_ni'),
			     (None,u'(..*[^aeouyäö]o)ri',u'telefoni_ri'),
			     (None,u'(..*[^aeouyäö]o)vi',u'telefoni_vi'),
		             (None,u'(..*gr)afi',u'biografi'),
			     (None,u'(..*)adi',u'marinadi'),
			     (None,u'(..*)idi',u'pyramidi'),
			     (u't',u'(tä|äi)ti',u'äiti')]),
        (u'siivota', u'ws', [(None,u'(.*O)tA',u'siivota')]),
	(u'sydän', u'-', [(None,u'(.*A)n',u'sydän')]),
        (u'taittaa', u'sw', [(u'tt',u'(.*t)tAA',u'taittaa')]),
	(u'tulla', u'ws', [(None,u'(.*Vl)lA',u'tulla')]),
        (u'tuomi', u'-', [(None,u'(.*V)mi',u'tuomi')]),
	(u'uros', u'-', [(None,u'(.*)s',u'uros')]),
	(u'terve', u'-',[(None,u'(.*)',u'terve')]),
	(u'valmis',u'ws', [(None,u'(.*)is',u'valmis')]),
	(u'vastaus', u'-', [(None,u'(lootu)s',u'vastaus'),
			    (None,u'(..*CO)itUs',u'aivoitus'),
			    (None,u'(...*O)tUs',u'jaotus'),
			    (None,u'(.*V)s',u'vastaus'),]),
	(u'veranta', u'sw', [(u'nt',u'(.*n)tA',u'veranta')]),
	(u'vieras',  u'ws', [(None,u'(.*[lr]iA)s',u'utelias'),
			     (u'k',u'(.*mek)As',u'iäkäs'),
			     (u'k',u'(.*k)As',u'varas')]),
	(u'vihanta', u'sw', [(u'nt',u'(.*n)tA',u'vihanta')]),
        (u'virkkaa', u'sw', [(u'kk',u'(.*k)kAA',u'virkkaa')])
        ]

classmap = hfconv.compileClassmapREs(historical)
classmap.extend(hfconv.compileClassmapREs(hfconv.modern_classmap))

pattern = u"^(?P<alku>.*)(?:" + \
	  u"(?P<keltainen>C[aouyäö]i?nen)|" + \
	  u"(?P<symboli_ym>[^aeouyäö]o[dfglmnrv]i)|" + \
	  u"(?P<maineikas>[mntv]eikAs)" + \
          u")$"

pattern = pattern.replace(u"A", u"[aä]")
pattern = pattern.replace(u"O", u"[oö]")
pattern = pattern.replace(u"U", u"[uy]")
pattern = pattern.replace(u"C", u"[bcdfghjklmnpqrstvwxzšžçðñþß]")
rx = re.compile(pattern, re.IGNORECASE)

begin = u"(amerikan|jälleen|tiibetin|uudelleen).+"
rx_begin = re.compile(begin, re.IGNORECASE)

end = u".+(herkkä|pöllö|valmis)"
rx_end = re.compile(end, re.IGNORECASE)


#print pattern


# Sanat, jotka tunnistetaan Sukija-versiossa automaagisesti toisten
# sanojen johdoksina. Tällaiset sanat pitäisi merkitä Joukahaisen
# sanastoon lipulla ei kuulu indeksointisanastoon.
#
# Niiden lisäksi Sukijassa ei tarvita erisnimiä, jotka ovat myös
# yleisnimiä. Kuitenkin mukaan pitää ottaa sellaiset sanat, jotka
# taipuvat eri tavalla yleis- ja erisniminä. Esim. Lempi, Lempin;
# lempi, lemmen.
#
# Sanaluettelon saa näin:
# grep '<form>' ../*/*xml | sed -e "s@</\?form>@@g" | sort
#
words = []
inputfile = codecs.open ('sukija/ei-sukija.txt', 'r', 'UTF-8')
while True:
	word = inputfile.readline()
	if (len(word) == 0):
		break
	if (word[0] == '#'):
		continue;
	word = word[:-1]      # Poistetaan \n sanan lopusta.
#	print (word)
	words.append (word)


# Aksentilliset kirjaimet UTF-8 -merkistössä 0000-017F,
# ei kuitenkaan merkkejä š ja ž.
#
# C0 Controls and Basic Latin.        Range: 0000-007F
# C1 Controls and Latin-1 Supplement  Range: 0080-00FF
# Latin Extended-A                    Range: 0100-017F
#
# C0 on sama kuin ASCII, C0+C1 on sama kuin ISO-8859-1.
#
# Kirjaimet å, ä ja ö eivät ole aksentillisia kirjaimia suomen kielessä.
#
accents = u"ÀÁÂÃÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕØÙÚÛÜÝÞßàáâãæçèéêëìíîïðñòóôõøùúûüýþÿ" + \
          u"ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸ" + \
	  u"ĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżſ"

replace = u"AAAAÆCEEEEIIIIDNOOOÖÖUUUUYÞßaaaaæceeeeiiiidnoooööuuuuyþy" + \
          u"AaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiIJijJjKkk" + \
	  u"LlLlLlLlLlNnNnNnnNnOoOoÖöŒœRrRrSsSsSsTtTtTtUuUuUuUuYyUuWwYyYZzZzs"

rx_accents = re.compile (u"[" + accents + u"]")


# Jaetaan sana tavuihin. Esim.
# hyphenate(u"valkoinen") = val-koi-nen.
#
#
# Algoritmi: Facta-tietosanakirja (1970), osa 9, palsta 50.
#
# "(1) kaksi peräkkäistä vokaalikirjainta kuuluvat samaan tavuun
# jos ja vain jos ne ääntyvät pitkänä vokaalina tai diftongina.
#
# (2) jos konsonanttia seuraa vokaali, ne kuuluvat samaan tavuun,
# muutoin konsonantti kuuluu edellisen kirjaimen tavuun (kuitenkin
# vierasperäisen sanan kaikki alkukonsonantit kuuluvat samaan tavuun)."

# Kahden ääntiön yhdistelmät, jotka voivat olla tavussa.
A0 = [u"ei", u"ai", u"äi", u"ui", u"yi", u"oi", u"öi"]
A1 = [u"au", u"äy", u"ou", u"öy", u"iu", u"iy", u"eu", u"ey", u"uo", u"yö", u"ie"]
A1.extend(A0)
A2 = [u"aa", u"ee", u"ii", u"oo", u"uu", u"yy", u"ää", u"öö"]

V2 = A1
V2.extend(A2)

V = u"AÀÁÂÃEÈÉÊËŒÆIÌÍÎÏOÒÓÔUÙÚÛYÝÿÜÅÄÖØÕaàáâãeèéêëœæiìíîïoòóôuùúûyýÿüåäöøõ"
C = u"BCDFGHJKLMNŃPQRSTVWXZŠŽÇÐÑÞßbcdfghjklmnńpqrstvwxzšžçðñþß"


# Palautetaan True, jos sanassa on ainakin yksi ääntiö.
#
def has_vowel(s):
	for i in s:
		if (i in V):
			return 1
	return 0


# Korvataan sanasta 'word' aksenttimerkit
# aksentittomilla kohtien 'start' ja 'end' välistä.
#
def deaccent(word, start, end):
	s = u""
	for i in range(start, end):
		j = accents.find(word[i])
		if (j >= 0):
			s = s + replace[j]
		else:
			s = s + word[i]
	s = s + word[end:]
	return s


# Kirjoitetaan sana Malagan tietokantaan korvaamalla aksenttimerkit aksentittomilla (esim. á == a),
# mutta ei korvata kirjaimia š ja ž s:llä ja z:lla.
#
def write_word_without_accents(main_vocabulary, vocabulary_files, word, entry, wordform):
	if ((rx_accents.search(wordform) != None) and (wordform != u"šakki")):
		n = entry.find(u" luokka: ")
		if (n == -1):
			print("write_word_without_accents: Virhe Malaga-koodissa: " + entry + u"\n")
		entry2 = deaccent (entry, 0, n)
#		print (entry  + entry2 + u"\n")
		generate_lex_common.write_entry(main_vocabulary, vocabulary_files, word, entry2)


word_end = re.compile(u".+geeni(nen)?$")

# Hyväksytään esim. karsinogeenia ja karsinogeeniä.
#
def new_vtype (malaga_vtype, wordform):
	if (word_end.match(wordform)):
		return u"aä"
	else:
	       	return malaga_vtype

def handle_word(main_vocabulary,vocabulary_files,word):
	if generate_lex_common.has_flag(word, "not_sukija"): return

	# Get the inflection class. Exactly one inflection class is needed.
	infclasses = word.getElementsByTagName("infclass")
	voikko_infclass = None
	for infclass in word.getElementsByTagName("infclass"):
		if infclass.getAttribute("type") == "historical":
			voikko_infclass = generate_lex_common.tValue(infclass)
			break
	if (voikko_infclass in [u"antautua", u"kaihtaa", u"laittaa", u"paahtaa",
				u"taittaa", u"veranta", u"vihanta", u"virkkaa"]):
		voikko_infclass = voikko_infclass + u"-av1"
	
	if voikko_infclass == None:
		for infclass in word.getElementsByTagName("infclass"):
			if infclass.getAttribute("type") != "historical":
				voikko_infclass = generate_lex_common.tValue(infclass)
				break
	
##	if voikko_infclass == None: return
	if voikko_infclass == u"poikkeava": return
	
	# Get the word classes
	wordclasses = generate_lex_common.tValues(word.getElementsByTagName("classes")[0], "wclass")
	if wordclasses[0] != u"interjection" and voikko_infclass == None:
		return
	malaga_word_class = generate_lex_common.get_malaga_word_class(wordclasses)
	if malaga_word_class == None: return
	
	# Get malaga flags
	malaga_flags = generate_lex_common.get_malaga_flags(word)
	
	# Get forced vowel type
	if voikko_infclass == None:
		forced_inflection_vtype = voikkoutils.VOWEL_DEFAULT
	else:
		forced_inflection_vtype = generate_lex_common.vowel_type(word.getElementsByTagName("inflection")[0])


	# Get forced vowel type
###	forced_inflection_vtype = generate_lex_common.vowel_type(word.getElementsByTagName("inflection")[0])
	
	# Process all alternative forms
	for altform in generate_lex_common.tValues(word.getElementsByTagName("forms")[0], "form"):
		wordform = altform.replace(u'|', u'').replace(u'=', u'')
		if (voikko_infclass == u"nuolaista-av2") and (wordform in [u"häväistä", u"vavista"]):
			voikko_infclass = u"nuolaista"
#		print (u"Hoo " + str(voikko_infclass) + u" " + u" " + wordform + u"\n")
#		print(u"Tavutus1 " + wordform + u" " + hyphenate(wordform.lower()) + u"\n")
		(alku, jatko) = generate_lex_common.get_malaga_inflection_class(wordform, voikko_infclass, wordclasses, classmap)
#		print (u"Huu " + wordform + u" " + str(alku) + u" " + str(jatko) + u" "  + str(voikko_infclass))
		if forced_inflection_vtype == voikkoutils.VOWEL_DEFAULT:
			vtype = voikkoutils.get_wordform_infl_vowel_type(altform)
		else: vtype = forced_inflection_vtype
		if vtype == voikkoutils.VOWEL_FRONT: malaga_vtype = u'ä'
		elif vtype == voikkoutils.VOWEL_BACK: malaga_vtype = u'a'
		elif vtype == voikkoutils.VOWEL_BOTH: malaga_vtype = u'aä'
		malaga_vtype = new_vtype (malaga_vtype, wordform)
		rakenne = generate_lex_common.get_structure(altform, malaga_word_class)
		if alku == None:
			generate_lex_common.write_entry(main_vocabulary, vocabulary_files, word, \
							u"#Malaga class not found for (%s, %s)\n" \
			                   % (wordform, voikko_infclass))
			continue
		if (wordform in words):
#			print ("Ei tarvita: " + wordform)
			continue
		if (rx_begin.match(wordform) != None):
#			print ("Ei tarvita: " + wordform)
			continue
		if (rx_end.match(wordform) != None):
#			print ("Ei tarvita: " + wordform)
			continue
		# Joillakin sanoilla on sanastossa kaksi taivususkaavaa, Sukijassa
		# taivutuskaavat on yhdistetty, ja toisen taivutuskaavan voi poistaa.
		if ((wordform in [u'ori', u'ripsi', u'sini', u'täti', u'äiti']) and (jatko == u'risti')):
#			print ("Ei tarvita: " + wordform)
			continue
		if  ((wordform == u'kampi') and (jatko == u'sampi')):
#			print ("Ei tarvita: " + wordform)
			continue
		
#		nsyl = number_of_syllabels(wordform)

		m = rx.match(wordform)
		d = None

		if (m != None):
			d = m.groupdict()
		
		alku2 = u""
		jatko2 = u""
		wordform2 = u""

		alku3 = u""
		jatko3 = u""
		wordform3 = u""

		alku4 = u""
		jatko4 = u""
		wordform4 = u""

		alku5 = u""
		jatko5 = u""
		wordform5 = u""

		alku6 = u""
		jatko6 = u""
		wordform6 = u""

		s = u"lähtösana: \"" + wordform + u"\", lähtöalku: \"" + alku + u"\""

		# Korjataan alku- ja jatko-kenttien arvoja.
		#
#		elif (jatko == u"rakentaa"):
		if (jatko == u"rakentaa"):
			alku = wordform[:-4]

		# Tulostetaan.

#		print(u"Word   " + wordform + u"\n")
		entry = u'[perusmuoto: "%s", alku: "%s", luokka: %s, jatko: <%s>, äs: %s%s%s];' \
			% (wordform, alku, malaga_word_class, jatko, malaga_vtype, malaga_flags,
			   generate_lex_common.get_structure(altform, malaga_word_class))
		generate_lex_common.write_entry(main_vocabulary, vocabulary_files, word, entry)
		
		write_word_without_accents(main_vocabulary, vocabulary_files, word, entry, wordform)

		
		if (len(wordform2) > 0):
			entry = u'[perusmuoto: "%s", alku: "%s", luokka: %s, jatko: <%s>, äs: %s%s%s, %s];' \
				% (wordform2, alku2, malaga_word_class, jatko2, malaga_vtype, malaga_flags,
				   generate_lex_common.get_structure(altform, malaga_word_class), s)
			generate_lex_common.write_entry(main_vocabulary, vocabulary_files, word, entry)

		if (len(wordform3) > 0):
			entry = u'[perusmuoto: "%s", alku: "%s", luokka: %s, jatko: <%s>, äs: %s%s%s, %s];' \
				% (wordform3, alku3, malaga_word_class, jatko3, malaga_vtype, malaga_flags,
				   generate_lex_common.get_structure(altform, malaga_word_class), s)
			generate_lex_common.write_entry(main_vocabulary, vocabulary_files, word, entry)

		if (len(wordform4) > 0):
			entry = u'[perusmuoto: "%s", alku: "%s", luokka: %s, jatko: <%s>, äs: %s%s%s, %s];' \
				% (wordform4, alku4, malaga_word_class, jatko4, malaga_vtype, malaga_flags,
				   generate_lex_common.get_structure(altform, malaga_word_class), s)
			generate_lex_common.write_entry(main_vocabulary, vocabulary_files, word, entry)

		if (len(wordform5) > 0):
			entry = u'[perusmuoto: "%s", alku: "%s", luokka: %s, jatko: <%s>, äs: %s%s%s, %s];' \
				% (wordform5, alku5, malaga_word_class, jatko5, malaga_vtype, malaga_flags,
				   generate_lex_common.get_structure(altform, malaga_word_class), s)
			generate_lex_common.write_entry(main_vocabulary, vocabulary_files, word, entry)

		if (len(wordform6) > 0):
			entry = u'[perusmuoto: "%s", alku: "%s", luokka: %s, jatko: <%s>, äs: %s%s%s, %s];' \
				% (wordform6, alku6, malaga_word_class, jatko6, malaga_vtype, malaga_flags,
				   generate_lex_common.get_structure(altform, malaga_word_class), s)
			generate_lex_common.write_entry(main_vocabulary, vocabulary_files, word, entry)