docs: 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