def _determineVerbChainContextualAmbiguity( clauseTokens, clauseID, foundChains ):
    '''
         Meetod, mis püüab otsustada iga leitud verbiahela (foundChains liikme) puhul, kas 
        osalauses leidub veel vabu verbe, millega verbiahelat oleks võimalik täiendada;
         Kui vabu verbe ei leidu, muudab verbiahela OTHER_VERBS väärtuse negatiivseks, vastasel 
        juhul ei tee midagi.
         Sisend 'clauseTokens' on list, mis sisaldab yhe osalause k6iki s6nu (pyvabamorfi poolt
        tehtud s6na-analyyse), clauseID on vastava osalause indentifikaator; 
    '''
    verb      = WordTemplate({POSTAG:'V'})
    verbOlema = WordTemplate({POSTAG:'V', ROOT:'^(ole)$'})
    verbSaama = WordTemplate({POSTAG:'V', ROOT:'^(saa)$'})
    verbEiAra = WordTemplate({ROOT:'^(ära|ei)$',FORM:'neg.*',POSTAG:'V'})
    verbInf        = WordTemplate({POSTAG:'V', FORM:'^(da|des|ma|tama|ta|mas|mast|nud|tud|v|mata)$'})
    regularVerbInf = WordTemplate({POSTAG:'V', FORM:'^(da|ma|maks|mas|mast|mata)$'})
    olemaVerbInf   = WordTemplate({POSTAG:'V', FORM:'^(nud|tud|da|ma|mas|mata)$'})
    saamaVerbInf   = WordTemplate({POSTAG:'V', FORM:'^(tud|da|ma)$'})
    sonaMitte = WordTemplate({ROOT:'^mitte$',POSTAG:'D'})
    # J22dvustame s6nad, mis kuuluvad juba mingi tuvastatud verbifraasi koosseisu
    annotatedWords = []
    for verbObj in foundChains:
        if (len(verbObj[PATTERN])==1 and re.match('^(ei|ära|ega)$', verbObj[PATTERN][0])):
            # V2lja j22vad yksikuna esinevad ei/ära/ega, kuna need tõenäoliselt ei sega
            continue
        annotatedWords.extend( verbObj[PHRASE] )
    finVerbs      = [t for t in clauseTokens if verb.matches(t) and not verbInf.matches(t) ]
    negFinVerbs   = [t for t in finVerbs if verbEiAra.matches(t)]
    looseNegVerbs = [t for t in negFinVerbs if t[WORD_ID] not in annotatedWords]
    #
    #  Kontrollime, milline on osalause finiitverbiline kontekst. Kui seal on mingi potentsiaalne
    # segadus, jätamegi küsimärgid alles / kustutamata.
    #
    if len(negFinVerbs)==0 and len(finVerbs) >= 2:
        #  *) Kui negatiivseid finiitverbe pole, aga positiivseid on rohkem kui 2, jääb 
        #     praegu lahtiseks, mis seal kontekstis toimub. Jätame kõik küsimärgiga;
        return
    elif len(looseNegVerbs) > 0:
        #  *) Kui leidub negatiivseid finiitverbe, mida pole 6nnestunud pikemaks ahelaks
        #     pikendada, jääb samuti lahtiseks, mis seal kontekstis toimub. Jätame kõik
        #     küsimärgiga;
        return
    elif not looseNegVerbs and negFinVerbs and len(negFinVerbs)-len(finVerbs)>0:
        #  *) Kui negatiivseid verbe leidub rohkem, kui positiivseid, j22b ka lahtiseks,
        #     mis seal kontekstis täpselt toimub. NB! Mineviku eitus jääb paraku samuti
        #     lahtiseks, aga praegu ei oska selle vältimiseks lihtsat reeglit anda;
        return
    rVerbFreeVerbs = None
    olemaFreeVerbs = None
    saamaFreeVerbs = None
    for verbObj in foundChains:
        #
        #    Vaatame verbe, mille osalausekontekstis on teisi (infiniit)verbe; Kui kontekstis 
        #   ei leidu vabu (potentsiaalselt liituda võivaid verbe), märgime konteksti vabaks.
        #   Nt. alltoodud kontekstis ei ole märgitud verbidele enam yhtki teist verbi 
        #       liita (kuigi kontekstis leidub teisi infiniitverbe):
        #
        #         1920 vastu võetud Tallinna tehnikumi põhikiri kaotas_0 kehtivuse .
        #         kuid häirest haaratud õunad nakatuvad_0 kiiresti mädanikesse ,
        #
        if verbObj[CLAUSE_IDX] == clauseID and verbObj[OTHER_VERBS]:
            contextClear = False
            #
            #   Leiame viimasele s6nale vastava token'i, selle lemma ja vormitunnuse
            #
            lastToken = [ token for token in clauseTokens if token[WORD_ID] == verbObj[PHRASE][-1] ]
            lastToken = lastToken[0]
            analyses  = [ lastToken[ANALYSIS][j] for j in range(len(lastToken[ANALYSIS])) if j in verbObj[ANALYSIS_IDS][-1] ]
            mainVerb  = [ analysis[ROOT] for analysis in analyses ]
            mainVerbLemma = mainVerb[0]
            #
            #   Leiame, millised verbid on veel vabad (st v6ivad potentsiaalselt rektsiooni-
            #  seoses liituda); 'saama' ja 'olema' verbide puhul on potentsiaalsed liitujad
            #  natuke teistsugused kui ylej22nud verbidel;
            #
            if 'saa' == mainVerbLemma:
                if saamaFreeVerbs == None:
                    saamaFreeVerbs = [t[WORD_ID] for t in clauseTokens if saamaVerbInf.matches(t) and t[WORD_ID] not in annotatedWords]
                if not saamaFreeVerbs:
                    contextClear = True
            elif 'ole' == mainVerbLemma:
                if olemaFreeVerbs == None:
                    olemaFreeVerbs = [t[WORD_ID] for t in clauseTokens if olemaVerbInf.matches(t) and t[WORD_ID] not in annotatedWords]
                if not olemaFreeVerbs:
                    contextClear = True
            else:
                if rVerbFreeVerbs == None:
                    rVerbFreeVerbs = [t[WORD_ID] for t in clauseTokens if regularVerbInf.matches(t) and t[WORD_ID] not in annotatedWords]
                if not rVerbFreeVerbs:
                    contextClear = True
            #
            #   Kui yhtegi vaba verbi ei leidunud, märgime konteksti puhtaks
            #
            if contextClear:
                verbObj[OTHER_VERBS] = False
Meetod, mis püüab otsustada iga leitud verbiahela (foundChains liikme) puhul, kas 
        osalauses leidub veel vabu verbe, millega verbiahelat oleks võimalik täiendada;
         Kui vabu verbe ei leidu, muudab verbiahela OTHER_VERBS väärtuse negatiivseks, vastasel 
        juhul ei tee midagi.
         Sisend 'clauseTokens' on list, mis sisaldab yhe osalause k6iki s6nu (pyvabamorfi poolt
        tehtud s6na-analyyse), clauseID on vastava osalause indentifikaator;