diff --git a/.flake8 b/.flake8 index 478c720..eef6abc 100644 --- a/.flake8 +++ b/.flake8 @@ -15,4 +15,5 @@ ignore = exclude = __pycache__ env - .env \ No newline at end of file + .env + build/ \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 783c160..13cad3d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -28,9 +28,6 @@ jobs: python -m pip install --upgrade pip pip install flake8 if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - - name: Lint with flake8 - run: | - flake8 src/**/*.py --count --max-line-length=127 --statistics - name: Run unit tests run: | pip install pytest diff --git a/docs/asta.rst b/docs/asta.rst index ba72250..e8feef4 100644 --- a/docs/asta.rst +++ b/docs/asta.rst @@ -955,7 +955,7 @@ A029: MLU/X * iedere herhaling (**covered**, including many but not all partial repetitions) * iedere echolalie (**covered partially**) * iedere mislukte poging om te komen tot realisatie van het doelwoord (** covered partially**) - * Ik ging zitten op de kast, nee stoel, nee bank Aantal woorden voor bepalen samplegrootte = 10, MLU=6 + * Ik ging zitten op de kast, nee stoel, nee bank Aantal woorden voor bepalen samplegrootte = 10, MLU=6 * Streep /hé/, /goh/, /och/ etc. weg. (**covered**) * Uitingen die deels onverstaanbaar zijn worden in hun geheel weggelaten (eventuele lexicale maten zijn dan al wel geteld) (**covered**) diff --git a/docs/stap.rst b/docs/stap.rst index 351204c..d0e5ba8 100644 --- a/docs/stap.rst +++ b/docs/stap.rst @@ -353,7 +353,7 @@ The query is defined as //node[%new_STAP_BB_t%], where the macro *new_STAP_BB_t* %geledenBBt% or %temporal_mwu% ) and %STAP_geen_BB%) -""" + """ We discuss each of the macros used inside this query diff --git a/pyproject.toml b/pyproject.toml index d89d199..f88b490 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,4 +15,8 @@ module = [ 'xslxwriter', 'openpyxl','xlsx' ] -ignore_missing_imports = true \ No newline at end of file +ignore_missing_imports = true + + +[tool.pyright] +reportInvalidTypeForm = false \ No newline at end of file diff --git a/setup.py b/setup.py index a37f8c4..b3aa8cd 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setup( name='sastadev', - version='0.1.5', + version='0.2.0', description='Linguistic functions for SASTA tool', long_description=long_description, long_description_content_type='text/markdown', diff --git a/src/sastadev/ASTApostfunctions.py b/src/sastadev/ASTApostfunctions.py index 33dd5d7..7ea3aed 100644 --- a/src/sastadev/ASTApostfunctions.py +++ b/src/sastadev/ASTApostfunctions.py @@ -2,9 +2,9 @@ from copy import deepcopy from typing import Dict, List, Optional, Tuple -from sastadev.allresults import AllResults +from sastadev.allresults import AllResults, ResultsKey, mkresultskey from sastadev.lexicon import getwordinfo, getwordposinfo -from sastadev.sastatypes import Position, QId, SynTree, UttId +from sastadev.sastatypes import Position, SynTree, UttId from sastadev.stringfunctions import getallrealwords, realwordstring from sastadev.treebankfunctions import getattval, getnodeyield @@ -25,8 +25,23 @@ mqid = 'A020' tijdfoutpvqid = 'A041' nounlemmaqid = 'A046' +formqid = 'A047' verblemmaqid = 'A049' +nounreskey = mkresultskey(nounqid) +lexreskey = mkresultskey(lexqid) + +samplesizereskey = mkresultskey(samplesizeqid) +mluxreskey = mkresultskey(mluxqid) + +pvreskey = mkresultskey(pvqid) +delpvreskey = mkresultskey(delpvqid) +subpvreskey = mkresultskey(subpvqid) +tijdfoutpvreskey = mkresultskey(tijdfoutpvqid) +kreskey = mkresultskey(kqid) +mreskey = mkresultskey(mqid) +formreskey = mkresultskey(formqid) + specialform = 'Special Form' errormarking = 'Error Marking' @@ -108,9 +123,9 @@ def wordcountperutt(allresults): wordcounts = {uttid: sum(ctr.values()) for uttid, ctr in lemmas.items()} ignorewordcounts = deepcopy( allresults.coreresults[ - samplesizeqid]) if samplesizeqid in allresults.coreresults else Counter() # samplesize + samplesizereskey]) if samplesizereskey in allresults.coreresults else Counter() # samplesize ignorewordcounts += allresults.coreresults[ - mluxqid] if mluxqid in allresults.coreresults else Counter() # mlux + mluxreskey] if mluxreskey in allresults.coreresults else Counter() # mlux # ignorewordcounts += allresults.coreresults['A050'] if 'A050' in allresults.coreresults else Counter() # echolalie covered by mlux result = {} for uttid in wordcounts: @@ -156,7 +171,7 @@ def getcutoffpoint(allresults: AllResults, uttid: UttId, diff: int) -> int: theutt = allresults.allutts[uttid] final = diff for i, w in enumerate(theutt): - if (uttid, i + 1) in allresults.exactresults[samplesizeqid]: + if (uttid, i + 1) in allresults.exactresults[samplesizereskey]: final += 1 if i + 1 == final: break @@ -165,13 +180,13 @@ def getcutoffpoint(allresults: AllResults, uttid: UttId, diff: int) -> int: def finietheidsindex(allresults, _): allpvs = allresults.coreresults[ - pvqid] if pvqid in allresults.coreresults else Counter() + pvreskey] if pvreskey in allresults.coreresults else Counter() subpvs = allresults.coreresults[ - subpvqid] if subpvqid in allresults.coreresults else Counter() + subpvreskey] if subpvreskey in allresults.coreresults else Counter() delpvs = allresults.coreresults[ - delpvqid] if delpvqid in allresults.coreresults else Counter() + delpvreskey] if delpvreskey in allresults.coreresults else Counter() tijdfoutpvs = allresults.coreresults[ - tijdfoutpvqid] if tijdfoutpvqid in allresults.coreresults else Counter() + tijdfoutpvreskey] if tijdfoutpvreskey in allresults.coreresults else Counter() foutepvs = subpvs + delpvs + tijdfoutpvs allpvcount = sumctr(allpvs) foutepvcount = sumctr(foutepvs) @@ -186,9 +201,9 @@ def finietheidsindex(allresults, _): def countwordsandcutoff(allresults, _): # @@to be adapted result = (None, 0) - if 'A047' in allresults.postresults: + if formreskey in allresults.postresults: paddedlist = [] - for key, val in allresults.postresults['A047'].items(): + for key, val in allresults.postresults[formreskey].items(): paddedkey = key.rjust(lpad, zero) paddedlist.append((paddedkey, val)) sortedlist = sorted(paddedlist) @@ -205,29 +220,16 @@ def countwordsandcutoff(allresults, _): def KMcount(allresults, _): Kcount = sumctr( - allresults.coreresults[kqid]) if kqid in allresults.coreresults else 0 + allresults.coreresults[kreskey]) if kreskey in allresults.coreresults else 0 Mcount = sumctr( allresults.coreresults[mqid]) if mqid in allresults.coreresults else 0 result = Kcount + Mcount return result -def old_old_getlemmas(allresults, _): - allmatches = allresults.allmatches - allresults.postresults['A046'] = Counter() - for el in allmatches: - (qid, uttid) = el - if qid in ['A021', 'A018']: - for amatch in allmatches[el]: - # theword = normalizedword(amatch[0]) - theword = getattval(amatch[0], 'lemma') - allresults.postresults['A046'].update([(theword, uttid)]) - return allresults - - -def getlemmas(allresults, _): - result = getcondlemmas(allresults, _, lambda qid: qid in [nounqid, lexqid]) - return result +# def getlemmas(allresults, _): +# result = getcondlemmas(allresults, _, lambda reskey: reskey in [nounreskey, lexreskey]) +# return result def getnounlemmas(allresults, _): @@ -239,7 +241,7 @@ def getnounlemmas(allresults, _): .. autofunction:: ASTApostfunctions::getposlemmas ''' - result = getposlemmas(allresults, nounqid) + result = getposlemmas(allresults, nounreskey) return result @@ -251,7 +253,7 @@ def getlexlemmas(allresults, _): .. autofunction:: ASTApostfunctions::getposlemmas ''' - result = getposlemmas(allresults, lexqid) + result = getposlemmas(allresults, lexreskey) return result @@ -276,61 +278,6 @@ def getalllemmas(allresults): return result -def old_getlemmas(allresults, _): - allmatches = allresults.allmatches - result = Counter() - for el in allmatches: - (qid, uttid) = el - if qid in ['A021', 'A018']: - for amatch in allmatches[el]: - # theword = normalizedword(amatch[0]) - theword = getattval(amatch[0], 'lemma') - result.update([(theword, uttid)]) - return result - - -def oldgetcondlemmas(allresults, _, cond): - allmatches = allresults.allmatches - result = Counter() - for el in allmatches: - (qid, uttid) = el - if cond(qid): - for amatch in allmatches[el]: - # theword = normalizedword(amatch[0]) - theword = getattval(amatch[0], 'lemma') - result.update([(theword, uttid)]) - return result - - -# not used anymore, contains an error -def getcondlemmas(allresults, _, cond): - result = Counter() - if allresults.annotationinput: - for qid in allresults.exactresults: - if cond(qid): - for (uttid, position) in allresults.exactresults[qid]: - word = allresults.allutts[uttid][position - 1] - if qid == 'A021': - pos = 'n' - elif qid == 'A018': - pos = 'ww' - else: - pos = None - lemma = bgetlemma(word, pos) - result.update([(lemma, qid, uttid)]) - - else: - allmatches = allresults.allmatches - for el in allmatches: - (qid, uttid) = el - if cond(qid): - for amatch in allmatches[el]: - # theword = normalizedword(amatch[0]) - theword = getattval(amatch[0], 'lemma') - result.update([(theword, uttid)]) - return result - - def getposfromqid(qid): if qid == 'A021': pos = 'n' @@ -341,26 +288,27 @@ def getposfromqid(qid): return pos -def getposlemmas(allresults: AllResults, posqid: QId) -> List[Tuple[str, UttId]]: +def getposlemmas(allresults: AllResults, posreskey: ResultsKey) -> List[Tuple[str, UttId]]: ''' The function *getposlemmas* obtains the lemmas from *allresults* that have been - found by a query with identifier *posqid*. + found by a query with identifier *posreskey*. The lemma is obtained from the parse tree if there is one, otherwise (in case the input was an annotation form) from the lexicon (CELEX). ''' result = Counter() if allresults.annotationinput: - for (uttid, position) in allresults.exactresults[posqid]: + for (uttid, position) in allresults.exactresults[posreskey]: word = allresults.allutts[uttid][position - 1] + posqid = posreskey[0] pos = getposfromqid(posqid) lemma = bgetlemma(word, pos) result.update([(lemma, uttid)]) else: allmatches = allresults.allmatches for el in allmatches: - (qid, uttid) = el - if qid == posqid: + (reskey, uttid) = el + if reskey == posreskey: for amatch in allmatches[el]: # theword = normalizedword(amatch[0]) theword = getattval(amatch[0], 'lemma') diff --git a/src/sastadev/CHAT_Annotation.py b/src/sastadev/CHAT_Annotation.py index 65133ff..ae826ba 100644 --- a/src/sastadev/CHAT_Annotation.py +++ b/src/sastadev/CHAT_Annotation.py @@ -1,6 +1,7 @@ import re from sastadev import cleanCHILDEStokens +# import sastadev.cleanCHILDEStokens from sastadev.conf import settings from sastadev.metadata import Meta, bpl_delete, bpl_replacement from sastadev.sastatoken import Token, show @@ -62,8 +63,9 @@ def refunction(x): wordre = re.compile(fullwordpat) # interpunction = r'(:?' + r'[!\?\.,;]' + '|' + u'[\u201C\u201D\u2039\u203A]' + r'|' + r'(?<=\s):' + r')' interpunction = r'\-\-\-|\-\-|\-|\-' + r'|' + \ - r'[!\?\.,;]' + '|' + \ - u'[\u2013\u2014\u2015\u201C\u201D\u2039\u203A]' + r'|' + r'(?<=\s):' + r'[!\?\.,;]' + '|' + \ + u'[\u2013\u2014\u2015\u201C\u201D\u2039\u203A]' + \ + r'|' + r'(?<=\s):' filenamepat = r'[\w\.]+' fullfilenamepat = fullre(filenamepat) fullfilenamere = re.compile(fullfilenamepat) diff --git a/src/sastadev/SAFreader.py b/src/sastadev/SAFreader.py index c8a0b19..4b2bf46 100644 --- a/src/sastadev/SAFreader.py +++ b/src/sastadev/SAFreader.py @@ -15,10 +15,13 @@ from typing import Any, Dict, List, Match, Optional, Pattern, Tuple from sastadev import xlsx +from sastadev.allresults import ResultsKey, mkresultskey +from sastadev.anonymization import getname from sastadev.conf import settings +from sastadev.methods import Method from sastadev.readmethod import itemseppattern -from sastadev.sastatypes import (FileName, Item, Level, Position, QId, - QueryDict, UttId, UttWordDict) +from sastadev.sastatypes import (ExactResults, FileName, Item, Level, Position, + QId, QueryDict, UttId, UttWordDict) varitem = '' @@ -29,7 +32,9 @@ commaspace = ', ' tab = '\t' all_levels = set() -literallevels = ['lemma'] + +# @@next must be made dependent on the method +literallevels = ['literal', 'lemma'] semicolon = ';' labelsep = semicolon @@ -40,11 +45,11 @@ firstwordcolheaderre = re.compile(firstwordcolheaderpattern) speakerheaders = ['speaker', 'spreker', 'spk'] -uttidheaders = ['id', 'utt', 'uttid', 'uiting'] +uttidheaders = ['uiting', 'id', 'utt', 'uttid', ] levelheaders = ['level'] stagesheaders = ['fases', 'stages'] -commentsheaders = ['comments', 'commentaar'] -unalignedheaders = ['unaligned', 'hele zin', 'hele uiting'] +commentsheaders = ['opmerkingen', 'comments', 'commentaar'] +unalignedheaders = ['hele uiting', 'unaligned', 'hele zin'] def nested_dict(n: int, @@ -63,7 +68,23 @@ def clean(label: str) -> str: return result -def getlabels(labelstr: str, patterns: Tuple[Pattern, Pattern]) -> List[str]: +def getlabels(labelstr: str, allvaliditems: List[str], themethod: Method) -> List[str]: + separators = themethod.separators + rawlabels = re.split(separators, labelstr) + labels = [rawlabel.strip() for rawlabel in rawlabels] + validlabels = [] + for label in labels: + if label in allvaliditems: + validlabels.append(label) + elif label == '': + pass + else: + settings.LOGGER.warning( + f'Cannot interpret {label} in {labelstr}; ignored') + return validlabels + + +def oldgetlabels(labelstr: str, patterns: Tuple[Pattern, Pattern]) -> List[str]: results = [] (pattern, fullpattern) = patterns if fullpattern.match(labelstr): @@ -74,11 +95,16 @@ def getlabels(labelstr: str, patterns: Tuple[Pattern, Pattern]) -> List[str]: ms = pattern.finditer(labelstr) logstr = str([m.group(0) for m in ms if m.group(0) not in ' ;,-']) # print('Cannot interpret {}; found items: {}'.format(labelstr,logstr), file=sys.stderr) - settings.LOGGER.warning('Cannot interpret %s; found items: %s', labelstr, logstr) + settings.LOGGER.warning( + 'Cannot interpret %s; found items: %s', labelstr, logstr) # exit(-1) return results +def isuttlevel(level: str) -> bool: + return level.lower() in uttidheaders + + def iswordcolumn(str: str) -> Optional[Match[str]]: result = wordcolheaderre.match(str.lower()) return result @@ -102,7 +128,7 @@ def enrich(labelstr: str, lcprefix: str) -> str: return result -def getcleanlevelsandlabels(thelabelstr: str, thelevel: str, prefix: str, patterns: Tuple[Pattern, Pattern]) \ +def oldgetcleanlevelsandlabels(thelabelstr: str, thelevel: str, prefix: str, patterns: Tuple[Pattern, Pattern]) \ -> List[Tuple[str, str]]: results: List[Tuple[str, str]] = [] lcthelabelstr = thelabelstr.lower() @@ -119,192 +145,24 @@ def getcleanlevelsandlabels(thelabelstr: str, thelevel: str, prefix: str, patter return results -# def oldget_annotations(infilename, patterns): -# ''' -# Reads the file with name filename in SASTA Annotation Format -# :param infilename: -# :param patterns -# :return: a dictionary with as key a tuple (level, item) and as value a Counter with key uttid and value its count -# ''' -# -# thedata = defaultdict(list) -# exactdata = defaultdict(list) -# cdata = {} -# -# # To open Workbook -# wb = xlrd.open_workbook(infilename) -# sheet = wb.sheet_by_index(0) -# -# startrow = 0 -# startcol = 0 -# headerrow = 0 -# headers = {} -# lastrow = sheet.nrows -# lastcol = sheet.ncols -# # firstwordcol = 2 -# # lastwordcol = lastcol - 4 -# levelcol = 1 -# uttidcol = 0 -# stagescol = -1 -# commentscol = -1 -# -# uttlevel = 'utt' -# -# for rowctr in range(startrow, lastrow): -# if rowctr == headerrow: -# for colctr in range(startcol, lastcol): -# headers[colctr] = sheet.cell_value(rowctr, colctr) -# if iswordcolumn(headers[colctr]): -# lastwordcol = colctr -# if isfirstwordcolumn(headers[colctr]): -# firstwordcol = colctr -# elif clean(headers[colctr]) in speakerheaders: -# spkcol = colctr -# elif clean(headers[colctr]) in uttidheaders: -# uttidcol = colctr -# elif clean(headers[colctr]) in levelheaders: -# levelcol = colctr -# elif clean(headers[colctr]) in stagesheaders: -# stagescol = colctr -# elif clean(headers[colctr]) in commentsheaders: -# commentscol = colctr -# else: -# if sheet.cell_value(rowctr, uttidcol) != "": -# uttid = str(int(sheet.cell_value(rowctr, uttidcol))) -# thelevel = sheet.cell_value(rowctr, levelcol) -# thelevel = clean(thelevel) -# all_levels.add(thelevel) -# for colctr in range(firstwordcol, sheet.ncols): -# if thelevel in literallevels and colctr != stagescol and colctr != commentscol: -# thelabel = sheet.cell_value(rowctr, colctr) -# if colctr > lastwordcol: -# tokenposition = 0 -# else: -# tokenposition = colctr - firstwordcol + 1 -# thedata[(thelevel, thelabel)].append(uttid) -# exactdata[(cleanlevel, cleanlabel)].append((uttid, tokenposition)) -# elif thelevel != uttlevel and colctr != stagescol and colctr != commentscol: -# thelabelstr = sheet.cell_value(rowctr, colctr) -# thelevel = sheet.cell_value(rowctr, levelcol) -# if lastwordcol + 1 <= colctr < sheet.ncols: -# # prefix = headers[colctr] aangepast om het simpeler te houden -# prefix = "" -# else: -# prefix = "" -# cleanlevelsandlabels = getcleanlevelsandlabels(thelabelstr, thelevel, prefix, patterns) -# if colctr > lastwordcol: -# tokenposition = 0 -# else: -# tokenposition = colctr - firstwordcol + 1 -# for (cleanlevel, cleanlabel) in cleanlevelsandlabels: -# thedata[(cleanlevel, cleanlabel)].append(uttid) -# exactdata[(cleanlevel, cleanlabel)].append((uttid, tokenposition)) -# # wb.close() there is no way to close the workbook -# for atuple in thedata: -# cdata[atuple] = Counter(thedata[atuple]) -# return cdata -# -# -# def old2get_annotations(infilename: FileName, patterns: Tuple[Pattern, Pattern]) \ -# -> Tuple[UttWordDict, Dict[Tuple[Level, Item], List[Tuple[UttId, Position]]]]: -# ''' -# Reads the file with name filename in SASTA Annotation Format -# :param infilename: -# :param patterns -# :return: a dictionary with as key a tuple (level, item) and as value a list of (uttid, tokenposition) pairs -# ''' -# -# thedata = defaultdict(list) -# #cdata = {} -# -# allutts = {} -# -# # To open Workbook -# wb = xlrd.open_workbook(infilename) -# sheet = wb.sheet_by_index(0) -# -# startrow = 0 -# startcol = 0 -# headerrow = 0 -# headers = {} -# lastrow = sheet.nrows -# lastcol = sheet.ncols -# # firstwordcol = 2 -# # lastwordcol = lastcol - 4 -# levelcol = 1 -# uttidcol = 0 -# stagescol = -1 -# commentscol = -1 -# -# uttlevel = 'utt' -# -# uttcount = 0 -# -# for rowctr in range(startrow, lastrow): -# if rowctr == headerrow: -# for colctr in range(startcol, lastcol): -# headers[colctr] = sheet.cell_value(rowctr, colctr) -# if iswordcolumn(headers[colctr]): -# lastwordcol = colctr -# if isfirstwordcolumn(headers[colctr]): -# firstwordcol = colctr -# elif clean(headers[colctr]) in speakerheaders: -# spkcol = colctr -# elif clean(headers[colctr]) in uttidheaders: -# uttidcol = colctr -# elif clean(headers[colctr]) in levelheaders: -# levelcol = colctr -# elif clean(headers[colctr]) in stagesheaders: -# stagescol = colctr -# elif clean(headers[colctr]) in commentsheaders: -# commentscol = colctr -# else: -# if sheet.cell_value(rowctr, uttidcol) != "": -# uttid = str(int(sheet.cell_value(rowctr, uttidcol))) -# thelevel = sheet.cell_value(rowctr, levelcol) -# thelevel = clean(thelevel) -# all_levels.add(thelevel) -# # if thelevel == uttlevel: -# # uttcount += 1 -# curuttwlist = [] -# for colctr in range(firstwordcol, sheet.ncols): -# if thelevel == uttlevel: -# curcellval = sheet.cell_value(rowctr, colctr) -# if curcellval != '': -# curuttwlist.append(curcellval) -# elif thelevel in literallevels and colctr != stagescol and colctr != commentscol: -# thelabel = sheet.cell_value(rowctr, colctr) -# if colctr > lastwordcol: -# tokenposition = 0 -# else: -# tokenposition = colctr - firstwordcol + 1 -# # thedata[(thelevel, thelabel)].append(uttid) -# cleanlevel = thelevel -# cleanlabel = thelabel -# if cleanlabel != '': -# thedata[(cleanlevel, cleanlabel)].append((uttid, tokenposition)) -# elif thelevel != uttlevel and colctr != stagescol and colctr != commentscol: -# thelabelstr = sheet.cell_value(rowctr, colctr) -# thelevel = sheet.cell_value(rowctr, levelcol) -# if lastwordcol + 1 <= colctr < sheet.ncols: -# # prefix = headers[colctr] aangepast om het simpeler te houden -# prefix = "" -# else: -# prefix = "" -# cleanlevelsandlabels = getcleanlevelsandlabels(thelabelstr, thelevel, prefix, patterns) -# if colctr > lastwordcol: -# tokenposition = 0 -# else: -# tokenposition = colctr - firstwordcol + 1 -# for (cleanlevel, cleanlabel) in cleanlevelsandlabels: -# thedata[(cleanlevel, cleanlabel)].append((uttid, tokenposition)) -# if curuttwlist != []: -# allutts[uttid] = curuttwlist -# # wb.close() there is no way to close the workbook -# return allutts, thedata - - -def get_annotations(infilename: FileName, patterns: Tuple[Pattern, Pattern]) \ +def getcleanlevelsandlabels(thelabelstr: str, thelevel: str, prefix: str, allvaliditems: List[str], themethod: Method) \ + -> List[Tuple[str, str]]: + results: List[Tuple[str, str]] = [] + lcthelabelstr = thelabelstr.lower() + lcprefix = prefix.lower().strip() + lcthelabelstr = enrich(lcthelabelstr, lcprefix) + thelabels = getlabels(lcthelabelstr, allvaliditems, themethod) + for thelabel in thelabels: + if thelabel != "": + cleanlabel = thelabel + cleanlevel = clean(thelevel) + result = (cleanlevel, cleanlabel) + results.append(result) + + return results + + +def oldget_annotations(infilename: FileName, patterns: Tuple[Pattern, Pattern]) \ -> Tuple[UttWordDict, Dict[Tuple[Level, Item], List[Tuple[UttId, Position]]]]: ''' Reads the file with name filename in SASTA Annotation Format @@ -326,7 +184,106 @@ def get_annotations(infilename: FileName, patterns: Tuple[Pattern, Pattern]) \ commentscol = -1 unalignedcol = -1 - uttlevel = 'utt' + # uttlevel = 'utt' + + uttcount = 0 + + for col, val in enumerate(header): + if iswordcolumn(val): + lastwordcol = col + if isfirstwordcolumn(val): + firstwordcol = col + elif clean(val) in speakerheaders: + spkcol = col + elif clean(val) in uttidheaders: + uttidcol = col + elif clean(val) in levelheaders: + levelcol = col + elif clean(val) in stagesheaders: + stagescol = col + elif clean(val) in commentsheaders: + commentscol = col + elif clean(val) in unalignedheaders: + unalignedcol = col + else: + pass # maybe warn here that an unknow column header has been encountered? + + for row in data: + if row[uttidcol] != "": + # this might go wrong if there is no integer there @@make it robust + uttid = str(int(row[uttidcol])) + thelevel = row[levelcol] + thelevel = clean(thelevel) + all_levels.add(thelevel) + # if thelevel == uttlevel: + # uttcount += 1 + curuttwlist = [] + for colctr in range(firstwordcol, len(row)): + if thelevel.lower() in uttidheaders: + rawcurcellval = str(row[colctr]) + curcellval = getname(rawcurcellval) + if curcellval != '': + curuttwlist.append(curcellval) + elif thelevel in literallevels and colctr != stagescol and colctr != commentscol: + rawthelabel = str(row[colctr]) + thelabel = getname(rawthelabel) + if colctr > lastwordcol: + tokenposition = 0 + else: + tokenposition = colctr - firstwordcol + 1 + cleanlevel = thelevel + cleanlabel = thelabel + if cleanlabel != '': + thedata[(cleanlevel, cleanlabel)].append( + (uttid, tokenposition)) + elif not isuttlevel(thelevel) and colctr != stagescol and colctr != commentscol: + thelabelstr = row[colctr] + thelevel = row[levelcol] + if colctr == unalignedcol: + prefix = '' + if lastwordcol + 1 <= colctr < len(row): + # prefix = headers[colctr] aangepast om het simpeler te houden + prefix = "" + else: + prefix = "" + cleanlevelsandlabels = getcleanlevelsandlabels( + thelabelstr, thelevel, prefix, patterns) + if colctr > lastwordcol or colctr == unalignedcol: + tokenposition = 0 + else: + tokenposition = colctr - firstwordcol + 1 + for (cleanlevel, cleanlabel) in cleanlevelsandlabels: + thedata[(cleanlevel, cleanlabel)].append( + (uttid, tokenposition)) + if curuttwlist != []: + allutts[uttid] = curuttwlist + return allutts, thedata + + +def get_annotations(infilename: FileName, allitems: List[str], themethod: Method) \ + -> Tuple[UttWordDict, Dict[Tuple[Level, Item], List[Tuple[UttId, Position]]]]: + ''' + Reads the file with name filename in SASTA Annotation Format + :param infilename: + :param allitems: list of all valid items + :param themethod: the method + :return: a dictionary with as key a tuple (level, item) and as value a list of (uttid, tokenposition) pairs + ''' + + thedata = defaultdict(list) + + allutts = {} + + # To open Workbook + header, data = xlsx.getxlsxdata(infilename) + + levelcol = 1 + uttidcol = 0 + stagescol = -1 + commentscol = -1 + unalignedcol = -1 + + # uttlevel = 'utt' uttcount = 0 @@ -352,6 +309,7 @@ def get_annotations(infilename: FileName, patterns: Tuple[Pattern, Pattern]) \ for row in data: if row[uttidcol] != "": + # this might go wrong if there is no integer there @@make it robust uttid = str(int(row[uttidcol])) thelevel = row[levelcol] thelevel = clean(thelevel) @@ -360,12 +318,14 @@ def get_annotations(infilename: FileName, patterns: Tuple[Pattern, Pattern]) \ # uttcount += 1 curuttwlist = [] for colctr in range(firstwordcol, len(row)): - if thelevel == uttlevel: - curcellval = str(row[colctr]) + if thelevel.lower() in uttidheaders: + rawcurcellval = str(row[colctr]) + curcellval = getname(rawcurcellval) if curcellval != '': curuttwlist.append(curcellval) elif thelevel in literallevels and colctr != stagescol and colctr != commentscol: - thelabel = str(row[colctr]) + rawthelabel = str(row[colctr]) + thelabel = getname(rawthelabel) if colctr > lastwordcol: tokenposition = 0 else: @@ -373,8 +333,9 @@ def get_annotations(infilename: FileName, patterns: Tuple[Pattern, Pattern]) \ cleanlevel = thelevel cleanlabel = thelabel if cleanlabel != '': - thedata[(cleanlevel, cleanlabel)].append((uttid, tokenposition)) - elif thelevel != uttlevel and colctr != stagescol and colctr != commentscol: + thedata[(cleanlevel, cleanlabel)].append( + (uttid, tokenposition)) + elif not isuttlevel(thelevel) and colctr != stagescol and colctr != commentscol: thelabelstr = row[colctr] thelevel = row[levelcol] if colctr == unalignedcol: @@ -384,26 +345,28 @@ def get_annotations(infilename: FileName, patterns: Tuple[Pattern, Pattern]) \ prefix = "" else: prefix = "" - cleanlevelsandlabels = getcleanlevelsandlabels(thelabelstr, thelevel, prefix, patterns) + cleanlevelsandlabels = getcleanlevelsandlabels( + thelabelstr, thelevel, prefix, allitems, themethod) if colctr > lastwordcol or colctr == unalignedcol: tokenposition = 0 else: tokenposition = colctr - firstwordcol + 1 for (cleanlevel, cleanlabel) in cleanlevelsandlabels: - thedata[(cleanlevel, cleanlabel)].append((uttid, tokenposition)) + thedata[(cleanlevel, cleanlabel)].append( + (uttid, tokenposition)) if curuttwlist != []: allutts[uttid] = curuttwlist return allutts, thedata -def update(thedict: Dict[QId, Tuple[Level, Item, List[Tuple[UttId, Position]]]], qid: QId, - goldtuple: Tuple[Level, Item, List[Tuple[UttId, Position]]]): +def update(thedict: Dict[ResultsKey, Tuple[Level, Item, ExactResults]], reskey: ResultsKey, + goldtuple: Tuple[Level, Item, ExactResults]): (level, item, thecounter) = goldtuple - if qid in thedict: - (oldlevel, olditem, oldcounter) = thedict[qid] - thedict[qid] = (oldlevel, olditem, oldcounter + thecounter) + if reskey in thedict: + (oldlevel, olditem, oldcounter) = thedict[reskey] + thedict[reskey] = (oldlevel, olditem, oldcounter + thecounter) else: - thedict[qid] = goldtuple + thedict[reskey] = goldtuple def oldgetitem2levelmap(mapping: Dict[Tuple[Item, Level], Any]) -> Dict[Item, List[Level]]: @@ -448,19 +411,26 @@ def mkpatterns(allcodes: List[str]) -> Tuple[Pattern, Pattern]: return (re.compile(basepattern), re.compile(fullpattern)) -def get_golddata(filename: FileName, mapping: Dict[Tuple[Item, Level], QId], - altcodes: Dict[Tuple[Item, Level], Tuple[Item, Level]], - queries: QueryDict, includeimplies: bool = False) \ +# def get_golddata(filename: FileName, mapping: Dict[Tuple[Item, Level], QId], +# altcodes: Dict[Tuple[Item, Level], Tuple[Item, Level]], +# queries: QueryDict, includeimplies: bool = False) \ +# -> Tuple[UttWordDict, Dict[QId, Tuple[Level, Item, List[Tuple[UttId, Position]]]]]: +def get_golddata(filename: FileName, themethod: Method, includeimplies: bool = False) \ -> Tuple[UttWordDict, Dict[QId, Tuple[Level, Item, List[Tuple[UttId, Position]]]]]: + # item2levelmap = {} + mapping: Dict[Tuple[Item, Level], QId] = themethod.item2idmap + altcodes: Dict[Tuple[Item, Level], Tuple[Item, Level]] = themethod.altcodes + queries: QueryDict = themethod.queries + includeimplies = False # temporarily put off to test different implementation mappingitem2levelmap = getitem2levelmap(mapping) altcodesitem2levelmap = getitem2levelmap(altcodes) allmappingitems = [item for (item, _) in mapping] allaltcodesitems = [item for (item, _) in altcodes] allitems = allmappingitems + allaltcodesitems patterns = mkpatterns(allitems) - allutts, basicdata = get_annotations(filename, patterns) - results: Dict[QId, Tuple[Level, Item, List[Tuple[UttId, Position]]]] = {} + allutts, basicdata = get_annotations(filename, allitems, themethod) + results: Dict[ResultsKey, Tuple[Level, Item, ExactResults]] = {} for thelevel, theitem in basicdata: thecounter = basicdata[(thelevel, theitem)] # unclear why this below here is needed @@ -470,25 +440,30 @@ def get_golddata(filename: FileName, mapping: Dict[Tuple[Item, Level], QId], # mappingitem = varitem # else: # mappingitem = theitem - if thelevel in literallevels: - # we still have to determine how to deal with this - pass + if thelevel in literallevels and (thelevel, thelevel) in mapping: + # we still have to determine how to deal with this this is an attempt + qid = mapping[thelevel, thelevel] + reskey = mkresultskey(qid, theitem) + update(results, reskey, (thelevel, theitem, thecounter)) elif (theitem, thelevel) in mapping: qid = mapping[(theitem, thelevel)] - update(results, qid, (thelevel, theitem, thecounter)) + reskey = mkresultskey(qid) + update(results, reskey, (thelevel, theitem, thecounter)) if includeimplies: for implieditem in queries[qid].implies: impliedlevel = mappingitem2levelmap[implieditem] if (implieditem, impliedlevel) in mapping: impliedqid = mapping[(implieditem, impliedlevel)] - update(results, impliedqid, (impliedlevel, implieditem, thecounter)) + update(results, mkresultskey(impliedqid), + (impliedlevel, implieditem, thecounter)) else: settings.LOGGER.error( 'Implied Item ({},{}) not found in mapping'.format(implieditem, impliedlevel)) elif (theitem, thelevel) in altcodes: (altitem, altlevel) = altcodes[(theitem, thelevel)] qid = mapping[(altitem, altlevel)] - update(results, qid, (altlevel, altitem, thecounter)) + reskey = mkresultskey(qid) + update(results, reskey, (altlevel, altitem, thecounter)) settings.LOGGER.info( '{} of level {} invalid code replaced by {} of level {}'.format(theitem, thelevel, altitem, altlevel)) if includeimplies: @@ -496,14 +471,16 @@ def get_golddata(filename: FileName, mapping: Dict[Tuple[Item, Level], QId], impliedlevel = mappingitem2levelmap[implieditem] if (implieditem, impliedlevel) in mapping: impliedqid = mapping[(implieditem, impliedlevel)] - update(results, impliedqid, (impliedlevel, implieditem, thecounter)) + update(results, mkresultskey(impliedqid), + (impliedlevel, implieditem, thecounter)) else: settings.LOGGER.error( 'Implied Item ({},{}) not found in mapping'.format(implieditem, impliedlevel)) elif theitem in mappingitem2levelmap: # valid item but wrong level thecorrectlevel = mappingitem2levelmap[theitem] qid = mapping[(theitem, thecorrectlevel)] - update(results, qid, (thecorrectlevel, theitem, thecounter)) + reskey = mkresultskey(qid) + update(results, reskey, (thecorrectlevel, theitem, thecounter)) settings.LOGGER.info( 'level {} of item {} replaced by correct level {}'.format(thelevel, theitem, thecorrectlevel)) if includeimplies: @@ -511,35 +488,40 @@ def get_golddata(filename: FileName, mapping: Dict[Tuple[Item, Level], QId], impliedlevel = mappingitem2levelmap[implieditem] if (implieditem, impliedlevel) in mapping: impliedqid = mapping[(implieditem, impliedlevel)] - update(results, impliedqid, (impliedlevel, implieditem, thecounter)) + update(results, mkresultskey(impliedqid), + (impliedlevel, implieditem, thecounter)) else: settings.LOGGER.error( 'Implied Item ({},{}) not found in mapping'.format(implieditem, impliedlevel)) elif theitem in altcodesitem2levelmap: # valid alternative item but wrong level theitemlevel = altcodesitem2levelmap[theitem] - (thecorrectitem, thecorrectlevel) = altcodes[(theitem, theitemlevel)] + (thecorrectitem, thecorrectlevel) = altcodes[( + theitem, theitemlevel)] qid = mapping[(thecorrectitem, thecorrectlevel)] - update(results, qid, (thecorrectlevel, thecorrectitem, thecounter)) + reskey = mkresultskey(qid) + update(results, reskey, (thecorrectlevel, thecorrectitem, thecounter)) settings.LOGGER.info( - 'level {} of item {} replaced by correct level {} and item {}'.format( - thelevel, theitem, thecorrectlevel, thecorrectitem) - ) + 'level {} of item {} replaced by correct level {} and item {}'.format(thelevel, theitem, + thecorrectlevel, + thecorrectitem)) if includeimplies: for implieditem in queries[qid].implies: impliedlevel = mappingitem2levelmap[implieditem] if (implieditem, impliedlevel) in mapping: impliedqid = mapping[(implieditem, impliedlevel)] - update(results, impliedqid, (impliedlevel, implieditem, thecounter)) + update(results, mkresultskey(impliedqid), + (impliedlevel, implieditem, thecounter)) else: settings.LOGGER.error( 'Implied Item ({},{}) not found in mapping'.format(implieditem, thecorrectlevel)) else: - settings.LOGGER.error('{} of level {} not a valid coding'.format(theitem, thelevel)) + settings.LOGGER.error( + '{} of level {} not a valid coding'.format(theitem, thelevel)) return allutts, results -def exact2global(thedata: Dict[Tuple[Level, Item], List[Tuple[UttId, Position]]]) -> Dict[Tuple[Level, Item], Counter]: +def exact2global(thedata: Dict[Tuple[Level, Item], ExactResults]) -> Dict[Tuple[Level, Item], Counter]: ''' turns a dictionary with as values a list of (uttid, pos) tuples into a dictionary with the same keys and as values a counter of uttid :param thedata: @@ -569,8 +551,8 @@ def richexact2global(thedata): return cdata -def richscores2scores(richscores: Dict[QId, Tuple[Level, Item, Any]]) -> Dict[QId, Any]: +def richscores2scores(richscores: Dict[ResultsKey, Tuple[Level, Item, Any]]) -> Dict[QId, Any]: scores = {} - for queryid in richscores: - scores[queryid] = richscores[queryid][2] + for reskey in richscores: + scores[reskey] = richscores[reskey][2] return scores diff --git a/src/sastadev/SRFreader.py b/src/sastadev/SRFreader.py index c700d51..f12a8f8 100644 --- a/src/sastadev/SRFreader.py +++ b/src/sastadev/SRFreader.py @@ -1,5 +1,8 @@ from collections import Counter +from sastadev.allresults import ResultsKey, mkresultskey +from sastadev.conf import settings + qidcolheader = 'id' uttcolheader = 'uttids' tab = '\t' @@ -7,11 +10,29 @@ platinumheaderrows = 0 +def getreskey(rawcell: str) -> ResultsKey: + ''' + older / manually created versions of a reference file can contain simply a QId here, newer ones have a ResultKey string + :param cell: + :return: + ''' + cell = rawcell.strip() + cellparts = cell.split('/') + if len(cellparts) == 2: + result = (cellparts[0], cellparts[1]) + elif len(cellparts) == 1: + result = mkresultskey(cell) + else: + result = cell + settings.LOGGER.error(f'Unknown value {cell} encountered') + return result + + def read_referencefile(infilename, logfile): ''' a reference file is tsv file which contains a header with at least two column headers (idcolheader, uttcolheader) :param infilename: - :return: a dictionary with for each queryid a Counter for the utterance ids + :return: a dictionary with for each ResultsKey a Counter for the utterance ids ''' infile = open(infilename, 'r') rowctr = 0 @@ -23,24 +44,26 @@ def read_referencefile(infilename, logfile): try: qidcol = rowlist.index(qidcolheader) except ValueError: - print('Error reading reference file; no ID column header', infilename, file=logfile) + print('Error reading reference file; no ID column header', + infilename, file=logfile) exit(-1) try: uttcol = rowlist.index(uttcolheader) except ValueError: - print('Error reading reference file: no uttids column header in', infilename, file=logfile) + print('Error reading reference file: no uttids column header in', + infilename, file=logfile) exit(-1) elif rowctr > platinumheaderrows: rowstr = line[:-1] rowlist = rowstr.split(tab) - qid = rowlist[qidcol] + reskey = getreskey(rowlist[qidcol]) utts = rowlist[uttcol] if utts == '': uttlist = [] else: rawuttlist = utts.split(comma) uttlist = [uttid.strip() for uttid in rawuttlist] - results[qid] = Counter(uttlist) + results[reskey] = Counter(uttlist) rowctr += 1 infile.close() return results diff --git a/src/sastadev/STAPpostfunctions.py b/src/sastadev/STAPpostfunctions.py index d91c3dd..5c3161c 100644 --- a/src/sastadev/STAPpostfunctions.py +++ b/src/sastadev/STAPpostfunctions.py @@ -4,7 +4,11 @@ ''' from collections import Counter +from sastadev.allresults import mkresultskey + BB_ids = ['S010', 'S011', 'S012'] +S013qid = 'S013' +S013reskey = mkresultskey(S013qid) def BB_totaal(allresults, _): @@ -21,18 +25,18 @@ def BB_totaal(allresults, _): def GLVU(allresults, _): total_length_VU = 0 - if 'S013' in allresults.coreresults: - for key in allresults.coreresults['S013']: - total_length_VU += allresults.coreresults['S013'][key] + if S013reskey in allresults.coreresults: + for key in allresults.coreresults[S013reskey]: + total_length_VU += allresults.coreresults[S013reskey][key] result = total_length_VU / allresults.uttcount return result def GL5LVU(allresults, _): counts = [] - if 'S013' in allresults.coreresults: - for key in allresults.coreresults['S013']: - counts.append(allresults.coreresults['S013'][key]) + if S013reskey in allresults.coreresults: + for key in allresults.coreresults[S013reskey]: + counts.append(allresults.coreresults[S013reskey][key]) sorted_counts = counts.sort() result = sum(counts[45:50]) / 5 return result diff --git a/src/sastadev/__main__.py b/src/sastadev/__main__.py index eea1314..8b68c91 100644 --- a/src/sastadev/__main__.py +++ b/src/sastadev/__main__.py @@ -140,7 +140,6 @@ import re import sys from collections import Counter, defaultdict -# from altcodes import altcodes from optparse import OptionParser from typing import Any, Callable, Dict, List, Pattern, Tuple @@ -148,8 +147,9 @@ from lxml import etree from sastadev import compounds -from sastadev.allresults import AllResults, scores2counts -from sastadev.ASTApostfunctions import getastamaxsamplesizeuttidsandcutoff +from sastadev.allresults import (AllResults, ExactResultsDict, MatchesDict, + ResultsKey, mkresultskey, scores2counts, + showreskey) from sastadev.conf import settings from sastadev.constants import (bronzefolder, formsfolder, intreebanksfolder, loggingfolder, outtreebanksfolder, @@ -160,29 +160,24 @@ from sastadev.external_functions import str2functionmap from sastadev.goldcountreader import get_goldcounts from sastadev.macros import expandmacros -from sastadev.methods import (Method, astamethods, stapmethods, - supported_methods, tarspmethods, treatmethod) -from sastadev.mismatches import exactmismatches, getmarkposition -from sastadev.mksilver import getsilverannotations, permprefix -from sastadev.query import (Query, form_process, is_core, is_pre, is_preorcore, - post_process, query_exists, query_inform) +from sastadev.methods import Method, supported_methods, treatmethod +from sastadev.mismatches import exactmismatches, literalmissedmatches +from sastadev.query import (Query, is_preorcore, post_process, query_exists, + query_inform) from sastadev.readmethod import itemseppattern, read_method -from sastadev.reduceresults import (exact2results, reduceallresults, - reduceexactgoldscores, reduceresults) +from sastadev.reduceresults import exact2results, reduceexactgoldscores from sastadev.rpf1 import getevalscores, getscores, sumfreq from sastadev.SAFreader import (get_golddata, richexact2global, richscores2scores) -from sastadev.sasta_explanation import finalexplanation_adapttreebank -from sastadev.sastatypes import (AltCodeDict, ExactResultsDict, GoldTuple, - MatchesDict, MethodName, Position, QId, - QIdCount, QueryDict, ResultsCounter, - SampleSizeTuple, SynTree, UttId) +from sastadev.sastacore import (SastaCoreParameters, doauchann, dopostqueries, + isxpathquery, sastacore) +from sastadev.sastatypes import (AltCodeDict, GoldTuple, QId, QIdCount, + QueryDict, ResultsCounter, SynTree, UttId) from sastadev.SRFreader import read_referencefile -from sastadev.stringfunctions import getallrealwords -from sastadev.targets import get_mustbedone, get_targets -from sastadev.treebankfunctions import (getattval, getnodeendmap, getuttid, - getxmetatreepositions, getxselseuttid, - getyield, showtree) +from sastadev.targets import get_targets +from sastadev.treebankfunctions import (getattval, getuttid, + getxmetatreepositions, getyield, + showtree) from sastadev.xlsx import mkworkbook listDir = False @@ -190,7 +185,6 @@ print(dir()) exit(0) - tarsp = 'tarsp' stap = 'stap' asta = 'asta' @@ -199,7 +193,6 @@ codepath = os.path.dirname(os.path.abspath(__file__)) methodspath = os.path.join(codepath, 'data', 'methods') - # moved to methods.py # methodspath = os.path.join(codepath, 'methods') @@ -217,7 +210,6 @@ path2permfolder = silverpermfolder - # target_intarget, target_xsid, target_all = 0, 1, 2 # intargetxpath = '//meta[@name="intarget"]' # xsidxpath = '//meta[@name="xsid"]' @@ -269,15 +261,17 @@ invalidqueries: Dict[QId, Exception] = {} -def checkplatinum(goldscores: Dict[QId, Counter], platinumscores: Dict[QId, Counter], queries: QueryDict) -> None: - for qid in goldscores: - if qid in platinumscores: +def checkplatinum(goldscores: Dict[ResultsKey, Counter], platinumscores: Dict[ResultsKey, Counter], + queries: QueryDict) -> None: + for reskey in goldscores: + if reskey in platinumscores: # all values of gold must be in platinum + qid = reskey[0] if query_exists(queries[qid]): - diff1 = goldscores[qid] - platinumscores[qid] + diff1 = goldscores[reskey] - platinumscores[reskey] if diff1 != Counter(): settings.LOGGER.warning( - '{} has goldscores not in platinum: {}'.format(qid, diff1)) + '{} has goldscores not in platinum: {}'.format(str(reskey), diff1)) def mkerrorreport(errordict, errorreportfilename: str): @@ -294,7 +288,7 @@ def mkerrorreport(errordict, errorreportfilename: str): allrows.append(fullrow) wb = mkworkbook(errorreportfilename, [ - header], allrows, freeze_panes=(1, 1)) + header], allrows, freeze_panes=(1, 1)) wb.close() @@ -403,6 +397,7 @@ def logprint(str: str): if logfile != sys.stderr: print(str, file=sys.stderr) + # @@ types to be reconsidered @@ -426,12 +421,8 @@ def getcompounds(syntree: SynTree) -> List[SynTree]: return results -def isxpathquery(query: str) -> bool: - cleanquery = query.lstrip() - return cleanquery.startswith('//') - - -def doqueries(syntree: SynTree, queries: QueryDict, exactresults: ExactResultsDict, allmatches: MatchesDict, criterion: Callable[[Query], bool]): +def doqueries(syntree: SynTree, queries: QueryDict, exactresults: ExactResultsDict, allmatches: MatchesDict, + criterion: Callable[[Query], bool]): global invalidqueries uttid = getuttid(syntree) # uttid = getuttidorno(syntree) @@ -478,27 +469,6 @@ def doqueries(syntree: SynTree, queries: QueryDict, exactresults: ExactResultsDi # results[queryid] = Counter(matchingids) -def docorequeries(syntree: SynTree, queries: QueryDict, results: ExactResultsDict, allmatches: MatchesDict): - doqueries(syntree, queries, results, allmatches, is_core) - - -def doprequeries(syntree: SynTree, queries: QueryDict, results: ExactResultsDict, allmatches: MatchesDict): - doqueries(syntree, queries, results, allmatches, is_pre) - - -def dopostqueries(allresults: AllResults, postquerylist: List[QId], queries: QueryDict): - # post queries - for queryid in postquerylist: - thequeryobj = queries[queryid] - if query_exists(thequeryobj): - thelistedquery = thequeryobj.query - - # it is assumed that these are all python functions - thef = str2functionmap[thelistedquery] - result = thef(allresults, queries) - allresults.postresults[queryid] = result - - def codeadapt(c: str) -> str: result = c result = re.sub(r'\.', r'\\.', result) @@ -523,8 +493,9 @@ def mkpatterns(allcodes: List[str]) -> Tuple[Pattern, Pattern]: def get_definedfornonemptygold(goldscores, queries: QueryDict) -> Tuple[int, List[QId]]: undefinedqueries = [] definedfornonemptygoldscore = 0 - for queryid in goldscores: - if goldscores[queryid] != emptycounter: + for reskey in goldscores: + if goldscores[reskey] != emptycounter: + queryid = reskey[0] if queryid in queries: if queries[queryid].query != '': definedfornonemptygoldscore += 1 @@ -552,6 +523,215 @@ def get_comparison(resultscounts: QIdCount, goldcounts: QIdCount, queries: Query return comparison +def getmethodfromfile(filename: str) -> str: + result = '' + path, base = os.path.split(filename.lower()) + for m in supported_methods: + if m in base: + result = m + if result == '': + settings.LOGGER.error('No supported method found in filename') + exit(-1) + else: + return result + + +def getsortedgolduttscore(reskey: ResultsKey, goldscores) -> str: + if reskey in goldscores: + # (goldlevel, golditem, goldcounter) = goldscores[queryid] + goldcounter = goldscores[reskey] + goldcount = sumfreq(goldcounter) + sortedgolduttstr = counter2liststr(goldcounter) + else: + goldcount = 0 + sortedgolduttstr = '' + return sortedgolduttstr + + +def updatequerycounts(queryid, themethod, invalidqcount, undefinedqcount) -> Tuple[str, int, int]: + thequery = themethod.queries[queryid] + if query_exists(thequery): + if queryid not in invalidqueries: + qex = 'yes' + else: + qex = 'invalid' + invalidqcount += 1 + else: + qex = 'no' + undefinedqcount += 1 + return qex, invalidqcount, undefinedqcount + + +def oldgetfullscoreandplatinumstr(reskey, themethod, theresults, resultstr, goldscores, + platinuminfilefound, platinumresults, sortedgolduttstr, qex) -> Tuple[str, str]: + queryid = reskey[0] + thequery = themethod.queries[queryid] + if reskey in goldscores: + goldcounter = goldscores[reskey] + goldcount = sumfreq(goldcounter) + else: + goldcount = 0 + + if query_exists(thequery) and queryid not in invalidqueries: + # print(queryid, file=logfile) + if reskey in goldscores: + goldcounter = goldscores[reskey] + else: + goldcounter = Counter() + (recall, precision, f1score) = getscores(theresults, goldcounter) + liststargoldstr = counter2liststr(theresults & goldcounter) + goldminustheresults = goldcounter - theresults + goldminusliststr = counter2liststr(goldminustheresults) + theresultsminusgold = theresults - goldcounter + listminusgoldstr = counter2liststr(theresultsminusgold) + if platinuminfilefound and reskey in platinumresults: + theplatinumresults = platinumresults[reskey] + sortedplatinumliststr = counter2liststr(theplatinumresults) + liststarplatinumstr = counter2liststr( + theresults & theplatinumresults) + platinumminusliststr = counter2liststr( + theplatinumresults - theresults) + listminusplatinumliststr = counter2liststr( + theresults - theplatinumresults) + (platinumrecall, platinumprecision, platinumf1score) = getscores( + theresults, theplatinumresults) + + goldstarplatinumstr = counter2liststr( + goldcounter & theplatinumresults) + platinumminusgoldstr = counter2liststr( + theplatinumresults - goldcounter) + goldminusplatinumstr = counter2liststr( + goldcounter - theplatinumresults) + (gprecall, gpprecision, gpf1score) = getscores( + goldcounter, theplatinumresults) + else: + sortedplatinumliststr, liststarplatinumliststr, platinumminusliststr, \ + listminusplatinumliststr = '', '', '', '' + (platinumrecall, platinumprecision, platinumf1score) = (na, na, na) + + goldstarplatinumstr, platinumminusgoldstr, goldminusplatinumstr = '', '', '' + (gprecall, gpprecision, gpf1score) = (na, na, na) + + else: + goldcounter = Counter() + (recall, precision, f1score) = (na, na, na) + liststargoldstr, goldminusliststr, listminusgoldstr = '', '', '' + sortedplatinumliststr, liststarplatinumliststr, platinumminusliststr, listminusplatinumliststr = '', '', '', '' + (platinumrecall, platinumprecision, platinumf1score) = (na, na, na) + theresultsminusgold = {} + goldminustheresults = {} + goldstarplatinumstr, platinumminusgoldstr, goldminusplatinumstr = '', '', '' + (gprecall, gpprecision, gpf1score) = (na, na, na) + + platinumoutresults = theresults | goldcounter + platinumoutresultsstring = counter2liststr(platinumoutresults) + reskeystr = showreskey(reskey) + + queryinforow = [reskeystr, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item] + queryresultsrow = [str(sumfreq(theresults)), resultstr, + str(goldcount), sortedgolduttstr, qex] + queryRGscorerow = [sf(recall), sf(precision), sf( + f1score), liststargoldstr, goldminusliststr, listminusgoldstr] + queryRPscorerow = [sortedplatinumliststr, sf(platinumrecall), sf(platinumprecision), sf(platinumf1score), + platinumminusliststr, listminusplatinumliststr] + queryGPscorerow = [sf(gprecall), sf(gpprecision), sf(gpf1score), goldstarplatinumstr, platinumminusgoldstr, + goldminusplatinumstr] + + fullresultrow = queryinforow + queryresultsrow + \ + queryRGscorerow + queryRPscorerow + queryGPscorerow + + platinumrow = [reskeystr, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item, platinumoutresultsstring, listminusgoldstr, '', ''] + + return fullresultrow, platinumrow + + +def getfullscoreandplatinumstr(reskey, themethod, theresults, resultstr, goldscores, + platinuminfilefound, platinumresults, sortedgolduttstr, qex) -> Tuple[str, str]: + queryid = reskey[0] + thequery = themethod.queries[queryid] + if reskey in goldscores: + goldcounter = goldscores[reskey] + goldcount = sumfreq(goldcounter) + else: + goldcount = 0 + + if query_exists(thequery) and queryid not in invalidqueries: + # print(queryid, file=logfile) + if reskey in goldscores: + goldcounter = goldscores[reskey] + else: + goldcounter = Counter() + (recall, precision, f1score) = getscores(theresults, goldcounter) + liststargoldstr = counter2liststr(theresults & goldcounter) + goldminustheresults = goldcounter - theresults + goldminusliststr = counter2liststr(goldminustheresults) + theresultsminusgold = theresults - goldcounter + listminusgoldstr = counter2liststr(theresultsminusgold) + if platinuminfilefound and reskey in platinumresults: + theplatinumresults = platinumresults[reskey] + sortedplatinumliststr = counter2liststr(theplatinumresults) + liststarplatinumstr = counter2liststr( + theresults & theplatinumresults) + platinumminusliststr = counter2liststr( + theplatinumresults - theresults) + listminusplatinumliststr = counter2liststr( + theresults - theplatinumresults) + (platinumrecall, platinumprecision, platinumf1score) = getscores( + theresults, theplatinumresults) + + goldstarplatinumstr = counter2liststr( + goldcounter & theplatinumresults) + platinumminusgoldstr = counter2liststr( + theplatinumresults - goldcounter) + goldminusplatinumstr = counter2liststr( + goldcounter - theplatinumresults) + (gprecall, gpprecision, gpf1score) = getscores( + goldcounter, theplatinumresults) + else: + sortedplatinumliststr, liststarplatinumliststr, platinumminusliststr, \ + listminusplatinumliststr = '', '', '', '' + (platinumrecall, platinumprecision, platinumf1score) = (na, na, na) + + goldstarplatinumstr, platinumminusgoldstr, goldminusplatinumstr = '', '', '' + (gprecall, gpprecision, gpf1score) = (na, na, na) + + else: + goldcounter = Counter() + (recall, precision, f1score) = (na, na, na) + liststargoldstr, goldminusliststr, listminusgoldstr = '', '', '' + sortedplatinumliststr, liststarplatinumliststr, platinumminusliststr, listminusplatinumliststr = '', '', '', '' + (platinumrecall, platinumprecision, platinumf1score) = (na, na, na) + theresultsminusgold = {} + goldminustheresults = {} + goldstarplatinumstr, platinumminusgoldstr, goldminusplatinumstr = '', '', '' + (gprecall, gpprecision, gpf1score) = (na, na, na) + + platinumoutresults = theresults | goldcounter + platinumoutresultsstring = counter2liststr(platinumoutresults) + reskeystr = showreskey(reskey) + + queryinforow = [reskeystr, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item] + queryresultsrow = [str(sumfreq(theresults)), resultstr, + str(goldcount), sortedgolduttstr, qex] + queryRGscorerow = [sf(recall), sf(precision), sf( + f1score), liststargoldstr, goldminusliststr, listminusgoldstr] + queryRPscorerow = [sortedplatinumliststr, sf(platinumrecall), sf(platinumprecision), sf(platinumf1score), + platinumminusliststr, listminusplatinumliststr] + queryGPscorerow = [sf(gprecall), sf(gpprecision), sf(gpf1score), goldstarplatinumstr, platinumminusgoldstr, + goldminusplatinumstr] + + fullresultrow = queryinforow + queryresultsrow + \ + queryRGscorerow + queryRPscorerow + queryGPscorerow + + platinumrow = [reskeystr, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item, platinumoutresultsstring, listminusgoldstr, '', ''] + + return fullresultrow, platinumrow + + topnodequery = './/node[@cat="top"]' @@ -586,18 +766,6 @@ def getexactresults(allmatches: MatchesDict) -> ExactResultsDict: return result -def adaptpositions(rawexactresults: ExactResultsDict, nodeendmap) -> ExactResultsDict: - newexactresults: ExactResultsDict = {} - for qid in rawexactresults: - newlist = [] - for (uttid, position) in rawexactresults[qid]: - newposition = getmarkposition(position, nodeendmap, uttid) - newtuple = (uttid, newposition) - newlist.append(newtuple) - newexactresults[qid] = newlist - return newexactresults - - def passfilter(rawexactresults: ExactResultsDict, method: Method) -> ExactResultsDict: """ let only those through that satisfy the filter @@ -617,41 +785,11 @@ def passfilter(rawexactresults: ExactResultsDict, method: Method) -> ExactResult return exactresults -def getmaxsamplesizeuttidsandcutoff(allresults: AllResults) -> Tuple[List[UttId], int, Position]: - cutoffpoint = None - words = getallrealwords(allresults) - cumwordcount = 0 - wordcounts: Dict[UttId, Tuple[int, int, int]] = {} - uttidlist = [] - for uttid in allresults.allutts: - basewordcount = sum(words[uttid].values()) - ignorewordcount = 0 # getignorewordcount(allresults, uttid) - wordcount = basewordcount - ignorewordcount - wordcounts[uttid] = (basewordcount, ignorewordcount, wordcount) - uttidlist.append(uttid) - cumwordcount += wordcount - result = (uttidlist, cumwordcount, cutoffpoint) - return result - - -def getsamplesizefunction(methodname: MethodName) -> Callable: - if methodname in astamethods: - result = getastamaxsamplesizeuttidsandcutoff - elif methodname in tarspmethods: - # @@to be implemented - result = getmaxsamplesizeuttidsandcutoff - elif methodname in stapmethods: - # @@to be implemented - result = getmaxsamplesizeuttidsandcutoff - return result - - # defaulttarsp = r"TARSP Index Current.xlsx" defaulttarsp = supported_methods[tarsp] def main(): - parser = OptionParser() parser.add_option("-f", "--file", dest="infilename", help="Treebank File to be analysed") @@ -667,7 +805,7 @@ def main(): parser.add_option("-p", "--plat", dest="platinuminfilename", help="File containing a platinum reference in SASTA Reference Format") parser.add_option("-i", "--impl", dest="includeimplies", action="store_true", - help="Use the implies column of the method", default=False) + help="Use the implies column of the method (deprecated)", default=True) parser.add_option("-l", "--log", dest="logfilename", help="File for logging") parser.add_option("--corr", dest="corr", default='n', @@ -678,6 +816,9 @@ def main(): (options, args) = parser.parse_args() + # parameter is deprecated, now always assumed to be true + options.includeimplies = True + if options.corr is None: options.corr = corrn if options.corr not in validcorroptions: @@ -763,11 +904,14 @@ def main(): options.annotationfilename = os.path.join( bronzepath, corefilename + bronzesuffix + xlsxext) if options.platinuminfilename is None: - if intreebankinput: - options.platinuminfilename = os.path.join( - silverpath, corefilename + platinumeditedsuffix + txtext) - else: - options.platinuminfilename = inbase + platinumeditedsuffix + txtext + # old: remove in due time + # if intreebankinput: + # options.platinuminfilename = os.path.join(silverpath, corefilename + platinumeditedsuffix + txtext) + # else: + # options.platinuminfilename = inbase + platinumeditedsuffix + txtext + silverpath = os.path.join(corepath, silverfolder) + options.platinuminfilename = os.path.join( + silverpath, corefilename + silversuffix + xlsxext) if options.goldfilename is not None and options.annotationfilename is not None: settings.LOGGER.info( @@ -798,8 +942,8 @@ def main(): # read the annotation reference file if available, otherwise the gold file, otherwise quit goldscores = {} if options.annotationfilename != '' and os.path.exists(options.annotationfilename): - allannutts, richexactgoldscores = get_golddata(options.annotationfilename, themethod.item2idmap, - themethod.altcodes, themethod.queries, options.includeimplies) + allannutts, richexactgoldscores = get_golddata( + options.annotationfilename, themethod, options.includeimplies) annuttcount = len(allannutts) exactgoldscores = richscores2scores(richexactgoldscores) richgoldscores = richexact2global(richexactgoldscores) @@ -827,16 +971,38 @@ def main(): 'Neither an annotationfile nor a goldfile, nor a gold count file specified. Aborting') exit(1) + # read in the silver references if available otherwise equalt o the boronze data + if options.platinuminfilename != '' and os.path.exists(options.platinuminfilename): + silverallannutts, richexactsilverscores = get_golddata(options.platinuminfilename, themethod, + options.includeimplies) + silverannuttcount = len(silverallannutts) + exactsilverscores = richscores2scores(richexactsilverscores) + richsilverscores = richexact2global(richexactsilverscores) + silverscores = richscores2scores(richsilverscores) + silverreffilename = options.platinuminfilename + else: + # no separate silver file so we set it equal to the results of the bronze reference file + settings.LOGGER.info( + 'No silver reference; set equal to the bronze reference') + silverallannutts, richexactsilverscores = allannutts, richexactgoldscores + silverannuttcount = len(silverallannutts) + exactsilverscores = exactgoldscores + richsilverscores = richgoldscores + silverscores = goldscores + silverreffilename = options.platinuminfilename + platinuminfilefound = True + # rawcoreresults = {} # exact = True - rawexactresults: ExactResultsDict = defaultdict(list) + rawexactresults: ExactResultsDict = {} - # @dit aanpassen , voor al de message-done + # @dit aanpassen , vooral de message-done if not os.path.exists(options.infilename): settings.LOGGER.error( 'Input treebank or annotationfile {} not found. Aborting'.format(options.infilename)) exit(1) + # the next is now deprecated, we read in separfte silver reference files # gather remarks on results of earlier runs, write them to a perm_file and adapt the silverscore file # (pathname, barefilename) = os.path.split(options.infilename) @@ -848,22 +1014,20 @@ def main(): # barefilename = basefilename base = corefilename ext = inext - permpath = silverpermpath + # permpath = silverpermpath fullbase = inbase - try: - os.makedirs(permpath) - except FileExistsError: - pass + # try: + # os.makedirs(permpath) + # except FileExistsError: + # pass - perm_silverfilename = permprefix + corefilename + '.xlsx' - perm_silverfullname = os.path.join(permpath, perm_silverfilename) + # perm_silverfilename = permprefix + corefilename + '.xlsx' + # perm_silverfullname = os.path.join(permpath, perm_silverfilename) # - platinumcheckeditedfullname = os.path.join( - resultspath, corefilename + platinumcheckeditedsuffix + '.xlsx') + # platinumcheckeditedfullname = os.path.join(resultspath, corefilename + platinumcheckeditedsuffix + '.xlsx') - platinumoutfilename = os.path.join( - resultspath, corefilename + platinumsuffix + txtext) + # platinumoutfilename = os.path.join(resultspath, corefilename + platinumsuffix + txtext) platinumcheckfilename = os.path.join( resultspath, corefilename + platinumchecksuffix + txtext) silvercheckfilename = os.path.join( @@ -872,148 +1036,98 @@ def main(): (platbase, platext) = os.path.splitext(platinumcheckfilename) platinumcheckxlfullname = platbase + '.xlsx' - silverannotationsdict = getsilverannotations(perm_silverfullname, platinumcheckeditedfullname, - platinumcheckxlfullname, silvercheckfilename, - platinumoutfilename, options.platinuminfilename, richgoldscores) + # silverannotationsdict = getsilverannotations(perm_silverfullname, platinumcheckeditedfullname, + # platinumcheckxlfullname, silvercheckfilename, + # platinumoutfilename, options.platinuminfilename, richgoldscores) analysedtrees: List[SynTree] = [] nodeendmap = {} - # @vanaf nu gaat het om een treebank, dus hier een if statement toevoegen-done if annotationinput: - allutts, richexactscores = get_golddata(options.infilename, themethod.item2idmap, altcodes, themethod.queries, - options.includeimplies) + allutts, richexactscores = get_golddata( + options.infilename, themethod, options.includeimplies) uttcount = len(allutts) exactresults = richscores2scores(richexactscores) + annotatedfileresults = AllResults(uttcount=uttcount, + coreresults={}, + exactresults=exactresults, + postresults={}, + allmatches={}, + filename=options.infilename, + analysedtrees=[], + allutts=allutts, + annotationinput=annotationinput) + origtreebank = None else: tree = etree.parse(options.infilename) origtreebank = tree.getroot() + annotatedfileresults = None + targets = get_targets(origtreebank) if origtreebank.tag != 'treebank': settings.LOGGER.error( "Input treebank file does not contain a treebank element") exit(-1) - allutts = {} - uttcount = 0 - # determine targets - targets = get_targets(origtreebank) - # for tree in origtreebank: - # showtree(tree, 'voor fexplanations') + scp = SastaCoreParameters(annotationinput, options.corr, themethod, + options.includeimplies, options.infilename, targets) - # deal with final explanations - fexplanations = True - if fexplanations: - treebank1 = finalexplanation_adapttreebank(origtreebank) - else: - treebank1 = origtreebank + if not annotationinput: + treebank1 = doauchann(origtreebank) + + methodname = scp.themethod.name + corr = scp.corr + themethod = scp.themethod - # for tree in treebank1: - # showtree(tree, 'na fexplanations') treebank, errordict, allorandalts = correcttreebank( - treebank1, targets, options.methodname, options.corr) + treebank1, targets, methodname, corr) + + allresults, samplesizetuple = sastacore( + origtreebank, treebank, annotatedfileresults, scp) - # for tree in treebank: - # showtree(tree, 'na correcties') + exactresults = allresults.exactresults + allutts = allresults.allutts + uttcount = allresults.uttcount + allmatches = allresults.allmatches - # create the new treebank + # create the new treebank + if treebank is not None: fulltreebank = etree.ElementTree(treebank) newtreebankfullname = os.path.join( outtreebankspath, corefilename + '_corrected' + '.xml') fulltreebank.write(newtreebankfullname, encoding="UTF8", xml_declaration=False, pretty_print=True) - # create error file - errorreportfilename = os.path.join( - resultspath, corefilename + '_errorreport' + '.xlsx') - mkerrorreport(errordict, errorreportfilename) - - # create error logging - errorloggingfullname = os.path.join( - loggingpath, corefilename + '_errorlogging' + '.xlsx') - - allerrorrows: List[str] = [] - for orandalts in allorandalts: - if orandalts is not None: - allerrorrows += orandalts.OrigandAlts2rows(corefilename) - errorwb = mkworkbook(errorloggingfullname, [ - errorwbheader], allerrorrows, freeze_panes=(1, 1)) - errorwb.close() - - # analysedtrees consists of (uttid, syntree) pairs in the order in which they come in - analysedtrees: List[(UttId, SynTree)] = [] - for syntree in treebank: - temputtid = getuttid(syntree) - uttcount += 1 - # settings.LOGGER.error('uttcount={}'.format(uttcount)) - mustbedone = get_mustbedone(syntree, targets) - if mustbedone: - # uttid = getuttid(syntree) - # analysedtrees consists of (uttid, syntree) pairs in order - uttid = getxselseuttid(syntree) - analysedtrees.append((uttid, syntree)) - - doprequeries(syntree, themethod.queries, - rawexactresults, allmatches) - docorequeries(syntree, themethod.queries, - rawexactresults, allmatches) - - # showtree(syntree) - if uttid in nodeendmap: - settings.LOGGER.error( - 'Duplicate uttid in sample: {}'.format(uttid)) - nodeendmap[uttid] = getnodeendmap(syntree) - - # uttno = getuttno(syntree) - # allutts[uttno] = getyield(syntree) - allutts[uttid] = getyield(syntree) - - # determine exactresults and apply the filter to catch interdependencies between prequeries and corequeries - # rawexactresults = getexactresults(allmatches) - rawexactresults2 = passfilter(rawexactresults, themethod) - exactresults = adaptpositions(rawexactresults2, nodeendmap) - - # pas hier de allutts en de rawexactresults2 aan om expansies te ontdoen, gebseerd op de nodeendmap - # @@to be implemented @@ of misschien in de loop hierboven al? - - # @ en vanaf hier kan het weer gemeenschappelijk worden; er met dus ook voor de annotatiefile een exactresults opgeleverd worden - # @d epostfunctions for lemma's etc moeten mogelijk wel aangepast worden - - # adapt the exactresults positions to the reference - - coreresults = exact2results(exactresults) - - platinuminfilefound = False - if os.path.exists(options.platinuminfilename): - platinuminfilefound = True - platinumresults: Dict[QId, Counter] = read_referencefile( - options.platinuminfilename, logfile) - checkplatinum(goldscores, platinumresults, themethod.queries) - else: - settings.LOGGER.info('Platinum file {} not found.'.format( - options.platinuminfilename)) - platinumresults = {} + # create error file + errorreportfilename = os.path.join( + resultspath, corefilename + '_errorreport' + '.xlsx') + mkerrorreport(errordict, errorreportfilename) + + # create error logging + errorloggingfullname = os.path.join( + loggingpath, corefilename + '_errorlogging' + '.xlsx') + + allerrorrows: List[str] = [] + for orandalts in allorandalts: + if orandalts is not None: + allerrorrows += orandalts.OrigandAlts2rows(corefilename) + errorwb = mkworkbook(errorloggingfullname, [ + errorwbheader], allerrorrows, freeze_panes=(1, 1)) + errorwb.close() + + # platinuminfilefound = False + # if os.path.exists(options.platinuminfilename): + # platinuminfilefound = True + # platinumresults: Dict[ResultsKey, Counter] = read_referencefile(options.platinuminfilename, logfile) + # checkplatinum(goldscores, platinumresults, themethod.queries) + # else: + # settings.LOGGER.info('Platinum file {} not found.'.format(options.platinuminfilename)) + # platinumresults = {} # platinumoutfilename = base + platinumsuffix + txtext - platinumoutfile = open(platinumoutfilename, 'w', encoding='utf8') + # platinumoutfile = open(platinumoutfilename, 'w', encoding='utf8') # platinumcheckfilename = base + platinumchecksuffix + txtext platinumcheckfile = open(platinumcheckfilename, 'w', encoding='utf8') - postresults: Dict[QId, Any] = {} - allresults = AllResults(uttcount, coreresults, exactresults, postresults, allmatches, options.infilename, analysedtrees, - allutts, annotationinput) - - samplesizefunction = getsamplesizefunction(options.methodname) - samplesizetuple: SampleSizeTuple = samplesizefunction(allresults) - - postquerylist: List[QId] = [ - q for q in themethod.postquerylist if themethod.queries[q].process == post_process] - formquerylist: List[QId] = [ - q for q in themethod.postquerylist if themethod.queries[q].process == form_process] - - # we assume the reduction must be done before the postqueries - allresults = reduceallresults( - allresults, samplesizetuple, options.methodname) - # bronze reduction exactgoldscores = reduceexactgoldscores( exactgoldscores, samplesizetuple, options.methodname) # ongoing @@ -1021,12 +1135,13 @@ def main(): goldcounts = scores2counts(goldscores) # silver / platinumreduction - platinumresults: Dict[QId, Counter] = reduceresults( - platinumresults, samplesizetuple, options.methodname) - - dopostqueries(allresults, postquerylist, themethod.queries) + exactsilverscores = reduceexactgoldscores( + exactsilverscores, samplesizetuple, options.methodname) # ongoing + silverscores = exact2results(exactsilverscores) # ongoing + silvercounts = scores2counts(silverscores) - dopostqueries(allresults, formquerylist, themethod.queries) + # netx is now obsolete + # platinumresults: Dict[ResultsKey, Counter] = reduceresults(platinumresults, samplesizetuple, options.methodname) (base, ext) = os.path.splitext(options.infilename) outputfullname = os.path.join( @@ -1054,154 +1169,92 @@ def main(): outworksheet.write_row(outrowctr, outstartcol, resultsheaderrow) outrowctr += 1 - # print the platinumheader - print(platinumheaderstring, file=platinumoutfile) + # print the platinumheader (now obsolete) + # print(platinumheaderstring, file=platinumoutfile) # print the results qcount = 0 invalidqcount = 0 undefinedqcount = 0 - results: Dict[QId, ResultsCounter] = allresults.coreresults + results: Dict[ResultsKey, ResultsCounter] = allresults.coreresults # exactresults = getexactresults(allmatches) exact = True - pcheaders = [['User1', 'User2', 'User3', 'MoreorLess', 'qid', - 'cat', 'subcat', 'item', 'uttid', 'pos', 'utt', 'origutt']] + pcheaders = [ + ['User1', 'User2', 'User3', 'MoreorLess', 'qid', 'cat', 'subcat', 'item', 'uttid', 'pos', 'utt', 'origutt', + 'inform']] allrows = [] - for queryid in results: - sortedgolduttlist: List[str] = [] - platinumoutresults: Dict[UttId, int] = Counter() - platinumoutresultsstring = '' + reskeyindex = defaultdict(list) + for reskey in results: + reskeyindex[reskey[0]].append(reskey) + + for queryid in themethod.queries: qcount += 1 - theresults = results[queryid] - resultstr = counter2liststr(theresults) - if queryid in goldscores: - # (goldlevel, golditem, goldcounter) = goldscores[queryid] - goldcounter = goldscores[queryid] - goldcount = sumfreq(goldcounter) - sortedgolduttstr = counter2liststr(goldcounter) - else: - goldcount = 0 - sortedgolduttstr = '' thequery = themethod.queries[queryid] - if query_exists(thequery): - if queryid not in invalidqueries: - qex = 'yes' - else: - qex = 'invalid' - invalidqcount += 1 + if queryid not in reskeyindex: + reskeys = [mkresultskey(queryid)] else: - qex = 'no' - undefinedqcount += 1 - if query_exists(thequery) and queryid not in invalidqueries: - # print(queryid, file=logfile) - if queryid in goldscores: - goldcounter = goldscores[queryid] - else: - goldcounter = Counter() - (recall, precision, f1score) = getscores(theresults, goldcounter) - liststargoldstr = counter2liststr(theresults & goldcounter) - goldminustheresults = goldcounter - theresults - goldminusliststr = counter2liststr(goldminustheresults) - theresultsminusgold = theresults - goldcounter - listminusgoldstr = counter2liststr(theresultsminusgold) - if platinuminfilefound and queryid in platinumresults: - theplatinumresults = platinumresults[queryid] - sortedplatinumliststr = counter2liststr(theplatinumresults) - liststarplatinumstr = counter2liststr( - theresults & theplatinumresults) - platinumminusliststr = counter2liststr( - theplatinumresults - theresults) - listminusplatinumliststr = counter2liststr( - theresults - theplatinumresults) - (platinumrecall, platinumprecision, platinumf1score) = getscores( - theresults, theplatinumresults) - - goldstarplatinumstr = counter2liststr( - goldcounter & theplatinumresults) - platinumminusgoldstr = counter2liststr( - theplatinumresults - goldcounter) - goldminusplatinumstr = counter2liststr( - goldcounter - theplatinumresults) - (gprecall, gpprecision, gpf1score) = getscores( - goldcounter, theplatinumresults) - else: - sortedplatinumliststr, liststarplatinumliststr, platinumminusliststr, \ - listminusplatinumliststr = '', '', '', '' - (platinumrecall, platinumprecision, platinumf1score) = (na, na, na) - - goldstarplatinumstr, platinumminusgoldstr, goldminusplatinumstr = '', '', '' - (gprecall, gpprecision, gpf1score) = (na, na, na) + reskeys = reskeyindex[queryid] + for reskey in reskeys: + theresults = results[reskey] if reskey in results else Counter() + resultstr = counter2liststr(theresults) - else: - goldcounter = Counter() - (recall, precision, f1score) = (na, na, na) - liststargoldstr, goldminusliststr, listminusgoldstr = '', '', '' - sortedplatinumliststr, liststarplatinumliststr, platinumminusliststr, listminusplatinumliststr = '', '', '', '' - (platinumrecall, platinumprecision, platinumf1score) = (na, na, na) - theresultsminusgold = {} - goldminustheresults = {} - goldstarplatinumstr, platinumminusgoldstr, goldminusplatinumstr = '', '', '' - (gprecall, gpprecision, gpf1score) = (na, na, na) + sortedgolduttstr = getsortedgolduttscore(reskey, goldscores) - platinumoutresults = theresults | goldcounter - platinumoutresultsstring = counter2liststr(platinumoutresults) + qex, invalidqcount, undefinedqcount = updatequerycounts(queryid, themethod, invalidqcount, + undefinedqcount) - queryinforow = [queryid, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, - themethod.queries[queryid].item] - queryresultsrow = [str(sumfreq(theresults)), resultstr, str( - goldcount), sortedgolduttstr, qex] - queryRGscorerow = [sf(recall), sf(precision), sf( - f1score), liststargoldstr, goldminusliststr, listminusgoldstr] - queryRPscorerow = [sortedplatinumliststr, sf(platinumrecall), sf(platinumprecision), sf(platinumf1score), - platinumminusliststr, listminusplatinumliststr] - queryGPscorerow = [sf(gprecall), sf(gpprecision), sf(gpf1score), goldstarplatinumstr, platinumminusgoldstr, - goldminusplatinumstr] - - fullresultrow = queryinforow + queryresultsrow + \ - queryRGscorerow + queryRPscorerow + queryGPscorerow - print(tab.join(fullresultrow), file=outfile) - outworksheet.write_row(outrowctr, outstartcol, fullresultrow) - outrowctr += 1 + fullresultrow, platinumrow = getfullscoreandplatinumstr(reskey, themethod, theresults, resultstr, + goldscores, platinuminfilefound, + silverscores, sortedgolduttstr, qex) - platinumrow = [queryid, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, - themethod.queries[queryid].item, platinumoutresultsstring, listminusgoldstr, '', ''] + print(tab.join(fullresultrow), file=outfile) + outworksheet.write_row(outrowctr, outstartcol, fullresultrow) + outrowctr += 1 - print(tab.join(platinumrow), file=platinumoutfile) + # print(tab.join(platinumrow), file=platinumoutfile) # now obsolete - # @with an annotationfile allmatches is empty so we need to redefine newrows (exactmismatches) markedutt (getmarkedutt)-done - if exact: - newrows = exactmismatches(queryid, themethod.queries, exactresults, exactgoldscores, allmatches, allutts, - platinumcheckfile, silverannotationsdict, annotationinput) - allrows += newrows - else: - if theresultsminusgold != {}: - print('More examples', file=platinumcheckfile) - for uttid in theresultsminusgold: - if (queryid, uttid) in allmatches: - for (m, syntree) in allmatches[(queryid, uttid)]: - markedutt = getmarkedutt(m, syntree) - platinumcheckrow1 = [queryid, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, - themethod.queries[queryid].item, uttid, markedutt] - print(tab.join(platinumcheckrow1), - file=platinumcheckfile) - - if goldminustheresults != {}: - print('Missed examples', file=platinumcheckfile) - for uttid in goldminustheresults: - if uttid in allutts: - uttstr = space.join(allutts[uttid]) - else: - settings.LOGGER.warning( - 'uttid {} not in allutts'.format(uttid)) - platinumcheckrow2 = [queryid, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, - themethod.queries[queryid].item, uttid, uttstr] - print(tab.join(platinumcheckrow2), file=platinumcheckfile) + # @with an annotationfile allmatches is empty so we need to redefine newrows (exactmismatches) markedutt (getmarkedutt)-done + if exact: + newrows = exactmismatches(reskey, themethod.queries, exactresults, exactsilverscores, allmatches, + allutts, + platinumcheckfile, {}, annotationinput) + allrows += newrows + else: + if theresultsminusgold != {}: + print('More examples', file=platinumcheckfile) + for uttid in theresultsminusgold: + if (reskey, uttid) in allmatches: + for (m, syntree) in allmatches[(reskey, uttid)]: + markedutt = getmarkedutt(m, syntree) + platinumcheckrow1 = [reskey, themethod.queries[queryid].cat, + themethod.queries[queryid].subcat, + themethod.queries[queryid].item, uttid, markedutt] + print(tab.join(platinumcheckrow1), + file=platinumcheckfile) + + if goldminustheresults != {}: + print('Missed examples', file=platinumcheckfile) + for uttid in goldminustheresults: + if uttid in allutts: + uttstr = space.join(allutts[uttid]) + else: + settings.LOGGER.warning( + 'uttid {} not in allutts'.format(uttid)) + platinumcheckrow2 = [reskey, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item, uttid, uttstr] + print(tab.join(platinumcheckrow2), file=platinumcheckfile) # platinumcheckfullname = platinumcheckfile.name # (base, ext) = os.path.splitext(platinumcheckfilename) # platinumcheckxlfullname = base + '.xlsx' + + # add missed literal hits + literalmissedrows = literalmissedmatches(themethod.queries, exactresults, exactgoldscores, allmatches, allutts, + platinumcheckfile, {}, annotationinput) + allrows += literalmissedrows + wb = mkworkbook(platinumcheckxlfullname, pcheaders, allrows, freeze_panes=(1, 9)) wb.close() @@ -1210,15 +1263,18 @@ def main(): goldpostresults: Dict[UttId, int] = {} goldcounters: Dict[QId, ResultsCounter] = {} allgoldmatches: MatchesDict = {} - for qid in goldscores: - goldcounters[qid] = goldscores[qid] - allgoldresults = AllResults(uttcount, goldcounters, exactgoldscores, goldpostresults, allgoldmatches, reffilename, [], + for reskey in goldscores: + goldcounters[reskey] = goldscores[reskey] + allgoldresults = AllResults(uttcount, goldcounters, exactgoldscores, goldpostresults, allgoldmatches, reffilename, + [], allannutts, annotationinput) + postquerylist: List[QId] = [ + q for q in themethod.postquerylist if themethod.queries[q].process == post_process] dopostqueries(allgoldresults, postquerylist, themethod.queries) # compute the platinum postresults - platinumpostresults: Dict[QId, Any] = {} + platinumpostresults: Dict[ResultsKey, Any] = {} # print the postresults thepostresults = allresults.postresults @@ -1231,7 +1287,9 @@ def main(): else: qex = 'no' - queryinforow = [queryid, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + queryreskey = mkresultskey(queryid) + queryreskeystr = showreskey(queryreskey) + queryinforow = [queryreskeystr, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, themethod.queries[queryid].item] queryresultsrow = ['', resultposval, '', goldpostval, qex] + erow(6) + [platinumpostval] + erow(11) @@ -1252,7 +1310,8 @@ def main(): lambda x: is_preorcore(x) and query_exists(x)), (4, 'Overall (all original pre and core measures)', lambda x: is_preorcore(x))] - logheader = ['datetime', 'treebank', 'scorenr,' 'R', 'P', 'F1', 'P-R', 'P-P', 'P-F1', 'GP-R', 'GP-P', 'GP-F1', 'ref', + logheader = ['datetime', 'treebank', 'scorenr,' 'R', 'P', 'F1', 'P-R', 'P-P', 'P-F1', 'GP-R', 'GP-P', 'GP-F1', + 'ref', 'method'] logname = 'sastalog.txt' logpath = os.path.join(codepath, '../../sastalog') @@ -1266,73 +1325,79 @@ def main(): for (ctr, message, queryfunction) in overallmethods: # gather resultscount resultscount = 0 - for queryid in results: + for reskey in results: + queryid = reskey[0] thequery = themethod.queries[queryid] if thequery.original and queryfunction(thequery): - resultscount += sum(results[queryid].values()) + resultscount += sum(results[reskey].values()) # gather goldcount goldcount = 0 - for queryid in goldscores: + for reskey in goldscores: + queryid = reskey[0] thequery = themethod.queries[queryid] - goldcounter = goldscores[queryid] + goldcounter = goldscores[reskey] if thequery.original and queryfunction(thequery): goldcount += sum(goldcounter.values()) # gather platinumcount platinumcount = 0 - for queryid in platinumresults: + for reskey in silverscores: + queryid = reskey[0] if queryid in themethod.queries: thequery = themethod.queries[queryid] if thequery.original and queryfunction(thequery): - platinumcount += sum(platinumresults[queryid].values()) + platinumcount += sum(silverscores[reskey].values()) else: settings.LOGGER.warning( - 'Query {} found in platinumresults but not in queries'.format(queryid)) + f'Query {reskey} found in silver scores but {queryid} not in queries') # resultsgoldintersectiocount resultsgoldintersectioncount = 0 - for queryid in results: + for reskey in results: + queryid = reskey[0] thequery = themethod.queries[queryid] if thequery.original and queryfunction(thequery): - if queryid in goldscores: - goldcounter = goldscores[queryid] - intersection = results[queryid] & goldcounter + if reskey in goldscores: + goldcounter = goldscores[reskey] + intersection = results[reskey] & goldcounter resultsgoldintersectioncount += sum(intersection.values()) else: pass - # settings.LOGGER.warning('Query {} found in results but not in goldscores'.format(queryid)) + # settings.LOGGER.warning(f'Query {reskey} found in results but not in goldscores') # resultsplatinumintersectioncount resultsplatinumintersectioncount = 0 - for queryid in results: + for reskey in results: + queryid = reskey[0] thequery = themethod.queries[queryid] if thequery.original and queryfunction(thequery): - if queryid in platinumresults: - intersection = results[queryid] & platinumresults[queryid] + if reskey in silverscores: + intersection = results[reskey] & silverscores[reskey] resultsplatinumintersectioncount += sum( intersection.values()) else: pass - # settings.LOGGER.warning('queryid {} not in platinumresults'.format(queryid)) + # settings.LOGGER.warning('queryid {} not in silverscores'.format(queryid)) # goldplatinumintersectioncount goldplatinumintersectioncount = 0 - for queryid in platinumresults: + for reskey in silverscores: + queryid = reskey[0] if queryid in themethod.queries: thequery = themethod.queries[queryid] if thequery.original and queryfunction(thequery): - if queryid in goldscores: - goldcounter = goldscores[queryid] - intersection = goldcounter & platinumresults[queryid] + if reskey in goldscores: + goldcounter = goldscores[reskey] + intersection = goldcounter & silverscores[reskey] goldplatinumintersectioncount += sum( intersection.values()) else: pass - # settings.LOGGER.warning('Query {} in platinumresults but not in goldscores'.format(queryid)) + # settings.LOGGER.warning('Query {} in silverscores but not in goldscores'.format(queryid)) else: settings.LOGGER.warning( - 'Query {} in platinumresults but not in queries'.format(queryid)) + f'Query {reskey} in silverscores but {queryid} not in queries') (recall, precision, f1score) = getevalscores( resultscount, goldcount, resultsgoldintersectioncount) @@ -1343,8 +1408,8 @@ def main(): overallrow = ['', '', '', message, '', '', '', '', '', sf(recall), sf(precision), sf(f1score), '', '', '', '', sf(platinumrecall), sf( - platinumprecision), sf(platinumf1score), '', '', - sf(gprecall), sf(gpprecision), sf(gpf1score), '', '', ''] + platinumprecision), sf(platinumf1score), '', '', + sf(gprecall), sf(gpprecision), sf(gpf1score), '', '', ''] print(tab.join(overallrow), file=outfile) outworksheet.write_row(outrowctr, outstartcol, overallrow) @@ -1360,7 +1425,7 @@ def main(): biglogfile.close() outfile.close() outworkbook.close() - platinumoutfile.close() + # platinumoutfile.close() platinumcheckfile.close() resultscounts = scores2counts(results) diff --git a/src/sastadev/allresults.py b/src/sastadev/allresults.py index eb47dcb..600cde6 100644 --- a/src/sastadev/allresults.py +++ b/src/sastadev/allresults.py @@ -1,15 +1,58 @@ -from typing import Any, Callable, Counter, Dict, List, Union +from collections import defaultdict +from typing import Any, Callable, Counter, Dict, List, Tuple, Union -from sastadev.sastatypes import (ExactResultsDict, FileName, MatchesDict, QId, - ResultsCounter, SynTree, UttWordDict) +from sastadev.sastatypes import (ExactResult, ExactResults, FileName, Matches, + QId, Query, ResultsCounter, SynTree, UttId, + UttWordDict) +from sastadev.treebankfunctions import getattval as gav + +slash = '/' +reskeysep = slash + + +ResultsKey = Tuple[QId, str] + +# class ResultsKey: # we do not use it anymore because two instantiations with the same value are dfferent objects +# def __init__(self, qid: QId, value: str = None): +# self.qid: QId = qid +# self.value: str = str(qid) if value is None else value +# +# def __str__(self): +# return f'{self.qid}/{self.value}' +# +# def __repr__(self): +# return f"ResultsKey('{self.qid}','{self.value}')" + + +def mkresultskey(qid: QId, value: str = None) -> Tuple[QId, str]: + if value is None: + return (qid, str(qid)) + else: + return (qid, value) + + +def showreskey(reskey): + return f'{reskey[0]}{reskeysep}{reskey[1]}' + + +def reskeystr2reskey(reskeystr: str) -> ResultsKey: + parts = reskeystr.split(reskeysep) + result = tuple(parts) + return result + + +def getqueryid(reskeystr: str) -> QId: + reskey = reskeystr2reskey(reskeystr) + result = reskey[0] + return result class AllResults: def __init__(self, uttcount, coreresults, exactresults, postresults, allmatches, filename, analysedtrees, allutts, annotationinput=False): self.uttcount: int = uttcount - self.coreresults: Dict[QId, ResultsCounter] = coreresults + self.coreresults: Dict[ResultsKey, ResultsCounter] = coreresults self.exactresults: ExactResultsDict = exactresults - self.postresults: Dict[QId, Any] = postresults + self.postresults: Dict[ResultsKey, Any] = postresults self.allmatches: MatchesDict = allmatches self.filename: FileName = filename self.analysedtrees: List[SynTree] = analysedtrees @@ -17,7 +60,12 @@ def __init__(self, uttcount, coreresults, exactresults, postresults, allmatches, self.annotationinput: bool = annotationinput -def scores2counts(scores: Dict[QId, Counter]) -> Dict[QId, int]: +CoreQueryFunction = Callable[[SynTree], List[SynTree]] +PostQueryFunction = Callable[[AllResults, SynTree], List[SynTree]] +QueryFunction = Union[CoreQueryFunction, PostQueryFunction] + + +def scores2counts(scores: Dict[ResultsKey, Counter]) -> Dict[QId, int]: ''' input is a dictionary of Counter()s output is a dictionary of ints @@ -32,3 +80,21 @@ def scores2counts(scores: Dict[QId, Counter]) -> Dict[QId, int]: CoreQueryFunction = Callable[[SynTree], List[SynTree]] PostQueryFunction = Callable[[AllResults, SynTree], List[SynTree]] QueryFunction = Union[CoreQueryFunction, PostQueryFunction] + +MatchesDict = Dict[Tuple[ResultsKey, UttId], Matches] +ExactResultsDict = Dict[ResultsKey, ExactResults] # qid +ExactResultsFilter = Callable[[Query, ExactResultsDict, ExactResult], bool] + + +def matches2exactresults(matchesdict: MatchesDict) -> ExactResultsDict: + exactresultsdict = defaultdict(list) + for resultskey, uttid in matchesdict: + for match in matchesdict[(resultskey, uttid)]: + position = getposition(match[0]) + exactresultsdict[resultskey].append((uttid, position)) + return exactresultsdict + + +def getposition(node: SynTree) -> int: + result = int(gav(node, 'begin')) + 1 + return result diff --git a/src/sastadev/anonymization.py b/src/sastadev/anonymization.py new file mode 100644 index 0000000..9157001 --- /dev/null +++ b/src/sastadev/anonymization.py @@ -0,0 +1,52 @@ +''' +reimplements SASTA anonymization json data +See https://github.com/UUDigitalHumanitieslab/sasta/blob/develop/backend/anonymization.json + + +''' + +import json +import re +import os.path +from sastadev.conf import settings + +vertbar = '|' + + +anonymisationfile = os.path.join(settings.SD_DIR, 'data', 'anonymization.json') + +with open(anonymisationfile) as json_file: + anonymisationlist = json.load(json_file) + +anonymisationdict = {key: dct["common"] + for dct in anonymisationlist for key in dct["codes"]} + +#: The constant *sasta_pseudonyms* list the strings that replace names for +#: pseudonymisation purposes. +sasta_pseudonyms = [key for key in anonymisationdict] + +#: The constant *pseudonym_patternlist* contains regular expressions for pseudonyms +#: based on elements from the *sasta_pseudonyms* (pseudonym + number). +pseudonym_patternlist = [r'^{}\d?$'.format(el) for el in sasta_pseudonyms] +pseudonym_pattern = vertbar.join(pseudonym_patternlist) +pseudonymre = re.compile(pseudonym_pattern) + + +junk = 0 + + +def getname(rawcode: str) -> str: + code = rawcode.upper() # the code must be in all uppercase otherwise we do too much + if code == '': + return rawcode + if code[-1] in '01234': + prefix = code[:-1] + suffix = code[-1] + suffixint = int(suffix) + else: + return rawcode + if prefix in anonymisationdict: + result = anonymisationdict[prefix][suffixint] + else: + result = rawcode + return result diff --git a/src/sastadev/asta_queries.py b/src/sastadev/asta_queries.py index 62a86fa..78fd97a 100644 --- a/src/sastadev/asta_queries.py +++ b/src/sastadev/asta_queries.py @@ -1,10 +1,11 @@ -from typing import Callable, Dict, List +from typing import Callable, Dict, List, Optional from sastadev.conf import settings from sastadev.dedup import getposition from sastadev.macros import expandmacros from sastadev.metadata import (longrep, repeated, repeatedseqtoken, repetition, substringrep) +from sastadev.normalise_lemma import normaliselemma from sastadev.sastatypes import SynTree from sastadev.stringfunctions import string2list from sastadev.tblex import asta_recognised_lexnode, asta_recognised_nounnode @@ -25,6 +26,41 @@ dpancestorsquery = 'ancestor::node[@rel="dp"] | self::node[@rel="dp" or @rel="--"]' +lemma_path = './/node[%asta_noun% or %ASTA_LEX%]' +expandedlemma_path = expandmacros(lemma_path) +# this covers all repetitions but the short repetitions should not be included +repetitioncond = f'@subcat="{repetition}"' +longrepetitioncond = f'@value="{repeated}" or @value="{repeatedseqtoken}" or @value="{longrep}" or @value="{substringrep}"' + + +def astalemmafunction(node: SynTree) -> str: + repetitionantecedent = getrepetitionantecedent(node) + if repetitionantecedent is not None: + result = astalemmafunction(repetitionantecedent) + else: + rawlemma = getattval(node, 'lemma') + rawword = getattval(node, 'word') + pt = getattval(node, 'pt') + if pt == 'n': + result = normaliselemma(rawword, rawlemma) + else: + resultlist = [c for c in rawlemma if c != '_'] + result = ''.join(resultlist) + return result + + +def getrepetitionantecedent(node: SynTree) -> Optional[SynTree]: + topnode = find1(node, 'ancestor::alpino_ds') + dupindex = get_dupindex(topnode, longrepetitioncond) + nodepos = getattval(node, 'begin') + if nodepos in dupindex: + antecedentpos = dupindex[nodepos] + antecedent = find1( + topnode, f'.//node[@word and @begin="{antecedentpos}"]') + else: + antecedent = None + return antecedent + def get_dupindex(stree: SynTree, cond: str) -> Dict[str, str]: dupindex = {} @@ -37,7 +73,8 @@ def get_dupindex(stree: SynTree, cond: str) -> Dict[str, str]: valueliststr = meta.attrib['annotationposlist'] valuelist = string2list(valueliststr) if len(keylist) != len(valuelist): - settings.LOGGER.error('Error in metadata: {} in sentence {}'.format(meta, getyield(stree))) + settings.LOGGER.error( + 'Error in metadata: {} in sentence {}'.format(meta, getyield(stree))) else: for key, val in zip(keylist, valuelist): dupindex[key] = val @@ -74,10 +111,29 @@ def asta_lex(stree: SynTree) -> List[SynTree]: return results +def asta_recognised_lexicalnode(node: SynTree) -> bool: + result = asta_recognised_nounnode(node) or asta_recognised_lexnode(node) + return result + + +def asta_lemma(stree: SynTree) -> List[SynTree]: + '''The function *asta_lemma* uses the function *asta_x* with parameters *stree*, + *lemma_path* and the function *asta_recognised_lexicalnode*. + + + .. autofunction:: treebankfunctions::asta_recognised_lexicalnode + :noindex: + + ''' + results = asta_x(stree, expandedlemma_path, asta_recognised_lexicalnode) + return results + + def old_asta_noun(stree: SynTree) -> List[SynTree]: theyield = getyield(stree) # for debugging purposes thenodeyield = getnodeyield(stree) - cond1 = '@value="{}" or @value="{}" or @value="{}" or @value="{}"'.format(repeated, repeatedseqtoken, longrep, substringrep) + cond1 = '@value="{}" or @value="{}" or @value="{}" or @value="{}"'.format( + repeated, repeatedseqtoken, longrep, substringrep) dupindex = get_dupindex(stree, cond1) cond2 = '@subcat="{}"'.format(repetition) allrepdupindex = get_dupindex(stree, cond2) @@ -88,18 +144,22 @@ def old_asta_noun(stree: SynTree) -> List[SynTree]: clean_noun_nodes = noun_nodes # remove the nodes that should get it from this function - clean_noun_nodes = [node for node in clean_noun_nodes if getattval(node, 'begin') not in allrepdupindex] + clean_noun_nodes = [node for node in clean_noun_nodes if getattval( + node, 'begin') not in allrepdupindex] # remove words not recognised as nouns; is dit nodig? Ja dit is nodig!!! - clean_noun_nodes = [node for node in clean_noun_nodes if asta_recognised_nounnode(node)] + clean_noun_nodes = [ + node for node in clean_noun_nodes if asta_recognised_nounnode(node)] # print(showtns(clean_noun_nodes)) additional_nodes = [] for key in dupindex: - keynode = find1(stree, './/node[(@pt or @pos) and @begin="{}"]'.format(key)) + keynode = find1( + stree, './/node[(@pt or @pos) and @begin="{}"]'.format(key)) if keynode is not None: val = dupindex[key] - valnode = find1(stree, './/node[(@pt or @pos) and @begin="{}"]'.format(val)) + valnode = find1( + stree, './/node[(@pt or @pos) and @begin="{}"]'.format(val)) if valnode is not None: if valnode in clean_noun_nodes: additional_nodes.append(keynode) @@ -120,8 +180,10 @@ def verbleftof(node: SynTree, positions: List[str]) -> bool: def asta_delpv(stree: SynTree) -> List[SynTree]: coredelpvnodes = stree.xpath(expandedastacoredelpvquery) streeleaves = getnodeyield(stree) - wwbegins = [getattval(node, 'begin') for node in streeleaves if getattval(node, 'pt') == 'ww'] - delpvnodes = [node for node in coredelpvnodes if node.xpath(dpancestorsquery) == [] or not (verbleftof(node, wwbegins))] + wwbegins = [getattval(node, 'begin') + for node in streeleaves if getattval(node, 'pt') == 'ww'] + delpvnodes = [node for node in coredelpvnodes if node.xpath( + dpancestorsquery) == [] or not (verbleftof(node, wwbegins))] return delpvnodes @@ -130,7 +192,8 @@ def asta_x(stree: SynTree, recognized_x_f: Callable[[SynTree], bool]) -> List[SynTree]: theyield = getyield(stree) # for debugging purposes thenodeyield = getnodeyield(stree) - cond1 = '@value="{}" or @value="{}" or @value="{}" or @value="{}"'.format(repeated, repeatedseqtoken, longrep, substringrep) + cond1 = '@value="{}" or @value="{}" or @value="{}" or @value="{}"'.format( + repeated, repeatedseqtoken, longrep, substringrep) dupindex = get_dupindex(stree, cond1) cond2 = '@subcat="{}"'.format(repetition) allrepdupindex = get_dupindex(stree, cond2) @@ -141,7 +204,8 @@ def asta_x(stree: SynTree, clean_x_nodes = x_nodes # remove the nodes that should get it from this function - clean_x_nodes = [node for node in clean_x_nodes if getattval(node, 'begin') not in allrepdupindex] + clean_x_nodes = [node for node in clean_x_nodes if getattval( + node, 'begin') not in allrepdupindex] # remove words not recognised as nouns; is dit nodig? Ja dit is nodig!!! clean_x_nodes = [node for node in clean_x_nodes if recognized_x_f(node)] @@ -149,10 +213,12 @@ def asta_x(stree: SynTree, additional_nodes = [] for key in dupindex: - keynode = find1(stree, './/node[(@pt or @pos) and @begin="{}"]'.format(key)) + keynode = find1( + stree, './/node[(@pt or @pos) and @begin="{}"]'.format(key)) if keynode is not None: val = dupindex[key] - valnode = find1(stree, './/node[(@pt or @pos) and @begin="{}"]'.format(val)) + valnode = find1( + stree, './/node[(@pt or @pos) and @begin="{}"]'.format(val)) if valnode is not None: if valnode in clean_x_nodes: additional_nodes.append(keynode) @@ -192,7 +258,8 @@ def find_node(position, nodes): elif lresults == 1: result = results[0] else: - settings.LOGGER.warning('Multiple nodes found for position {}: {}, in {}'.format(position, showtns(results), showtns(nodes))) + settings.LOGGER.warning('Multiple nodes found for position {}: {}, in {}'.format( + position, showtns(results), showtns(nodes))) result = results[0] return result @@ -218,7 +285,8 @@ def removerepetitions(ptnodes: List[SynTree], stree: SynTree) -> List[SynTree]: newptnodes = [] for ptnode in ptnodes: ptnodeend = ptnode.attrib['begin'] if 'begin' in ptnode.attrib else None - xmetaxpath = './/xmeta[@subcat="Repetition" and @annotatedposlist="[{}]"]'.format(ptnodeend) + xmetaxpath = './/xmeta[@subcat="Repetition" and @annotatedposlist="[{}]"]'.format( + ptnodeend) repmetas = stree.xpath(xmetaxpath) if repmetas == []: newptnodes.append(ptnode) @@ -260,20 +328,23 @@ def asta_bijzin(stree: SynTree) -> List[SynTree]: clausenodes = stree.xpath(astabijzinquery) ptnodes = [n for n in clausenodes if 'pt' in n.attrib] okptnodes = removerepetitions(ptnodes, stree) - trueclausenodes = [n for n in clausenodes if getattval(n, 'cat') in clausecats] + trueclausenodes = [ + n for n in clausenodes if getattval(n, 'cat') in clausecats] # alternative 1 # sortedclausenodes = sorted(trueclausenodes, key=lambda x: (int(getattval(x,'begin')), -int(getattval(x, 'end')))) # result = sortedclausenodes[1:] + okptnodes # alternative2 -follows the conventions for ASTA - sortedclausenodes = sorted(trueclausenodes, key=lambda x: (int(getattval(x, 'begin')), int(getattval(x, 'end')))) + sortedclausenodes = sorted(trueclausenodes, key=lambda x: ( + int(getattval(x, 'begin')), int(getattval(x, 'end')))) if len(sortedclausenodes) > 1: cn0 = sortedclausenodes[0] cn1 = sortedclausenodes[1] if getattval(cn1, 'begin') == getattval(cn0, 'begin'): cn0end = getattval(cn0, 'end') newbegin = cn0end - newokptnodexpath = '//node[@pt and @begin="{newbegin}"]'.format(newbegin=newbegin) + newokptnodexpath = '//node[@pt and @begin="{newbegin}"]'.format( + newbegin=newbegin) newokptnode = find1(cn1, newokptnodexpath) result = sortedclausenodes[2:] + okptnodes if newokptnode is not None: diff --git a/src/sastadev/astaforms.py b/src/sastadev/astaforms.py index cea7b76..ce42741 100644 --- a/src/sastadev/astaforms.py +++ b/src/sastadev/astaforms.py @@ -1,13 +1,60 @@ from collections import Counter, defaultdict from io import BytesIO +from typing import Dict import xlsxwriter -from sastadev.ASTApostfunctions import (nounlemmaqid, verblemmaqid, - wordcountperutt) +from sastadev.allresults import mkresultskey +from sastadev.ASTApostfunctions import wordcountperutt from sastadev.forms import getformfilename +bijzinqid = 'A003' +correctqid = 'A004' +fonparqid = 'A008' +delpvqid = 'A009' +kopqid = 'A013' +lexqid = 'A018' +modalqid = 'A020' +nounqid = 'A021' +neoqid = 'A022' +pvqid = 'A024' +semparqid = 'A026' +subpvqid = 'A032' +tijdfoutpvqid = 'A041' +lemmaqid = 'A051' + +bijzinqid = 'A003' +correctqid = 'A004' +fonparqid = 'A008' +delpvqid = 'A009' +kopqid = 'A013' +lexqid = 'A018' +modalqid = 'A020' +nounqid = 'A021' +neoqid = 'A022' +pvqid = 'A024' +semparqid = 'A026' +subpvqid = 'A032' +tijdfoutpvqid = 'A041' +lemmaqid = 'A051' + +bijzinreskey = mkresultskey(bijzinqid) +correctreskey = mkresultskey(correctqid) +fonparreskey = mkresultskey(fonparqid) +delpvreskey = mkresultskey(delpvqid) +kopreskey = mkresultskey(kopqid) +lexreskey = mkresultskey(lexqid) +modalreskey = mkresultskey(modalqid) +nounreskey = mkresultskey(nounqid) +neoreskey = mkresultskey(neoqid) +pvreskey = mkresultskey(pvqid) +semparreskey = mkresultskey(semparqid) +subpvreskey = mkresultskey(subpvqid) +tijdfoutpvreskey = mkresultskey(tijdfoutpvqid) +lemmareskey = mkresultskey(lemmaqid) + + green = '#00FF00' red = '#FF0000' orange = '#FFBB9A' @@ -22,6 +69,12 @@ # orange = 'yellow' +def condnoun(lemmapositions, exactresults): + nounpositions = exactresults[nounreskey] + result = lemmapositions in nounpositions # something is wrong here JO + return result + + class ExcelForm: def __init__(self, tabel, scores): self.tabel = tabel @@ -40,7 +93,8 @@ def __init__(self, noundict, verbdict, vardict, uttlist): def applytemplate1(rowctr): - result = formulatemplate1.format(rowctr, rowctr, rowctr, rowctr + 1, rowctr + 1) + result = formulatemplate1.format( + rowctr, rowctr, rowctr, rowctr + 1, rowctr + 1) return result @@ -78,10 +132,13 @@ def applytemplate3(sheet, colchar): ['Aantal bijzinnen', 4.8, 2.78]] scores = [['', 'Score', 'SD'], - ['Aantal zelfstandige naamwoorden', "='ZNW & WW'!B1", "=(B2-Tabel!B3)/Tabel!C3"], - ['TTR zelfstandige naamwoorden', applytemplate3('ZNW & WW', 'B'), applytemplate1(3)], + ['Aantal zelfstandige naamwoorden', + "='ZNW & WW'!B1", "=(B2-Tabel!B3)/Tabel!C3"], + ['TTR zelfstandige naamwoorden', applytemplate3( + 'ZNW & WW', 'B'), applytemplate1(3)], ['Aantal lexicale werkwoorden', "='ZNW & WW'!F1", applytemplate2(4)], - ['TTR lexicale werkwoorden', applytemplate3('ZNW & WW', 'F'), applytemplate1(5)], + ['TTR lexicale werkwoorden', applytemplate3( + 'ZNW & WW', 'F'), applytemplate1(5)], ['Semantische parafasieën', '', applytemplate2(6)], ['Fonologische parafasieën', '', applytemplate2(7)], ['Neologismen', '', '=IF(B8=0,"Normaal","Afwijkend")'], @@ -92,13 +149,15 @@ def applytemplate3(sheet, colchar): ['Aantal bijzinnen', '=Uitingen!F2', applytemplate2(13)]] sheet2hiddenrows = [['Totaal', '=SUM(D6:D105)', '', '', '', '=SUM(H6:H105)'], - ['Aantal uniek', '=COUNTA(B6:B105)', '', '', '', '=COUNTA(F6:F105)'], + ['Aantal uniek', '=COUNTA(B6:B105)', + '', '', '', '=COUNTA(F6:F105)'], ['TTR', '=B2/B1', '', '', '', '=F2/F1'], ['', '', '', '', '', ''] ] sheet3hiddenrows = [['Aantal', '=COUNTA(B6:B105)', '', 'Som', 'Som', 'Som'], - ['Totaal', '=SUM(B6:B105)', '', '=SUM(D6:D105)', '=SUM(E6:E105)', '=SUM(F6:F105)'], + ['Totaal', '=SUM(B6:B105)', '', '=SUM(D6:D105)', + '=SUM(E6:E105)', '=SUM(F6:F105)'], ['MLU', '=B2/B1', '', '=(D2/(D2+E2))', '', ''], ['Correct', '=COUNTIF(C6:C105,"J")', '', '', '', ''] ] @@ -136,12 +195,18 @@ def make_astaform(theform, astadata, target): unfilledformat = workbook.add_format({'bg_color': orange}) bggrey = workbook.add_format({'bg_color': grey}) - condformat1a = {'type': 'cell', 'criteria': 'between', 'minimum': -2, 'maximum': 2, 'format': okformat} - condformat1b = {'type': 'cell', 'criteria': 'not between', 'minimum': -2, 'maximum': 2, 'format': wrongformat} - condformat1c = {'type': 'cell', 'criteria': 'equal to', 'value': '"Niet gevuld"', 'format': unfilledformat} - condformat2a = {'type': 'formula', 'criteria': '=$B$8<>0', 'format': wrongformat} - condformat2b = {'type': 'formula', 'criteria': '=$B$8=0', 'format': okformat} - condformat2c = {'type': 'cell', 'criteria': 'equal to', 'value': '"Niet gevuld"', 'format': unfilledformat} + condformat1a = {'type': 'cell', 'criteria': 'between', + 'minimum': -2, 'maximum': 2, 'format': okformat} + condformat1b = {'type': 'cell', 'criteria': 'not between', + 'minimum': -2, 'maximum': 2, 'format': wrongformat} + condformat1c = {'type': 'cell', 'criteria': 'equal to', + 'value': '"Niet gevuld"', 'format': unfilledformat} + condformat2a = {'type': 'formula', + 'criteria': '=$B$8<>0', 'format': wrongformat} + condformat2b = {'type': 'formula', + 'criteria': '=$B$8=0', 'format': okformat} + condformat2c = {'type': 'cell', 'criteria': 'equal to', + 'value': '"Niet gevuld"', 'format': unfilledformat} worksheet1 = workbook.add_worksheet('Uitkomstentabel') worksheet2 = workbook.add_worksheet('ZNW & WW') @@ -165,7 +230,8 @@ def make_astaform(theform, astadata, target): worksheet1.conditional_format('$C$8', condformat2b) worksheet1.conditional_format('$C$8', condformat2c) - writetable(theform.scores, worksheet1, rhformat=bold, chformat=bold, cellformat=dd2) + writetable(theform.scores, worksheet1, rhformat=bold, + chformat=bold, cellformat=dd2) worksheet1.write('$B$6', '', bggrey) worksheet1.write('$B$7', '', bggrey) worksheet1.write('$B$8', '', bggrey) @@ -240,13 +306,19 @@ def getvardict(allresults): phonpar = 'B7' neo = 'B8' KM = 'B9' - semparcount = sumctr(allresults.coreresults['A026']) if 'A026' in allresults.coreresults else 0 - phonparcount = sumctr(allresults.coreresults['A008']) if 'A008' in allresults.coreresults else 0 - neocount = sumctr(allresults.coreresults['A022']) if 'A022' in allresults.coreresults else 0 - Kcount = sumctr(allresults.coreresults['A013']) if 'A013' in allresults.coreresults else 0 - Mcount = sumctr(allresults.coreresults['A020']) if 'A020' in allresults.coreresults else 0 + semparcount = sumctr( + allresults.coreresults[semparreskey]) if semparreskey in allresults.coreresults else 0 + phonparcount = sumctr( + allresults.coreresults[fonparreskey]) if fonparreskey in allresults.coreresults else 0 + neocount = sumctr( + allresults.coreresults[neoreskey]) if neoreskey in allresults.coreresults else 0 + Kcount = sumctr( + allresults.coreresults[kopreskey]) if kopreskey in allresults.coreresults else 0 + Mcount = sumctr( + allresults.coreresults[modalreskey]) if modalreskey in allresults.coreresults else 0 KMcount = Kcount + Mcount - result = {sempar: semparcount, phonpar: phonparcount, neo: neocount, KM: KMcount} + result = {sempar: semparcount, phonpar: phonparcount, + neo: neocount, KM: KMcount} return result @@ -293,7 +365,8 @@ def resultdict2table(resultdict): bijzincount = dictget(uttid_dict, 'bijzincount') remarks = dictget(uttid_dict, 'remarks') paddeduttid = str(uttid).rjust(3, '0') - newrow = [paddeduttid, wc, correct, okpvs, foutepvs, bijzincount, remarks] + newrow = [paddeduttid, wc, correct, + okpvs, foutepvs, bijzincount, remarks] table.append(newrow) sortedtable = sorted(table, key=lambda row: row[0]) return sortedtable @@ -305,14 +378,17 @@ def getuttlist(allresults): for uttid in wordcountdict: resultdict[uttid]['wc'] = wordcountdict[uttid] # update(resultdict, allresults.postresults, 'A046', 'wc') - update(resultdict, allresults.coreresults, 'A004', 'correct') - update(resultdict, allresults.coreresults, 'A024', 'allpvs') - subpvs = allresults.coreresults['A032'] if 'A032' in allresults.coreresults else Counter() - delpvs = allresults.coreresults['A009'] if 'A009' in allresults.coreresults else Counter() - tijdfoutpvs = allresults.coreresults['A041'] if 'A041' in allresults.coreresults else Counter() + update(resultdict, allresults.coreresults, correctreskey, 'correct') + update(resultdict, allresults.coreresults, pvreskey, 'allpvs') + subpvs = allresults.coreresults[subpvreskey] if subpvreskey in allresults.coreresults else Counter( + ) + delpvs = allresults.coreresults[delpvreskey] if delpvreskey in allresults.coreresults else Counter( + ) + tijdfoutpvs = allresults.coreresults[tijdfoutpvreskey] if tijdfoutpvreskey in allresults.coreresults else Counter( + ) foutepvs = subpvs + delpvs + tijdfoutpvs updatewithctr(resultdict, foutepvs, 'foutepvs') - update(resultdict, allresults.coreresults, 'A003', 'bijzincount') + update(resultdict, allresults.coreresults, bijzinreskey, 'bijzincount') result = resultdict2table(resultdict) return result @@ -334,10 +410,12 @@ def astaform(allresults, _, in_memory=False): # # theword = normalizedword(amatch[0]) # theword = getattval(amatch[0], 'lemma') # verbdict[theword] += 1 - for (lemma, uttid) in allresults.postresults[nounlemmaqid]: - noundict[lemma] += 1 - for (lemma, uttid) in allresults.postresults[verblemmaqid]: - verbdict[lemma] += 1 + noundict = getlemmafreqs(allresults, nounreskey) + # for (lemma, uttid) in allresults.postresults[nounlemmaqid]: + # noundict[lemma] += 1 + verbdict = getlemmafreqs(allresults, lexreskey) + # for (lemma, uttid) in allresults.postresults[verblemmaqid]: + # verbdict[lemma] += 1 vardict = getvardict(allresults) uttlist = getuttlist(allresults) astadata = AstaFormData(noundict, verbdict, vardict, uttlist) @@ -351,3 +429,15 @@ def astaform(allresults, _, in_memory=False): theworkbook, target = make_astaform(theform, astadata, target) theworkbook.close() return target + + +def getlemmafreqs(allresults, lexicalreskey) -> Dict[str, int]: + dict = defaultdict(int) + for reskey in allresults.exactresults: + qid = reskey[0] + if qid == lemmaqid: + lemma = reskey[1] + for position in allresults.exactresults[reskey]: + if position in allresults.exactresults[lexicalreskey]: + dict[lemma] += 1 + return dict diff --git a/src/sastadev/basicreplacements.py b/src/sastadev/basicreplacements.py index fe7a1d1..f91335f 100644 --- a/src/sastadev/basicreplacements.py +++ b/src/sastadev/basicreplacements.py @@ -45,6 +45,16 @@ erdrop = 'er drop' closedvow = 'closed vowel' vzdevoicing = 'v/z devoicing' +missingapostrophe = apomiss +finalschwadrop = 'Finals schwa dropped' +u4schwa = 'u usewd for the schwa sound' +inithdrop = 'Initial h drop' +finaldevoicing = 'Final devoicing' +assimilation = 'Assimilation' +reduction = 'Reduction' +intervocalicd2j = 'Intervocalic d -> j' +dial = 'Dialectical variation' +vowellaxing = 'Vowel laxing' #: The constant *Rvzlist* contains a list of adpositions that can combine with *er* into #: a so-called pronominal adverb. Example: *van*, since *er* + * van* = *ervan*. @@ -86,6 +96,11 @@ #: innureplacements = [(w1[:-1] + 'u', w2, c, n, v, p) for (w1, w2, c, n, v, p) in innereplacements] +#@@to add@:zn, dr. wa, tie, mn, zun, dur, se, dese, naartoe, maa(r), isda -> is dat, wi(l), goe(d), datte shwa+n. sij, +# dez, eeft, 'savonds, tisda ('t is dat), jamaar, jahoor, oeveel, geten-> gegeten/ vergeten, +# tzelfde-> hetelfde, neehoor, elemaal, annere -> andere, zteen -> zometeen, hunnie-> hun, hep -> heb, oera -> hoera, +# rijje + #: The constant *basicreplacementlist* contains 6-tuples of strings with: #: #: * frequent deviant spelling of a word, usually to indicate how the word was (incorrectly) pronounced. together with (e.g. "as", "effe") @@ -130,6 +145,7 @@ ('ooke', 'ook', pron, infpron, addschwa, dp), ('it', 'dit', pron, pronerr, onsetred, dp), ('da', 'dat', pron, infpron, codared, dp), + ('wa', 'wat', pron, infpron, codared, dp), ('si', 'zit', pron, infpron, codared, dp), # and zdev ('ieduleen', 'iedereen', pron, wrongpron, phonrepl.format(wrong='l', correct='r'), dp), ('allemaaw', 'allemaal', pron, wrongpron, phonrepl.format(wrong='w', correct='l'), dp), @@ -137,9 +153,10 @@ ('wiw', 'wil', pron, wrongpron, phonrepl.format(wrong='w', correct='l'), dp), ('annug', 'ander', pron, wrongpron, phonrepl.format(wrong='nug', correct='der'), dp), ('nohug', 'nodig', pron, wrongpron, phonrepl.format(wrong='hu', correct='di'), dp), - ('magge', 'mogen', morph, wronginfl, '{} & {}'.format(overgen, infpron), dp), + ('magge', 'mogen', morph, wronginfl, '{} & {}'.format(overgen, infpron), dp-5), + ('magge', 'mag', pron, infpron, emphasis, dp), ('maggen', 'mogen', morph, wronginfl, overgen, dp), - ('aleen', 'alleen', orth, typo, typorepl.format(wrong='alleen', correct='alleen'), dp), + ('aleen', 'alleen', orth, typo, typorepl.format(wrong='aleen', correct='alleen'), dp), ('heef', 'heeft', pron, infpron, codared, dp), ('saan', 'staan', pron, wrongpron, onsetred, dp), ('saan', 'gaan', pron, wrongpron, wrongpron, dp + 2), @@ -153,18 +170,58 @@ ('tan', 'dan', pron, infpron, initdev, dp), ('tat', 'dat', pron, infpron, initdev, dp), ('tit', 'dit', pron, infpron, initdev, dp), + ('tie', 'ie', pron, infpron, initdev, dp), ('lape', 'slapen', pron, infpron, f'{onsetred}+{fndrop}', dp), ('vas', 'vast', pron, infpron, codared, dp), ('datte', 'dat', pron, infpron, emphasis, dp), - ('omdatte', 'dat', pron, infpron, emphasis, dp), - ('cirtus', 'circus', pron, wrongpron, typorepl.format(wrong='t', correct='c'), dp) - + ('omdatte', 'omdat', pron, infpron, emphasis, dp), + ('ditte', 'dit', pron, infpron, emphasis, dp), + ('datte', 'dat', pron, infpron, emphasis, dp), + ('disse', 'deze', pron, infpron, emphasis, dp), + ('deez', 'deze', pron, infpron, finalschwadrop, dp), + ('dez', 'deze', pron, infpron, finalschwadrop, dp), + ('dees', 'deze', pron, infpron, finalschwadrop, dp), + ('dese', 'deze', pron, infpron, vzdevoicing, dp), + ('hunnie', "hun", pron, infpron, emphasis, dp), + ('mn', "m'n", pron, infpron, missingapostrophe, dp), + ('zn', "z'n", pron, infpron, missingapostrophe, dp), + ('dr', "d'r", pron, infpron, missingapostrophe, dp), + ('zun', "z'n", pron, infpron, u4schwa , dp), + ('dur', "d'r", pron, infpron, u4schwa, dp), + ('se', "z'n", pron, infpron, initdev, dp), + ('maa', 'maar', pron, infpron, codared, dp), + ('wi', 'wil', pron, infpron, codared, dp), + ('sij', 'zijn', pron, infpron, f'{codared}/{initdev}', dp), + ('eeft', 'heeft', pron, infpron, inithdrop, dp), + ('oeveel', 'hoeveel', pron, infpron, inithdrop, dp), + ('elemaal', 'helemaal', pron, infpron, inithdrop, dp), + ('oera', 'hoera', pron, infpron, inithdrop, dp), + ('tzelfde', 'hetzelfde', pron, infpron, typo, dp), + ('hep', 'heb', pron, infpron, finaldevoicing, dp), + ('annere', 'andere', pron, infpron, assimilation, dp), + ('zteen', 'zometeen', pron, infpron, reduction, dp), + ('rijje', 'rijden', pron, infpron, intervocalicd2j, dp), + ('rije', 'rijden', pron, infpron, intervocalicd2j, dp), + ('naartoe', 'ernaartoe', pron, infpron, erdrop, dp), + ('goe', 'goed', pron, infpron, codared, dp), + ('geten', 'gegeten', morph, infpron, prefixdrop, dp), + ('geten', 'vergeten', morph, infpron, prefixdrop, dp + 2), + ('cirtus', 'circus', pron, wrongpron, typorepl.format(wrong='t', correct='c'), dp), + ('ken', 'kan', pron, infpron, dial, dp), + ('an', 'aan', pron, infpron, vowellaxing, dp), + ('an', 'kan', pron, infpron, onsetred, dp), + ('hoeve', 'hoef', pron, infpron, emphasis, dp), + ('hoeve', 'hoeft', pron, infpron, emphasis, dp+2), + ('hebbe', 'heb', pron, infpron, emphasis, dp+2), + ('kane', 'andere', pron, wrongpron, wrongpron, dp) ] + \ ervzvariants + \ innereplacements + \ innureplacements + + #: The dictionary *basicreplacements* maps a word with deviant orthography to a list of #: 5-tuples containing the correct orthography, 3 strings to encode metadata, and an integer for the associated penalty. The #: dictionary is derived from the constant *basicreplacementlist* @@ -223,6 +280,8 @@ basicexpansionlist: List[BasicExpansion] = \ [('dis', ['dit', 'is'], pron, infpron, contract, dp), ('das', ['dat', 'is'], pron, infpron, contract, dp), + ("di's", ['dit' 'is'], pron, infpron, contract, dp), + ("da's", ['dat' 'is'], pron, infpron, contract, dp), ('tis', ['dit', 'is'], pron, infpron, contract, dp), ('waas', ['waar', 'is'], pron, infpron, contract, dp), ('is-t-ie', ['is', 'ie'], pron, infpron, t_ie, dp), @@ -232,7 +291,16 @@ ("dit's", ["dit", "is"], pron, infpron, contract, dp), ("dat's", ["dat", "is"], pron, infpron, contract, dp), ("datte", ['dat', 'ie'], pron, infpron, contract, dp + 2), - ("omdatte", ['omdat', 'ie'], pron, infpron, contract, dp + 2) + ("omdatte", ['omdat', 'ie'], pron, infpron, contract, dp + 2), + ("isda", ['is', 'dat'], pron, infpron, contract, dp + 2), + ("tisda", ['het', 'is', 'dat'], pron, infpron, contract, dp + 2), + ("'savonds", ["'s", 'avonds'], pron, infpron, typo, dp + 2), + ("savonds", ["'s", 'avonds'], pron, infpron, typo, dp + 2), + ("jamaar", ['ja', 'maar'], pron, infpron, typo, dp + 2), + ("jahoor", ['ja', 'hoor'], pron, infpron, typo, dp + 2), + ("neehoor", ['nee', 'hoor'], pron, infpron, typo, dp + 2), + ("kanne", ['kan', 'er'], pron, infpron, codared, dp + 2), + ("moek", ['moet', "'k"], pron, infpron, contract, dp) ] # + closesyllshortprepexpansions # put off does not lead to improvement # + innuclosedsyllshortprepexpansions # put off does not lead to improvement diff --git a/src/sastadev/chatundo.py b/src/sastadev/chatundo.py new file mode 100644 index 0000000..005eb87 --- /dev/null +++ b/src/sastadev/chatundo.py @@ -0,0 +1,275 @@ +import re + +from chamd.cleanCHILDESMD import (atsignletters, barezero, bch, blocking, + chat_ca_syms, cliticlink, complexlocalevent, + dependenttier, doubleexclam, doubleslash1, + doubleslash2, endquote, eqexclam, eqtext1, + eqtext2, errormark1, errormark2, exclam1, + exclam2, gtreplre1, gtreplre2, inlinecom, + internalpause, interpunction, ltreplre1, + ltreplre2, pauses1, pauses2, pauses3, + phonfrag1, plus2, plus3, plusdotdotdot, + postcodes, precodes, qre1, qre2, + scopedinlinecom, scopedreformul, scopedtimes, + segmentrep, slash1, slash2, + squarebracketseen, squarebracketstwee, + syllablepause, times, trn, whitespace, www, + zerostr) + +space = ' ' +eps = '' + +simpleinterpunction = re.compile(r'([.?!,])') + + +undocolonre = re.compile(r'([^ ]+)\s+\[:[^\]]*\]') +roundbracketinsert = re.compile(r'\([-\'\w]+\)') +phonfragmarker = re.compile(r'&-|&\+|&') +prosody = re.compile(r'[:\u02c8\u02cc]') +generalsquarebrackets = re.compile(r'\[.*?\]') +leftangle = re.compile(r'<') +rightangle = re.compile(r'>') +plusvaria = re.compile(r'\+//\.|\+"\.|\+"/\.|\+\.') +correctplusquote = re.compile(r'\+"\.') + +lve = re.compile(r'&{l=[\w:]+(.*?)&}l=[\w:]+') +nve = re.compile(r'&{n=[\w:]+(.*?)&}n=[\w:]+') + +picbullet = re.compile(r'\u00b7%pic:\s*[\w\.]+\u00b7') +txtbullet = re.compile(r'\u00b7%txt:\s*[\w\.]+\u00b7') +# bullet code (Unicode middle dot) +bulletedtimealign = re.compile(r'\u00b7[0123456789_ ]+\u00b7') +bulletedtimealign2 = re.compile( + r'\u0015[0123456789_ ]+\u0015') # NAK is sometimes used + +pluscompoundmarker = re.compile(r'\+') + +blockingsequence = re.compile(r'\u2260.*?\u2260') +interposedword = re.compile(r'&\*\w\w\w:[\w:]+') + + +def chatundo(instr): + result = instr + + result = interposedword.sub(eps, result) + + # blockingsequence + result = blockingsequence.sub(eps, result) + + # remove time alignment p. 67 + result = bulletedtimealign.sub(space, result) + result = bulletedtimealign2.sub(space, result) + + # picbullet + result = picbullet.sub(eps, result) + + # txtbullet + result = txtbullet.sub(eps, result) + + # long vocal event + result = lve.sub(r'\1', result) + + # long nonvocal event + result = nve.sub(r'\1', result) + + # remove scoped times <...> [x ...] keeping the ... between <> not officially defined + result = scopedtimes.sub(r'\1', result) + + # remove scoped inlinecom <...> [% ...] keeping the ... between <> not officially defined + result = scopedinlinecom.sub(r'\1', result) + + # remove pauses + result = pauses3.sub(space, result) + result = pauses2.sub(space, result) + result = pauses1.sub(space, result) + + # remove round brackets and everything in between + result = roundbracketinsert.sub(eps, result) + + # remove multiple wordmarker p. 43, 73-74 + result = times.sub(eps, result) + + # remove @letters+: + result = atsignletters.sub(eps, result) + + # remove inline comments [% ...] p70, 78, 85 + result = inlinecom.sub(eps, result) + + # remove scoped reformulation symbols [///] p 73 + result = scopedreformul.sub(r'\1', result) + + # result = wreformul.sub(r'\1', result) #checked this one not + + # remover errormark1 [*] and preceding <> + result = errormark1.sub(r'\1 ', result) + + # remover errormark2 [*] + result = errormark2.sub(eps, result) + + # remove inline dependent tier [%xxx: ...] + + result = dependenttier.sub(eps, result) + + # remove postcodes p. 75-76 + result = postcodes.sub(eps, result) + + # remove precodes p.75-76 + result = precodes.sub(eps, result) + + # remove bch p. 75-76 + result = bch.sub(eps, result) + + # remove trn p.75-76 + result = trn.sub(eps, result) + + # remove +... p. 63 + result = plusdotdotdot.sub(eps, result) + + # remove [<] and preceding > on purpose before [//] + result = ltreplre1.sub(r'\1 ', result) + + # remove [<] on purpose before [//] + result = ltreplre2.sub(space, result) + + # remove [>] and preceding <> + result = gtreplre1.sub(r'\1 ', result) + + # remove [>] + result = gtreplre2.sub(space, result) + + # remove [//] keep preceding part between <>, drop <> + result = doubleslash1.sub(r'\1', result) + + # remove [//] keep preceding word + result = doubleslash2.sub(eps, result) + + # remove [!] and <> around preceding text p.68 + result = exclam1.sub(r'\1', result) + + # remove [!] p.68 + result = exclam2.sub(space, result) + + # remove [/] keep preceding part between <> depending + result = slash2.sub(r'\1', result) + + # remove [/] keep the word before or delete it depending on repkeep option + result = slash1.sub(eps, result) # checked + + # result = re.sub(r'\[<\]', '', result) + + # remove [?] and preceding <> + result = qre1.sub(r'\1 ', result) + + # remove [?] + result = qre2.sub(space, result) + + # remove [=! ] and preceding <> + result = eqexclam.sub(r'\1 ', result) + + # remove [= ] and preceding <> p 68/69 explanation + result = eqtext1.sub(r'\1 ', result) + + # remove [= ] + result = eqtext2.sub(space, result) + + # replace word [: text] by word + result = undocolonre.sub(r'\1 ', result) + + # remove phonological fragments p. 61 &= (simple events) + result = phonfrag1.sub(eps, result) + + # remove fileld pause and phonological fragment markers &- &+ & + # https://talkbank.org/manuals/Clin-CLAN.pdf states &+ for phonological fragments(p. 18) + result = phonfragmarker.sub(eps, result) + + # remove www intentionally after phonological fragments + result = www.sub(eps, result) + + # remove 0[A-z] + result = zerostr.sub(eps, result) + + # delete any remaining 0's + result = barezero.sub(space, result) + + # remove underscore + result = re.sub(r'_', eps, result) + + # remove [!!] + result = doubleexclam.sub(space, result) + + # remove +"/. p. 64-65 + result = endquote.sub(eps, result) + + # remove +/. +/? +//. +//? + result = plus3.sub(r' ', result) + + # remove +". (p. 65) +!? (p. 63) + result = correctplusquote.sub(r' ', result) + + # remove +. +^ +< +, ++ +" (p. 64-66) + result = plus2.sub(r' ', result) + + # remove silence marks (.) (..) (...) done above see pauses + # result = re.sub(r'\(\.(\.)?(\.)?\)', r' ', result) + + # remove syllablepauses p. 60 + result = syllablepause.sub(r'\1', result) + + # remove complexlocalevent p. 61 + result = complexlocalevent.sub(space, result) + + # replace clitic link ~by space + result = cliticlink.sub(space, result) + + # replace chat-ca codes by space p. 86,87 + result = chat_ca_syms.sub(space, result) + + # remove segment repetitions p89 Unicode 21AB UTF8 e2 86 ab + result = segmentrep.sub(eps, result) + + # remove blocking Unicode 2260 not-equal sign p89 + result = blocking.sub(eps, result) + + # remove internal pausing ^ p. 89 + result = internalpause.sub(eps, result) + + # remove primary stress, secondary stress, lengthening + result = prosody.sub(eps, result) + + result = plusvaria.sub(eps, result) + + # next is an ad-hoc extension for Lotti + # replace [een], [twee] by space + result = squarebracketseen.sub(space, result) + result = squarebracketstwee.sub(space, result) + + # remove any other square brackets plus everything in between + result = generalsquarebrackets.sub(eps, result) + + # remove any remaining < and > scope markers + result = leftangle.sub(eps, result) + result = rightangle.sub(eps, result) + + # remove + compound marker + result = pluscompoundmarker.sub(eps, result) + + # surround interpunction with whitespace + result = interpunction.sub(lambda m: ' ' + m.group(0) + ' ', result) + + # remove superfluous spaces etc. this also removes CR etc + result = whitespace.sub(' ', result) + result = result.strip() + return (result) + + +def cleanspaces(instr): + instr2 = cleaninterpunction(instr) + resultrow = instr2.split() + result = space.join(resultrow) + return result + + +def cleaninterpunction(instr): + result = instr + result = simpleinterpunction.sub(r' \1', result) + return result diff --git a/src/sastadev/cleanCHILDEStokens.py b/src/sastadev/cleanCHILDEStokens.py index 5098589..3c88af9 100644 --- a/src/sastadev/cleanCHILDEStokens.py +++ b/src/sastadev/cleanCHILDEStokens.py @@ -9,7 +9,8 @@ from copy import deepcopy from typing import List, Optional, Pattern, TextIO, Tuple, Union -from sastadev import CHAT_Annotation, sastatok +import sastadev +# from sastadev import CHAT_Annotation, sastatok from sastadev.conf import settings from sastadev.metadata import Meta, Metadata, bpl_none from sastadev.sastatoken import Token, show @@ -119,7 +120,7 @@ def cleantext(utt: str, repkeep: bool, tokenoutput: bool = False) -> Tuple[Clean :return: ''' newutt = robustness(utt) - tokens = sastatok.sasta_tokenize(newutt) + tokens = sastadev.sastatok.sasta_tokenize(newutt) inwordlist = [t.word for t in tokens] intokenstrings = [str(token) for token in tokens] # print(space.join(intokenstrings)) @@ -148,7 +149,7 @@ def cleantokens(tokens: List[Token], repkeep: bool) -> Tuple[List[Token], Metada (newtokens, nestingmetadata) = clearnesting(newtokens, repkeep) metadata += nestingmetadata - for annotation in CHAT_Annotation.annotations: + for annotation in sastadev.CHAT_Annotation.annotations: (newtokens, annotationmetadata) = annotation.apply(newtokens, repkeep) metadata += annotationmetadata tokenstrings = [str(token) for token in newtokens] diff --git a/src/sastadev/conf.py b/src/sastadev/conf.py index 1ad8d99..3a95285 100644 --- a/src/sastadev/conf.py +++ b/src/sastadev/conf.py @@ -11,7 +11,7 @@ def __init__(self, ALPINO_PORT: int = 7001, LOGGER=logging.getLogger('sastadev'), SD_DIR: str = SD_DIR, - DATAROOT: str = '.', + DATAROOT: str = r'D:\Dropbox\jodijk\Utrecht\Projects\SASTADATA', PARSE_FUNC=alpinoparsing.parse ): self.ALPINO_HOST = ALPINO_HOST diff --git a/src/sastadev/constants.py b/src/sastadev/constants.py index 510b734..aa49f63 100644 --- a/src/sastadev/constants.py +++ b/src/sastadev/constants.py @@ -13,3 +13,5 @@ resultsfolder = 'results' silverfolder = 'silver' silverpermfolder = 'silverperm' +testsetsfolder = 'testsets' +dataset_treebanksfolder = 'dataset_treebanksfolder' \ No newline at end of file diff --git a/src/sastadev/corrector.py b/src/sastadev/corrector.py index 47f25a2..22c71fc 100644 --- a/src/sastadev/corrector.py +++ b/src/sastadev/corrector.py @@ -22,7 +22,7 @@ from sastadev.iedims import getjeforms from sastadev.lexicon import (WordInfo, de, dets, getwordinfo, het, informlexicon, isa_namepart, known_word, - tswnouns) + tswnouns, wordsunknowntoalpinolexicondict) from sastadev.macros import expandmacros from sastadev.metadata import (Meta, bpl_indeze, bpl_node, bpl_none, bpl_word, bpl_wordlemma, defaultbackplacement, @@ -104,6 +104,8 @@ def replacement(inword: str, outword: str) -> str: #: vowel and optionally a consonant. gaatiepattern = r'^.*' + anychars(vowels) + opt(anychars(consonants)) + 'tie$' gaatiere = re.compile(gaatiepattern) +gaattiepattern = r'^.*' + anychars(vowels) + 'ttie$' +gaattiere = re.compile(gaattiepattern) neutersgnoun = 'boekje' # select here an unambiguous neuter noun @@ -495,7 +497,6 @@ def getcorrections(rawtokens: List[Token], method: MethodName, tree: Optional[Sy # def getalternatives(origtokensmd, method, llremovedtokens, tree, uttid): def getalternatives(origtokensmd: TokenListMD, method: MethodName, tree: SynTree, uttid: UttId): - newtokensmd = explanationasreplacement(origtokensmd, tree) if newtokensmd is not None: tokensmd = newtokensmd @@ -772,7 +773,7 @@ def getexpansions2(tokenlist: List[Token], intokenposlist: List[int]) -> List[Tu results = [combine(headresult, tailresult) for tailresult in tailresults] finalresults += [(TokenListMD(result[0].tokens, - result[0].metadata), result[1]) for result in results] + result[0].metadata), result[1]) for result in results] return finalresults @@ -967,9 +968,10 @@ def getalternativetokenmds(tokenmd: TokenMD, method: MethodName, tokens: List[To # name='Disambiguation', value='Avoid unknown reading', # cat='Lexicon', backplacement=bpl_wordlemma) - moemoetxpath = './/node[@lemma="moe" and @pt!="n" and not(%onlywordinutt%) and (@rel="--" or @rel="dp" or @rel="predm" or @rel="nucl")]' + moemoetxpath = './/node[@lemma="moe" and @pt!="n" and not(%onlywordinutt%)]' expanded_moemoetxpath = expandmacros(moemoetxpath) - if token.word.lower() == 'moe' and tree.xpath(expanded_moemoetxpath) != []: + if token.word.lower() == 'moe' and tree.xpath(expanded_moemoetxpath) != [] and ( + tokenctr == 0 or tokens[tokenctr - 1].word.lower() != 'beetje'): newwords = ['moet'] newtokenmds = updatenewtokenmds(newtokenmds, token, newwords, beginmetadata, name='Informal pronunciation', value='Final t-deletion', cat='Pronunciation', @@ -986,6 +988,25 @@ def getalternativetokenmds(tokenmd: TokenMD, method: MethodName, tokens: List[To name='Informal pronunciation', value='Final t-deletion', cat='Pronunciation', backplacement=bpl_word) + # beurt -> gebeurt + if token.word.lower() == 'beurt': + newwords = ['gebeurt'] + newtokenmds = updatenewtokenmds(newtokenmds, token, newwords, beginmetadata, + name='Wrong pronunciation', value='Unstressed syllable drop', cat='Pronunciation', + backplacement=bpl_word, penalty=5) + newwords = ['deed'] + newtokenmds = updatenewtokenmds(newtokenmds, token, newwords, beginmetadata, + name='Informal pronunciation', value='Final t-deletion', cat='Pronunciation', + backplacement=bpl_word) + + # words unknown to Alpino e.g *gymmen* is replaced by *trainen* + if token.word.lower() in wordsunknowntoalpinolexicondict: + newwords = [wordsunknowntoalpinolexicondict[token.word.lower()]] + newtokenmds = updatenewtokenmds(newtokenmds, token, newwords, beginmetadata, + name='Word unknown to Alpino', value='Unknown word', cat='lexicon', + backplacement=bpl_wordlemma) + + # find document specific replacements # find organisation specific replacements @@ -1089,7 +1110,36 @@ def getvalidalternativetokenmds(tokenmd: TokenMD, newtokenmds: List[TokenMD]) -> return validnewtokenmds + def gaatie(word: str) -> List[str]: + ''' + The function *gaatie* + * replaces a word of the form *X-ie* by the string f'{X} ie' if X is a verb form + * replaces a word of the form *XVttie* by the string f'{X}{V}t ie where V is vowel and XVt is a verb form + * replaces a word that matches with *gaatiepattern* (e.g. + *gaatie*) by a sequence of two words where the first word equals word[:-2] ( + *gaat*) and is a known word and the second word equals word[-2:] (*ie*). + + .. autodata:: corrector::gaatiepattern + ''' + results = [] + # kan-ie, moet-ie, gaat-ie, wil-ie + if word.endswith('-ie') and informlexicon(word[:-3]): + result = space.join([word[:-3], 'ie']) + results.append(result) + # moettie, gaattie, + if gaattiere.match(word) and informlexicon(word[:-3]): + result = space.join([word[:-3], 'ie']) + results.append(result) + if gaatiere.match(word): + # and if it is a verb this is essential because now tie is also split into t ie + if informlexicon(word[:-2]): + result = space.join([word[:-2], word[-2:]]) + results.append(result) + return results + + +def oldgaatie(word: str) -> List[str]: ''' The function *gaatie* replaces a word that matches with *gaatiepattern* (e.g. *gaatie*) by a sequence of two words where the first word equals word[:-2] ( diff --git a/src/sastadev/correcttreebank.py b/src/sastadev/correcttreebank.py index 1858084..baf803f 100644 --- a/src/sastadev/correcttreebank.py +++ b/src/sastadev/correcttreebank.py @@ -9,7 +9,7 @@ from sastadev.conf import settings from sastadev.corrector import (Correction, disambiguationdict, getcorrections, mkuttwithskips) -from sastadev.lexicon import de, dets, known_word +from sastadev.lexicon import de, dets, known_word, nochildwords from sastadev.macros import expandmacros from sastadev.metadata import (Meta, bpl_delete, bpl_indeze, bpl_node, bpl_none, bpl_replacement, bpl_word, @@ -60,8 +60,7 @@ errorwbheader = ['Sample', 'User1', 'User2', 'User3'] + \ ['Status', 'Uttid', 'Origutt', 'Origsent'] + \ ['altid', 'altsent', 'score'] + \ - altpropertiesheader - + altpropertiesheader smartreplacepairs = [('me', 'mijn'), ('ze', 'zijn')] smartreplacedict = {w1: w2 for w1, w2 in smartreplacepairs} @@ -70,7 +69,8 @@ class Alternative(): def __init__(self, stree, altid, altsent, penalty, dpcount, dhyphencount, complsucount, dimcount, compcount, supcount, compoundcount, unknownwordcount, sucount, svaok, deplusneutcount, badcatcount, - hyphencount, basicreplaceecount, ambigcount, subjunctivecount, unknownnouncount, unknownnamecount, dezebwcount): + hyphencount, basicreplaceecount, ambigcount, subjunctivecount, unknownnouncount, unknownnamecount, + dezebwcount): self.stree: SynTree = stree self.altid: AltId = altid self.altsent: str = altsent @@ -166,7 +166,7 @@ def OrigandAlts2rows(self, base: str, user1: str = '', user2: str = '', user3: s laltsrows = len(altsrows) selectedrow = [base, user1, user2, user3] + \ ['Selected', self.orig.uttid, '', - self.alts[self.selected].altsent, str(self.selected)] + self.alts[self.selected].altsent, str(self.selected)] if laltsrows > 1: rows = [origrow] + altsrows + [selectedrow] else: @@ -229,17 +229,23 @@ def adaptpv(node): def smartreplace(node: SynTree, word: str) -> SynTree: ''' - replaces *node* by a different node if the parse of *word* yields a node with a valid word and the same word class, otherwise by + replaces *node* by a different node if the parse of *word* yields a node with a valid word and the same word class and + if it does not occur in nochildwords; otherwise by a node with *word* and *lemma* attributes replaced by *word* :param node: :param word: :return: ''' + wordtree = settings.PARSE_FUNC(word) newnode = find1(wordtree, './/node[@pt]') newnodept = getattval(newnode, 'pt') nodept = getattval(node, 'pt') - if isvalidword(word) and issamewordclass(node, newnode) and not isrobustnoun(newnode): + newnodelemma = getattval(newnode, 'lemma') + if isvalidword(word) and \ + issamewordclass(node, newnode) and \ + not isrobustnoun(newnode) and \ + newnodelemma not in nochildwords: result = newnode result.attrib['begin'] = getattval(node, 'begin') result.attrib['end'] = getattval(node, 'end') @@ -256,8 +262,7 @@ def smartreplace(node: SynTree, word: str) -> SynTree: return result -def mkmetarecord(meta: MetaElement, origutt: Optional[str], parsed_as: Optional[str]) -> Tuple[ - Optional[str], List[str]]: +def mkmetarecord(meta: MetaElement, origutt: Optional[str], parsed_as: Optional[str]) -> Tuple[Optional[str], List[str]]: if meta is None: return None, [] key = meta.attrib['name'] @@ -747,7 +752,7 @@ def correct_stree(stree: SynTree, method: MethodName, corr: CorrectionMode) -> T newnodeparent = newnode.getparent() newnodeparent.remove(newnode) newnodeparent.append(substnode) - # showtree(thetree, 'thetree after smart replace') + # showtree(thetree, 'thetree after smart replace') elif curbackplacement in [bpl_word, bpl_wordlemma]: nodeend = meta.annotationposlist[-1] + 1 @@ -897,7 +902,7 @@ def updatecleantokmeta(meta: Meta, begins: List[str], cleantokpos: List[int]) -> intbegin = int(begin) beginindex = cleantokpos.index(intbegin) newmeta.annotationwordlist = newmeta.annotationwordlist[:beginindex] \ - + newmeta.annotationwordlist[beginindex + 1:] + + newmeta.annotationwordlist[beginindex + 1:] newmeta.value = newmeta.annotationwordlist return newmeta else: @@ -924,7 +929,8 @@ def getorigutt(stree: SynTree) -> Optional[str]: def scorefunction(obj: Alternative) -> TupleNint: - return (-obj.unknownwordcount, -obj.unknownnouncount, -obj.unknownnamecount, -obj.ambigcount, -obj.dpcount, -obj.dhyphencount, + return (-obj.unknownwordcount, -obj.unknownnouncount, -obj.unknownnamecount, -obj.ambigcount, -obj.dpcount, + -obj.dhyphencount, -obj.complsucount, -obj.badcatcount, -obj.basicreplaceecount, -obj.ambigcount, -obj.hyphencount, -obj.subjunctivecount, obj.dimcount, @@ -999,13 +1005,13 @@ def countambigwords(stree: SynTree) -> int: def getunknownwordcount(nt: SynTree) -> int: words = [w for w in nt.xpath('.//node[@pt!="tsw"]/@word')] unknownwords = [w for w in words if not ( - isvalidword(w.lower()) or isvalidword(w.title()))] + isvalidword(w.lower()) or isvalidword(w.title()))] result = len(unknownwords) return result def selectcorrection(stree: SynTree, ptmds: List[ParsedCorrection], corr: CorrectionMode) -> Tuple[ - ParsedCorrection, OrigandAlts]: + ParsedCorrection, OrigandAlts]: # to be implemented@@ # it is presupposed that ptmds is not [] diff --git a/src/sastadev/data/DutchIrregularVerbs.tsv b/src/sastadev/data/DutchIrregularVerbs.tsv new file mode 100644 index 0000000..4ae2ef0 --- /dev/null +++ b/src/sastadev/data/DutchIrregularVerbs.tsv @@ -0,0 +1,194 @@ +bakken bakte bakten gebakken +bannen bande banden gebannen +barsten barstte barstten gebarsten +bederven bedierf bedierven bedorven +bedriegen bedroog bedrogen bedrogen +beginnen begon begonnen begonnen +behangen behing behingen behangen +bergen borg borgen geborgen +bevelen beval bevalen bevolen +bezwijken bezweek bezweken bezweken +bidden bad baden gebeden +bieden bood boden geboden +bijten beet beten gebeten +binden bond bonden gebonden +blazen blies bliezen geblazen +blijken bleek bleken gebleken +blijven bleef bleven gebleven +blinken blonk blonken geblonken +braden braadde braadden gebraden +breken brak braken gebroken +brengen bracht brachten gebracht +brouwen brouwde brouwden gebrouwen +buigen boog bogen gebogen +denken dacht dachten gedacht +dingen dong dongen gedongen +doen deed deden gedaan +dragen droeg droegen gedragen +drijven dreef dreven gedreven +dringen drong drongen gedrongen +drinken dronk dronken gedronken +druipen droop dropen gedropen +duiken dook doken gedoken +dwingen dwong dwongen gedwongen +eten at aten gegeten +fluiten floot floten gefloten +gaan ging gingen gegaan +gelden gold golden gegolden +genezen genas genazen genezen +genieten genoot genoten genoten +geven gaf gaven gegeven +gieten goot goten gegoten +glijden gleed gleden gegleden +glimmen glom glommen geglommen +graven groef groeven gegraven +grijpen greep grepen gegrepen +hangen hing hingen gehangen +hebben had hadden gehad +heffen hief hieven geheven +helpen hielp hielpen geholpen +heten heette heetten geheten +hijsen hees hesen gehesen +hoeven hoefde hoefden gehoeven +houden hield hielden gehouden +houwen hieuw hieuwen gehouwen +jagen joeg joegen gejaagd +jagen jaagde jaagden gejaagd +kiezen koos kozen gekozen +kijken keek keken gekeken +klimmen klom klommen geklommen +klinken klonk klonken geklonken +kluiven kloof kloven gekloven +knijpen kneep knepen geknepen +komen kwam kwamen gekomen +kopen kocht kochten gekocht +krijgen kreeg kregen gekregen +krimpen kromp krompen gekrompen +kruipen kroop kropen gekropen +kwijten kweet kweten gekweten +lachen lachte lachten gelachen +laden laadde laadden geladen +laten liet lieten gelaten +lezen las lazen gelezen +liegen loog logen gelogen +liggen lag lagen gelegen +lijden leed leden geleden +lijken leek leken geleken +lopen liep liepen gelopen +malen maalde maalden gemalen +melken molk molken gemolken +melken melkte melkten gemelkt +meten mat maten gemeten +mijden meed meden gemeden +moeten moest moesten gemoeten +nemen nam namen genomen +nijgen neeg negen genegen +ontginnen ontgon ontgonnen ontgonnen +ontluiken ontlook ontloken ontloken +pluizen ploos plozen geplozen +prijzen prees prezen geprezen +raden raadde raadden geraden +verraden verried verrieden verraden +verraden verraadde verraadden verraden +rijden reed reden gereden +rijgen reeg regen geregen +rijten reet reten gereten +rijzen rees rezen Gerezen +roepen riep riepen geroepen +ruiken rook roken geroken +scheiden scheidde scheidden gescheiden +schelden schold scholden gescholden +schenden schond schonden geschonden +schenken schonk schonken geschonken +scheppen shiep schiepen geschapen +scheren scheerde scheerden geschoren +schieten schoot schoten geschoten +schijnen scheen schenen geschenen +schijten scheet scheten gescheten +schrijven schreef schreven geschreven +schrikken schrok schrokken geschrokken +schuilen school scholen gescholen +schuilen schuilde schuilden geschuild +schuiven schoof schoven geschoven +slaan sloeg sloegen geslagen +slapen sliep sliepen geslapen +slijpen sleep slepen geslepen +slijten sleet sleten gesleten +slinken slonk slonken Geslonken +sluipen sloop slopen geslopen +sluiten sloot sloten gesloten +smelten smolt smolten gesmolten +smijten smeet smeten gesmeten +snijden sneed sneden gesneden +snuiten snoot snoten gesnoten +snuiven snoof snoven gesnoven +spannen spande spanden gespannen +spijten speet speten gespeten +spinnen spon sponnen gesponnen +splijten spleet spleten gespleten +spreken sprak spraken gesproken +springen sprong sprongen gesprongen +spruiten sproot sproten gesproten +spuiten spoot spoten gespoten +staan stond stonden gestaan +steken stak staken gestoken +stelen stal stalen gestolen +sterven stierf stierven gestorven +stijgen steeg stegen gestegen +stijven steef steven gesteven +stinken stonk stonken gestonken +stoten stootte stootten gestoten +strijden streed streden gestreden +strijken streek streken gestreken +stuiven stoof stoven gestoventoven +treden trad traden getreden +treffen trof troffen getroffen +trekken trok trokken getrokken +vallen viel vielen gevallen +vangen ving vingen gevangen +varen voer voeren gevaren +vechten vocht vochten gevochten +verdrieten verdroot verdroten verdroten +verdwijnen verdween verdwenen verdwenen +vergeten vergat vergaten vergeten +verliezen verloor verloren verloren +vinden vond vonden gevonden +vlechten vlocht vlochten gevlochten +vliegen vloog vlogen gevlogen +vouwen vouwde vouwden gevouwen +vragen vroeg vroegen gevraagd +vreten vrat vraten gevreten +vriezen vroor vroren gevroren +vrijen vree vreeën gevreeën +vrijen vrijde vrijden gevrijd +wassen waste wasten gewassen +wegen woog wogen gewogen +werpen wierp wierpen geworpen +werven wierf wierven geworven +weten wist wisten geweten +weven weefde weefden geweven +wijken week weken geweken +wijten weet weten geweten +wijzen wees wezen gewezen +winden wond wonden gewonden +winnen won wonnen gewonnen +worden werd werden geworden +wrijven wreef wreven gewreven +wringen wrong wrongen gewrongen +zeggen zei zeiden gezegd +zenden zond zonden gezonden +zijgen zeeg zegen gezegen +zijn was waren geweest +zingen zong zongen gezongen +zinken zonk zonken gezonken +zinnen zon zonnen gezonnen +zitten zat zaten gezeten +zoeken zocht zochten gezocht +zuigen zoog zogen gezogen +zuipen zoop zopen gezopen +zwelgen zwolg zwolgen gezwolgen +zwellen zwol zwollen gezwollen +zwemmen zwom zwommen gezwommen +zweren zwoer zwoeren gezworen +zwerven zwierf zwierven gezworven +zwijgen zweeg zwegen gezwegen diff --git a/src/sastadev/data/anonymization.json b/src/sastadev/data/anonymization.json new file mode 100644 index 0000000..18eb035 --- /dev/null +++ b/src/sastadev/data/anonymization.json @@ -0,0 +1,71 @@ +[ + { + "category": "place", + "codes": ["PLAATS", "PLAATSNAAM", "WOONPLAATS"], + "common": ["Utrecht", "Breda", "Leiden", "Maastricht", "Arnhem"] + }, + { + "category": "lastname", + "codes": ["ACHTERNAAM"], + "common": ["Jansen", "Hendriks", "Dekker", "Dijkstra", "Veenstra"] + }, + { + "category": "person", + "codes": ["NAAM", "BROER", "ZUS", "KIND", "VADER", "MOEDER"], + "common": ["Maria", "Jan", "Anna", "Esther", "Pieter", "Sam"] + }, + { + "category": "profession", + "codes": ["BEROEP"], + "common": ["timmerman", "chirurgh", "leraar", "ober", "verslaggever"] + }, + { + "category": "country", + "codes": ["LAND"], + "common": ["Duitsland", "Nederland", "Japan", "Kameroen", "India"] + }, + { + "category": "education", + "codes": ["STUDIE", "OPLEIDING"], + "common": [ + "bedrijfskunde", + "informatica", + "filosofie", + "rechtsgeleerdheid", + "werktuigbouwkunde" + ] + }, + { + "category": "institution", + "codes": ["ZORGINSTELLING", "INSTELLING", "ZIEKENHUIS"], + "common": [ + "Diakonessenhuis", + "Rijnstate", + "Vogellanden", + "HagaZiekenhuis", + "Slingeland" + ] + }, + { + "category": "street", + "codes": ["STRAAT"], + "common": [ + "Kerkstraat", + "Schoolstraat", + "Molenstraat", + "Dorpsstraat", + "Julianastraat" + ] + }, + { + "category": "school", + "codes": ["SCHOOL"], + "common": [ + "Jozefschool", + "Mariaschool", + "Calvijnschool", + "Fredericusschool", + "Compagnonsschool" + ] + } +] diff --git a/src/sastadev/data/filledpauseslexicon/notanalyzewords.txt b/src/sastadev/data/filledpauseslexicon/notanalyzewords.txt new file mode 100644 index 0000000..0fed477 --- /dev/null +++ b/src/sastadev/data/filledpauseslexicon/notanalyzewords.txt @@ -0,0 +1,92 @@ +ahhh +aahhh +ah +aha +ahaa +alsjeblieft +au +bah +boem +brbrbr +brbrbrbr +brr +brroe +brrr +dag +dankjewel +eeh +ggg +gggg +ha +haa +haha +hahaha +hallo +hap +hee +hehe +hey +hhhaa +hihihihi +ho +hoep +hop +huh +huppekee +hé +ieee +ja +jaha +jahoor +jawel +jee +jieeiei +juuu +kijk +kijk eens +krikkerdemikmak +ksst +kukelkuu +lorre +mmm +nee +neeee +neeeee +neehee +o +oe +oeh +oeps +oh +ohja +ohoh +ohw +oja +ok +okay +okee +oké +ooh +oooh +paf +pang +pief +poef +pss +sss +ssss +sst +tata +toedoetoedoet +toetoet +tok +tsj +tss +uhuh +uhwuh +uuh +wap +wawa +wipwap +woef +ziezo \ No newline at end of file diff --git a/src/sastadev/data/filledpauseslexicon/oldfilledpauseslexicon.txt b/src/sastadev/data/filledpauseslexicon/oldfilledpauseslexicon.txt new file mode 100644 index 0000000..6003800 --- /dev/null +++ b/src/sastadev/data/filledpauseslexicon/oldfilledpauseslexicon.txt @@ -0,0 +1,32 @@ +eh +ə +m +ehm +hə +mm +uh +um +mmm +em +pf +ggg +aaa +hm +fff +hmhm +pgg +hn +rrr +prr +mmhmm +euh +uhm +eh +goh +hmm +mhm +o +oh +f +ff +buh diff --git a/src/sastadev/data/filledpauseslexicon/vuwordslexicon.txt b/src/sastadev/data/filledpauseslexicon/vuwordslexicon.txt new file mode 100644 index 0000000..78bb854 --- /dev/null +++ b/src/sastadev/data/filledpauseslexicon/vuwordslexicon.txt @@ -0,0 +1,14 @@ +goed +he +hè +hoor +kijk +mama +niet +nou +papa +stap +toe +wel +wip +zo \ No newline at end of file diff --git a/src/sastadev/data/inflectioncorrection.tsv.txt b/src/sastadev/data/inflectioncorrection.tsv.txt index c7f74e0..8d3972e 100644 --- a/src/sastadev/data/inflectioncorrection.tsv.txt +++ b/src/sastadev/data/inflectioncorrection.tsv.txt @@ -1,25 +1,37 @@ -gebakt gebakken Overgeneralisation -ebakt gebakken Overgeneralisation -bakt gebakken Overgeneralisation +gebakt gebakken Wrong Overgeneralisation +ebakt gebakken Overgeneralisation+Prefix ge without onset +bakt gebakken Overgeneralisation+Lacking ge prefix +sebakt gebakken Overgeneralisation+prefix ge pronounced as se gebakte gebakkene Overgeneralisation+ ebakte gebakkene Overgeneralisation+Prefix ge without onset +sebakte gebakkene Overgeneralisation+prefix ge pronounced as se +gebakd gebakken Wrong Overgeneralisation +ebakd gebakken Wrong Overgeneralisation+Prefix ge without onset +bakd gebakken Wrong Overgeneralisation+Lacking ge prefix ebakken gebakken Prefix ge without onset bakken gebakken Lacking ge prefix -geband gebannen Overgeneralisation +geband gebannen Wrong Overgeneralisation eband gebannen Overgeneralisation+Prefix ge without onset band gebannen Overgeneralisation+Lacking ge prefix +seband gebannen Overgeneralisation+prefix ge pronounced as se gebande gebannene Overgeneralisation+ ebande gebannene Overgeneralisation+Prefix ge without onset -gebant gebannen Overgeneralisation -ebant gebannen Overgeneralisation -bant gebannen Overgeneralisation +sebande gebannene Overgeneralisation+prefix ge pronounced as se +gebant gebannen Wrong Overgeneralisation +ebant gebannen Wrong Overgeneralisation+Prefix ge without onset +bant gebannen Wrong Overgeneralisation+Lacking ge prefix ebannen gebannen Prefix ge without onset bannen gebannen Lacking ge prefix -gebarst gebarsten Overgeneralisation -ebarst gebarsten Overgeneralisation -barst gebarsten Overgeneralisation +gebarst gebarsten Wrong Overgeneralisation +ebarst gebarsten Overgeneralisation+Prefix ge without onset +barst gebarsten Overgeneralisation+Lacking ge prefix +sebarst gebarsten Overgeneralisation+prefix ge pronounced as se gebarste gebarstene Overgeneralisation+ ebarste gebarstene Overgeneralisation+Prefix ge without onset +sebarste gebarstene Overgeneralisation+prefix ge pronounced as se +gebarstd gebarsten Wrong Overgeneralisation +ebarstd gebarsten Wrong Overgeneralisation+Prefix ge without onset +barstd gebarsten Wrong Overgeneralisation+Lacking ge prefix ebarsten gebarsten Prefix ge without onset barsten gebarsten Lacking ge prefix bederfde bedorvene Overgeneralisation @@ -27,32 +39,32 @@ bederfden bedierven Overgeneralisation bedierfde bedierf Irregular form plus regular suffix bedierfden bedierven Irregular form plus regular suffix bederfd bedorven Overgeneralisation -bederft bedorven Overgeneralisation +bederft bedorven Wrong Overgeneralisation bederfen bedorven Wrong -en suffix -bedorfd bedorven Overgeneralisation -bedorft bedorven Overgeneralisation +bedorfd bedorven Wrong Overgeneralisation +bedorft bedorven Wrong Overgeneralisation bedriegde bedrogene Overgeneralisation bedriegden bedrogen Overgeneralisation bedroogde bedroog Irregular form plus regular suffix bedroogden bedrogen Irregular form plus regular suffix bedriegd bedrogen Overgeneralisation -bedriegt bedrogen Overgeneralisation +bedriegt bedrogen Wrong Overgeneralisation bedriegen bedrogen Wrong -en suffix -bedroogt bedrogen Overgeneralisation +bedroogt bedrogen Wrong Overgeneralisation beginde begonnene Overgeneralisation beginden begonnen Overgeneralisation begonde begon Irregular form plus regular suffix begonden begonnen Irregular form plus regular suffix begind begonnen Overgeneralisation -begint begonnen Overgeneralisation +begint begonnen Wrong Overgeneralisation beginnen begonnen Wrong -en suffix -begont begonnen Overgeneralisation +begont begonnen Wrong Overgeneralisation behangde behangene Overgeneralisation behangden behingen Overgeneralisation behingde behing Irregular form plus regular suffix behingden behingen Irregular form plus regular suffix -behangd behangen Overgeneralisation -behangt behangen Overgeneralisation +behangd behangen Wrong Overgeneralisation +behangt behangen Wrong Overgeneralisation bergde borg Overgeneralisation bergden borgen Overgeneralisation borgde borg Irregular form plus regular suffix @@ -60,16 +72,18 @@ borgden borgen Irregular form plus regular suffix gebergd geborgen Overgeneralisation+ ebergd geborgen Overgeneralisation+Prefix ge without onset bergd geborgen Overgeneralisation+Lacking ge prefix +sebergd geborgen Overgeneralisation+prefix ge pronounced as se gebergde geborgene Overgeneralisation+ ebergde geborgene Overgeneralisation+Prefix ge without onset -gebergt geborgen Overgeneralisation -ebergt geborgen Overgeneralisation -bergt geborgen Overgeneralisation +sebergde geborgene Overgeneralisation+prefix ge pronounced as se +gebergt geborgen Wrong Overgeneralisation+ +ebergt geborgen Wrong Overgeneralisation+Prefix ge without onset +bergt geborgen Wrong Overgeneralisation+Lacking ge prefix gebergen geborgen Wrong -en suffix ebergen geborgen Wrong -en suffix bergen geborgen Wrong -en suffix -geborgd geborgen Overgeneralisation -geborgt geborgen Overgeneralisation +geborgd geborgen Wrong Overgeneralisation +geborgt geborgen Wrong Overgeneralisation eborgen geborgen Prefix ge without onset borgen geborgen Lacking ge prefix beveelde bevolene Overgeneralisation @@ -77,88 +91,104 @@ beveelden bevalen Overgeneralisation bevalde beval Irregular form plus regular suffix bevalden bevalen Irregular form plus regular suffix beveeld bevolen Overgeneralisation -beveelt bevolen Overgeneralisation +beveelt bevolen Wrong Overgeneralisation bevelen bevolen Wrong -en suffix -bevoolt bevolen Overgeneralisation +bevoolt bevolen Wrong Overgeneralisation bezwijkte bezwekene Overgeneralisation bezwijkten bezweken Overgeneralisation bezweekte bezweek Irregular form plus regular suffix bezweekten bezweken Irregular form plus regular suffix bezwijkt bezweken Overgeneralisation +bezwijkd bezweken Wrong Overgeneralisation bezwijken bezweken Wrong -en suffix -bezweekt bezweken Overgeneralisation +bezweekt bezweken Wrong Overgeneralisation +bezweekd bezweken Wrong Overgeneralisation bidde bad Overgeneralisation bidden gebeden Wrong -en suffix badde bad Irregular form plus regular suffix badden baden Irregular form plus regular suffix -gebid gebeden Overgeneralisation -ebid gebeden Overgeneralisation -bid gebeden Overgeneralisation +gebid gebeden Wrong Overgeneralisation+ +ebid gebeden Wrong Overgeneralisation+Prefix ge without onset +bid gebeden Wrong Overgeneralisation+Lacking ge prefix +sebid gebeden Overgeneralisation+prefix ge pronounced as se gebidde gebedene Overgeneralisation+ ebidde gebedene Overgeneralisation+Prefix ge without onset +sebidde gebedene Overgeneralisation+prefix ge pronounced as se gebidden gebeden Wrong -en suffix ebidden gebeden Wrong -en suffix -gebeed gebeden Overgeneralisation +gebeed gebeden Wrong Overgeneralisation ebeden gebeden Prefix ge without onset beden gebeden Lacking ge prefix biedde bood Overgeneralisation biedden boden Overgeneralisation boodde bood Irregular form plus regular suffix boodden boden Irregular form plus regular suffix -gebied geboden Overgeneralisation -ebied geboden Overgeneralisation -bied geboden Overgeneralisation +gebied geboden Wrong Overgeneralisation+ +ebied geboden Wrong Overgeneralisation+Prefix ge without onset +bied geboden Wrong Overgeneralisation+Lacking ge prefix +sebied geboden Overgeneralisation+prefix ge pronounced as se gebiede gebodene Overgeneralisation+ ebiede gebodene Overgeneralisation+Prefix ge without onset +sebiede gebodene Overgeneralisation+prefix ge pronounced as se gebieden geboden Wrong -en suffix ebieden geboden Wrong -en suffix bieden geboden Wrong -en suffix -geboodt geboden Overgeneralisation -gebood geboden Overgeneralisation +geboodt geboden Wrong Overgeneralisation +gebood geboden Wrong Overgeneralisation eboden geboden Prefix ge without onset boden geboden Lacking ge prefix bijtte beet Overgeneralisation bijtten beten Overgeneralisation beette beet Irregular form plus regular suffix beetten beten Irregular form plus regular suffix -gebijt gebeten Overgeneralisation -ebijt gebeten Overgeneralisation -bijt gebeten Overgeneralisation +gebijt gebeten Overgeneralisation+ +ebijt gebeten Overgeneralisation+Prefix ge without onset +bijt gebeten Overgeneralisation+Lacking ge prefix +sebijt gebeten Overgeneralisation+prefix ge pronounced as se gebijte gebetene Overgeneralisation+ ebijte gebetene Overgeneralisation+Prefix ge without onset +sebijte gebetene Overgeneralisation+prefix ge pronounced as se +gebijtd gebeten Wrong Overgeneralisation+ +ebijtd gebeten Wrong Overgeneralisation+Prefix ge without onset +bijtd gebeten Wrong Overgeneralisation+Lacking ge prefix gebijten gebeten Wrong -en suffix ebijten gebeten Wrong -en suffix bijten gebeten Wrong -en suffix -gebeet gebeten Overgeneralisation +gebeet gebeten Wrong Overgeneralisation +gebeetd gebeten Wrong Overgeneralisation ebeten gebeten Prefix ge without onset beten gebeten Lacking ge prefix bindde bond Overgeneralisation bindden bonden Overgeneralisation bondde bond Irregular form plus regular suffix bondden bonden Irregular form plus regular suffix -gebind gebonden Overgeneralisation -ebind gebonden Overgeneralisation -bind gebonden Overgeneralisation +gebind gebonden Wrong Overgeneralisation+ +ebind gebonden Wrong Overgeneralisation+Prefix ge without onset +bind gebonden Wrong Overgeneralisation+Lacking ge prefix +sebind gebonden Overgeneralisation+prefix ge pronounced as se gebinde gebondene Overgeneralisation+ ebinde gebondene Overgeneralisation+Prefix ge without onset +sebinde gebondene Overgeneralisation+prefix ge pronounced as se gebinden gebonden Wrong -en suffix ebinden gebonden Wrong -en suffix binden gebonden Wrong -en suffix -gebond gebonden Overgeneralisation +gebond gebonden Wrong Overgeneralisation ebonden gebonden Prefix ge without onset bonden gebonden Lacking ge prefix blaasde blies Overgeneralisation blaasden bliezen Overgeneralisation bliesde blies Irregular form plus regular suffix bliesden bliezen Irregular form plus regular suffix -geblaasd geblazen Overgeneralisation +geblaasd geblazen Wrong Overgeneralisation eblaasd geblazen Overgeneralisation+Prefix ge without onset blaasd geblazen Overgeneralisation+Lacking ge prefix +seblaasd geblazen Overgeneralisation+prefix ge pronounced as se geblaasde geblazene Overgeneralisation+ eblaasde geblazene Overgeneralisation+Prefix ge without onset -geblaast geblazen Overgeneralisation -eblaast geblazen Overgeneralisation -blaast geblazen Overgeneralisation +seblaasde geblazene Overgeneralisation+prefix ge pronounced as se +geblaast geblazen Wrong Overgeneralisation +eblaast geblazen Wrong Overgeneralisation+Prefix ge without onset +blaast geblazen Wrong Overgeneralisation+Lacking ge prefix geblasen geblazen Wrong -en suffix eblasen geblazen Wrong -en suffix blasen geblazen Wrong -en suffix @@ -168,15 +198,21 @@ blijkte bleek Overgeneralisation blijkten bleken Overgeneralisation bleekte bleek Irregular form plus regular suffix bleekten bleken Irregular form plus regular suffix -geblijkt gebleken Overgeneralisation -eblijkt gebleken Overgeneralisation -blijkt gebleken Overgeneralisation +geblijkt gebleken Overgeneralisation+ +eblijkt gebleken Overgeneralisation+Prefix ge without onset +blijkt gebleken Overgeneralisation+Lacking ge prefix +seblijkt gebleken Overgeneralisation+prefix ge pronounced as se geblijkte geblekene Overgeneralisation+ eblijkte geblekene Overgeneralisation+Prefix ge without onset +seblijkte geblekene Overgeneralisation+prefix ge pronounced as se +geblijkd gebleken Wrong Overgeneralisation+ +eblijkd gebleken Wrong Overgeneralisation+Prefix ge without onset +blijkd gebleken Wrong Overgeneralisation+Lacking ge prefix geblijken gebleken Wrong -en suffix eblijken gebleken Wrong -en suffix blijken gebleken Wrong -en suffix -gebleekt gebleken Overgeneralisation +gebleekt gebleken Wrong Overgeneralisation +gebleekd gebleken Wrong Overgeneralisation ebleken gebleken Prefix ge without onset bleken gebleken Lacking ge prefix blijfde bleef Overgeneralisation @@ -186,53 +222,69 @@ bleefden bleven Irregular form plus regular suffix geblijfd gebleven Overgeneralisation+ eblijfd gebleven Overgeneralisation+Prefix ge without onset blijfd gebleven Overgeneralisation+Lacking ge prefix +seblijfd gebleven Overgeneralisation+prefix ge pronounced as se geblijfde geblevene Overgeneralisation+ eblijfde geblevene Overgeneralisation+Prefix ge without onset -geblijft gebleven Overgeneralisation -eblijft gebleven Overgeneralisation -blijft gebleven Overgeneralisation +seblijfde geblevene Overgeneralisation+prefix ge pronounced as se +geblijft gebleven Wrong Overgeneralisation+ +eblijft gebleven Wrong Overgeneralisation+Prefix ge without onset +blijft gebleven Wrong Overgeneralisation+Lacking ge prefix geblijfen gebleven Wrong -en suffix eblijfen gebleven Wrong -en suffix blijfen gebleven Wrong -en suffix -gebleefd gebleven Overgeneralisation -gebleeft gebleven Overgeneralisation +gebleefd gebleven Wrong Overgeneralisation +gebleeft gebleven Wrong Overgeneralisation ebleven gebleven Prefix ge without onset bleven gebleven Lacking ge prefix blinkte blonk Overgeneralisation blinkten blonken Overgeneralisation blonkte blonk Irregular form plus regular suffix blonkten blonken Irregular form plus regular suffix -geblinkt geblonken Overgeneralisation -eblinkt geblonken Overgeneralisation -blinkt geblonken Overgeneralisation +geblinkt geblonken Overgeneralisation+ +eblinkt geblonken Overgeneralisation+Prefix ge without onset +blinkt geblonken Overgeneralisation+Lacking ge prefix +seblinkt geblonken Overgeneralisation+prefix ge pronounced as se geblinkte geblonkene Overgeneralisation+ eblinkte geblonkene Overgeneralisation+Prefix ge without onset +seblinkte geblonkene Overgeneralisation+prefix ge pronounced as se +geblinkd geblonken Wrong Overgeneralisation+ +eblinkd geblonken Wrong Overgeneralisation+Prefix ge without onset +blinkd geblonken Wrong Overgeneralisation+Lacking ge prefix geblinken geblonken Wrong -en suffix eblinken geblonken Wrong -en suffix blinken geblonken Wrong -en suffix -geblonkt geblonken Overgeneralisation +geblonkt geblonken Wrong Overgeneralisation +geblonkd geblonken Wrong Overgeneralisation eblonken geblonken Prefix ge without onset blonken geblonken Lacking ge prefix -gebraad gebraden Overgeneralisation -ebraad gebraden Overgeneralisation -braad gebraden Overgeneralisation +gebraad gebraden Wrong Overgeneralisation +ebraad gebraden Wrong Overgeneralisation+Prefix ge without onset +braad gebraden Wrong Overgeneralisation+Lacking ge prefix +sebraad gebraden Overgeneralisation+prefix ge pronounced as se gebrade gebradene Overgeneralisation+ ebrade gebradene Overgeneralisation+Prefix ge without onset +sebrade gebradene Overgeneralisation+prefix ge pronounced as se ebraden gebraden Prefix ge without onset braden gebraden Lacking ge prefix breekte brak Overgeneralisation breekten braken Overgeneralisation brakte brak Irregular form plus regular suffix brakten braken Irregular form plus regular suffix -gebreekt gebroken Overgeneralisation -ebreekt gebroken Overgeneralisation -breekt gebroken Overgeneralisation +gebreekt gebroken Overgeneralisation+ +ebreekt gebroken Overgeneralisation+Prefix ge without onset +breekt gebroken Overgeneralisation+Lacking ge prefix +sebreekt gebroken Overgeneralisation+prefix ge pronounced as se gebreekte gebrokene Overgeneralisation+ ebreekte gebrokene Overgeneralisation+Prefix ge without onset +sebreekte gebrokene Overgeneralisation+prefix ge pronounced as se +gebreekd gebroken Wrong Overgeneralisation+ +ebreekd gebroken Wrong Overgeneralisation+Prefix ge without onset +breekd gebroken Wrong Overgeneralisation+Lacking ge prefix gebreken gebroken Wrong -en suffix ebreken gebroken Wrong -en suffix breken gebroken Wrong -en suffix -gebrookt gebroken Overgeneralisation +gebrookt gebroken Wrong Overgeneralisation +gebrookd gebroken Wrong Overgeneralisation ebroken gebroken Prefix ge without onset broken gebroken Lacking ge prefix brengde bracht Overgeneralisation @@ -242,24 +294,28 @@ brachtden brachten Irregular form plus regular suffix gebrengd gebracht Overgeneralisation+ ebrengd gebracht Overgeneralisation+Prefix ge without onset brengd gebracht Overgeneralisation+Lacking ge prefix +sebrengd gebracht Overgeneralisation+prefix ge pronounced as se gebrengde gebrachte Overgeneralisation+ ebrengde gebrachte Overgeneralisation+Prefix ge without onset -gebrengt gebracht Overgeneralisation -ebrengt gebracht Overgeneralisation -brengt gebracht Overgeneralisation +sebrengde gebrachte Overgeneralisation+prefix ge pronounced as se +gebrengt gebracht Wrong Overgeneralisation+ +ebrengt gebracht Wrong Overgeneralisation+Prefix ge without onset +brengt gebracht Wrong Overgeneralisation+Lacking ge prefix gebrengen gebracht Wrong -en suffix ebrengen gebracht Wrong -en suffix brengen gebracht Wrong -en suffix ebracht gebracht Prefix ge without onset bracht gebracht Lacking ge prefix -gebrouwd gebrouwen Overgeneralisation +gebrouwd gebrouwen Wrong Overgeneralisation ebrouwd gebrouwen Overgeneralisation+Prefix ge without onset brouwd gebrouwen Overgeneralisation+Lacking ge prefix +sebrouwd gebrouwen Overgeneralisation+prefix ge pronounced as se gebrouwde gebrouwene Overgeneralisation+ ebrouwde gebrouwene Overgeneralisation+Prefix ge without onset -gebrouwt gebrouwen Overgeneralisation -ebrouwt gebrouwen Overgeneralisation -brouwt gebrouwen Overgeneralisation +sebrouwde gebrouwene Overgeneralisation+prefix ge pronounced as se +gebrouwt gebrouwen Wrong Overgeneralisation +ebrouwt gebrouwen Wrong Overgeneralisation+Prefix ge without onset +brouwt gebrouwen Wrong Overgeneralisation+Lacking ge prefix ebrouwen gebrouwen Prefix ge without onset brouwen gebrouwen Lacking ge prefix buigde boog Overgeneralisation @@ -269,26 +325,33 @@ boogden bogen Irregular form plus regular suffix gebuigd gebogen Overgeneralisation+ ebuigd gebogen Overgeneralisation+Prefix ge without onset buigd gebogen Overgeneralisation+Lacking ge prefix +sebuigd gebogen Overgeneralisation+prefix ge pronounced as se gebuigde gebogene Overgeneralisation+ ebuigde gebogene Overgeneralisation+Prefix ge without onset -gebuigt gebogen Overgeneralisation -ebuigt gebogen Overgeneralisation -buigt gebogen Overgeneralisation +sebuigde gebogene Overgeneralisation+prefix ge pronounced as se +gebuigt gebogen Wrong Overgeneralisation+ +ebuigt gebogen Wrong Overgeneralisation+Prefix ge without onset +buigt gebogen Wrong Overgeneralisation+Lacking ge prefix gebuigen gebogen Wrong -en suffix ebuigen gebogen Wrong -en suffix buigen gebogen Wrong -en suffix -geboogt gebogen Overgeneralisation +geboogt gebogen Wrong Overgeneralisation ebogen gebogen Prefix ge without onset bogen gebogen Lacking ge prefix denkte dacht Overgeneralisation denkten dachten Overgeneralisation dachtte dacht Irregular form plus regular suffix dachtten dachten Irregular form plus regular suffix -gedenkt gedacht Overgeneralisation -edenkt gedacht Overgeneralisation -denkt gedacht Overgeneralisation +gedenkt gedacht Overgeneralisation+ +edenkt gedacht Overgeneralisation+Prefix ge without onset +denkt gedacht Overgeneralisation+Lacking ge prefix +sedenkt gedacht Overgeneralisation+prefix ge pronounced as se gedenkte gedachte Overgeneralisation+ edenkte gedachte Overgeneralisation+Prefix ge without onset +sedenkte gedachte Overgeneralisation+prefix ge pronounced as se +gedenkd gedacht Wrong Overgeneralisation+ +edenkd gedacht Wrong Overgeneralisation+Prefix ge without onset +denkd gedacht Wrong Overgeneralisation+Lacking ge prefix gedenken gedacht Wrong -en suffix edenken gedacht Wrong -en suffix denken gedacht Wrong -en suffix @@ -301,27 +364,31 @@ dongden dongen Irregular form plus regular suffix gedingd gedongen Overgeneralisation+ edingd gedongen Overgeneralisation+Prefix ge without onset dingd gedongen Overgeneralisation+Lacking ge prefix +sedingd gedongen Overgeneralisation+prefix ge pronounced as se gedingde gedongene Overgeneralisation+ edingde gedongene Overgeneralisation+Prefix ge without onset -gedingt gedongen Overgeneralisation -edingt gedongen Overgeneralisation -dingt gedongen Overgeneralisation +sedingde gedongene Overgeneralisation+prefix ge pronounced as se +gedingt gedongen Wrong Overgeneralisation+ +edingt gedongen Wrong Overgeneralisation+Prefix ge without onset +dingt gedongen Wrong Overgeneralisation+Lacking ge prefix gedingen gedongen Wrong -en suffix edingen gedongen Wrong -en suffix dingen gedongen Wrong -en suffix -gedongd gedongen Overgeneralisation -gedongt gedongen Overgeneralisation +gedongd gedongen Wrong Overgeneralisation +gedongt gedongen Wrong Overgeneralisation edongen gedongen Prefix ge without onset dongen gedongen Lacking ge prefix doete deed Overgeneralisation doeten deden Overgeneralisation deedte deed Irregular form plus regular suffix deedten deden Irregular form plus regular suffix -gedoet gedaan Overgeneralisation -edoet gedaan Overgeneralisation -doet gedaan Overgeneralisation +gedoet gedaan Wrong Overgeneralisation+ +edoet gedaan Wrong Overgeneralisation+Prefix ge without onset +doet gedaan Wrong Overgeneralisation+Lacking ge prefix +sedoet gedaan Overgeneralisation+prefix ge pronounced as se gedoete gedaane Overgeneralisation+ edoete gedaane Overgeneralisation+Prefix ge without onset +sedoete gedaane Overgeneralisation+prefix ge pronounced as se gedoen gedaan Wrong -en suffix edoen gedaan Wrong -en suffix doen gedaan Wrong -en suffix @@ -331,14 +398,16 @@ draagde droeg Overgeneralisation draagden droegen Overgeneralisation droegde droeg Irregular form plus regular suffix droegden droegen Irregular form plus regular suffix -gedraagd gedragen Overgeneralisation +gedraagd gedragen Wrong Overgeneralisation edraagd gedragen Overgeneralisation+Prefix ge without onset draagd gedragen Overgeneralisation+Lacking ge prefix +sedraagd gedragen Overgeneralisation+prefix ge pronounced as se gedraagde gedragene Overgeneralisation+ edraagde gedragene Overgeneralisation+Prefix ge without onset -gedraagt gedragen Overgeneralisation -edraagt gedragen Overgeneralisation -draagt gedragen Overgeneralisation +sedraagde gedragene Overgeneralisation+prefix ge pronounced as se +gedraagt gedragen Wrong Overgeneralisation +edraagt gedragen Wrong Overgeneralisation+Prefix ge without onset +draagt gedragen Wrong Overgeneralisation+Lacking ge prefix edragen gedragen Prefix ge without onset dragen gedragen Lacking ge prefix drijfde dreef Overgeneralisation @@ -348,16 +417,18 @@ dreefden dreven Irregular form plus regular suffix gedrijfd gedreven Overgeneralisation+ edrijfd gedreven Overgeneralisation+Prefix ge without onset drijfd gedreven Overgeneralisation+Lacking ge prefix +sedrijfd gedreven Overgeneralisation+prefix ge pronounced as se gedrijfde gedrevene Overgeneralisation+ edrijfde gedrevene Overgeneralisation+Prefix ge without onset -gedrijft gedreven Overgeneralisation -edrijft gedreven Overgeneralisation -drijft gedreven Overgeneralisation +sedrijfde gedrevene Overgeneralisation+prefix ge pronounced as se +gedrijft gedreven Wrong Overgeneralisation+ +edrijft gedreven Wrong Overgeneralisation+Prefix ge without onset +drijft gedreven Wrong Overgeneralisation+Lacking ge prefix gedrijfen gedreven Wrong -en suffix edrijfen gedreven Wrong -en suffix drijfen gedreven Wrong -en suffix -gedreefd gedreven Overgeneralisation -gedreeft gedreven Overgeneralisation +gedreefd gedreven Wrong Overgeneralisation +gedreeft gedreven Wrong Overgeneralisation edreven gedreven Prefix ge without onset dreven gedreven Lacking ge prefix dringde drong Overgeneralisation @@ -367,61 +438,81 @@ drongden drongen Irregular form plus regular suffix gedringd gedrongen Overgeneralisation+ edringd gedrongen Overgeneralisation+Prefix ge without onset dringd gedrongen Overgeneralisation+Lacking ge prefix +sedringd gedrongen Overgeneralisation+prefix ge pronounced as se gedringde gedrongene Overgeneralisation+ edringde gedrongene Overgeneralisation+Prefix ge without onset -gedringt gedrongen Overgeneralisation -edringt gedrongen Overgeneralisation -dringt gedrongen Overgeneralisation +sedringde gedrongene Overgeneralisation+prefix ge pronounced as se +gedringt gedrongen Wrong Overgeneralisation+ +edringt gedrongen Wrong Overgeneralisation+Prefix ge without onset +dringt gedrongen Wrong Overgeneralisation+Lacking ge prefix gedringen gedrongen Wrong -en suffix edringen gedrongen Wrong -en suffix dringen gedrongen Wrong -en suffix -gedrongd gedrongen Overgeneralisation -gedrongt gedrongen Overgeneralisation +gedrongd gedrongen Wrong Overgeneralisation +gedrongt gedrongen Wrong Overgeneralisation edrongen gedrongen Prefix ge without onset drongen gedrongen Lacking ge prefix drinkte dronk Overgeneralisation drinkten dronken Overgeneralisation dronkte dronk Irregular form plus regular suffix dronkten dronken Irregular form plus regular suffix -gedrinkt gedronken Overgeneralisation -edrinkt gedronken Overgeneralisation -drinkt gedronken Overgeneralisation +gedrinkt gedronken Overgeneralisation+ +edrinkt gedronken Overgeneralisation+Prefix ge without onset +drinkt gedronken Overgeneralisation+Lacking ge prefix +sedrinkt gedronken Overgeneralisation+prefix ge pronounced as se gedrinkte gedronkene Overgeneralisation+ edrinkte gedronkene Overgeneralisation+Prefix ge without onset +sedrinkte gedronkene Overgeneralisation+prefix ge pronounced as se +gedrinkd gedronken Wrong Overgeneralisation+ +edrinkd gedronken Wrong Overgeneralisation+Prefix ge without onset +drinkd gedronken Wrong Overgeneralisation+Lacking ge prefix gedrinken gedronken Wrong -en suffix edrinken gedronken Wrong -en suffix drinken gedronken Wrong -en suffix -gedronkt gedronken Overgeneralisation +gedronkt gedronken Wrong Overgeneralisation +gedronkd gedronken Wrong Overgeneralisation edronken gedronken Prefix ge without onset dronken gedronken Lacking ge prefix druipte droop Overgeneralisation druipten dropen Overgeneralisation droopte droop Irregular form plus regular suffix droopten dropen Irregular form plus regular suffix -gedruipt gedropen Overgeneralisation -edruipt gedropen Overgeneralisation -druipt gedropen Overgeneralisation +gedruipt gedropen Overgeneralisation+ +edruipt gedropen Overgeneralisation+Prefix ge without onset +druipt gedropen Overgeneralisation+Lacking ge prefix +sedruipt gedropen Overgeneralisation+prefix ge pronounced as se gedruipte gedropene Overgeneralisation+ edruipte gedropene Overgeneralisation+Prefix ge without onset +sedruipte gedropene Overgeneralisation+prefix ge pronounced as se +gedruipd gedropen Wrong Overgeneralisation+ +edruipd gedropen Wrong Overgeneralisation+Prefix ge without onset +druipd gedropen Wrong Overgeneralisation+Lacking ge prefix gedruipen gedropen Wrong -en suffix edruipen gedropen Wrong -en suffix druipen gedropen Wrong -en suffix -gedroopt gedropen Overgeneralisation +gedroopt gedropen Wrong Overgeneralisation +gedroopd gedropen Wrong Overgeneralisation edropen gedropen Prefix ge without onset dropen gedropen Lacking ge prefix duikte dook Overgeneralisation duikten doken Overgeneralisation dookte dook Irregular form plus regular suffix dookten doken Irregular form plus regular suffix -geduikt gedoken Overgeneralisation -eduikt gedoken Overgeneralisation -duikt gedoken Overgeneralisation +geduikt gedoken Overgeneralisation+ +eduikt gedoken Overgeneralisation+Prefix ge without onset +duikt gedoken Overgeneralisation+Lacking ge prefix +seduikt gedoken Overgeneralisation+prefix ge pronounced as se geduikte gedokene Overgeneralisation+ eduikte gedokene Overgeneralisation+Prefix ge without onset +seduikte gedokene Overgeneralisation+prefix ge pronounced as se +geduikd gedoken Wrong Overgeneralisation+ +eduikd gedoken Wrong Overgeneralisation+Prefix ge without onset +duikd gedoken Wrong Overgeneralisation+Lacking ge prefix geduiken gedoken Wrong -en suffix eduiken gedoken Wrong -en suffix duiken gedoken Wrong -en suffix -gedookt gedoken Overgeneralisation +gedookt gedoken Wrong Overgeneralisation +gedookd gedoken Wrong Overgeneralisation edoken gedoken Prefix ge without onset doken gedoken Lacking ge prefix dwingde dwong Overgeneralisation @@ -431,16 +522,18 @@ dwongden dwongen Irregular form plus regular suffix gedwingd gedwongen Overgeneralisation+ edwingd gedwongen Overgeneralisation+Prefix ge without onset dwingd gedwongen Overgeneralisation+Lacking ge prefix +sedwingd gedwongen Overgeneralisation+prefix ge pronounced as se gedwingde gedwongene Overgeneralisation+ edwingde gedwongene Overgeneralisation+Prefix ge without onset -gedwingt gedwongen Overgeneralisation -edwingt gedwongen Overgeneralisation -dwingt gedwongen Overgeneralisation +sedwingde gedwongene Overgeneralisation+prefix ge pronounced as se +gedwingt gedwongen Wrong Overgeneralisation+ +edwingt gedwongen Wrong Overgeneralisation+Prefix ge without onset +dwingt gedwongen Wrong Overgeneralisation+Lacking ge prefix gedwingen gedwongen Wrong -en suffix edwingen gedwongen Wrong -en suffix dwingen gedwongen Wrong -en suffix -gedwongd gedwongen Overgeneralisation -gedwongt gedwongen Overgeneralisation +gedwongd gedwongen Wrong Overgeneralisation +gedwongt gedwongen Wrong Overgeneralisation edwongen gedwongen Prefix ge without onset dwongen gedwongen Lacking ge prefix eette at Overgeneralisation @@ -449,30 +542,40 @@ atte at Irregular form plus regular suffix atten aten Irregular form plus regular suffix geeet gegeten Overgeneralisation+ eeet gegeten Overgeneralisation+Prefix ge without onset -eet gegeten Overgeneralisation +eet gegeten Overgeneralisation+Lacking ge prefix +seeet gegeten Overgeneralisation+prefix ge pronounced as se geete gegetene Overgeneralisation+ eete gegetene Overgeneralisation+Prefix ge without onset -geëet gegeten Overgeneralisation -eëet gegeten Overgeneralisation +seete gegetene Overgeneralisation+prefix ge pronounced as se +geëetd gegeten Wrong Overgeneralisation+ +eëetd gegeten Wrong Overgeneralisation+Prefix ge without onset +eetd gegeten Wrong Overgeneralisation+Lacking ge prefix geëten gegeten Wrong -en suffix eëten gegeten Wrong -en suffix eten gegeten Wrong -en suffix -gegeet gegeten Overgeneralisation +gegeet gegeten Wrong Overgeneralisation +gegeetd gegeten Wrong Overgeneralisation egeten gegeten Prefix ge without onset geten gegeten Lacking ge prefix fluitte floot Overgeneralisation fluitten floten Overgeneralisation flootte floot Irregular form plus regular suffix flootten floten Irregular form plus regular suffix -gefluit gefloten Overgeneralisation -efluit gefloten Overgeneralisation -fluit gefloten Overgeneralisation +gefluit gefloten Overgeneralisation+ +efluit gefloten Overgeneralisation+Prefix ge without onset +fluit gefloten Overgeneralisation+Lacking ge prefix +sefluit gefloten Overgeneralisation+prefix ge pronounced as se gefluite geflotene Overgeneralisation+ efluite geflotene Overgeneralisation+Prefix ge without onset +sefluite geflotene Overgeneralisation+prefix ge pronounced as se +gefluitd gefloten Wrong Overgeneralisation+ +efluitd gefloten Wrong Overgeneralisation+Prefix ge without onset +fluitd gefloten Wrong Overgeneralisation+Lacking ge prefix gefluiten gefloten Wrong -en suffix efluiten gefloten Wrong -en suffix fluiten gefloten Wrong -en suffix -gefloot gefloten Overgeneralisation +gefloot gefloten Wrong Overgeneralisation +geflootd gefloten Wrong Overgeneralisation efloten gefloten Prefix ge without onset floten gefloten Lacking ge prefix gade ging Overgeneralisation @@ -482,34 +585,38 @@ gingden gingen Irregular form plus regular suffix gegaad gegaan Overgeneralisation+ egaad gegaan Overgeneralisation+Prefix ge without onset gaad gegaan Overgeneralisation+Lacking ge prefix +segaad gegaan Overgeneralisation+prefix ge pronounced as se gegade gegaane Overgeneralisation+ egade gegaane Overgeneralisation+Prefix ge without onset -gegaat gegaan Overgeneralisation -egaat gegaan Overgeneralisation -gaat gegaan Overgeneralisation +segade gegaane Overgeneralisation+prefix ge pronounced as se +gegaat gegaan Wrong Overgeneralisation+ +egaat gegaan Wrong Overgeneralisation+Prefix ge without onset +gaat gegaan Wrong Overgeneralisation+Lacking ge prefix egaan gegaan Prefix ge without onset gaan gegaan Lacking ge prefix geldde gold Overgeneralisation geldden golden Overgeneralisation goldde gold Irregular form plus regular suffix goldden golden Irregular form plus regular suffix -gegeld gegolden Overgeneralisation -egeld gegolden Overgeneralisation -geld gegolden Overgeneralisation +gegeld gegolden Wrong Overgeneralisation+ +egeld gegolden Wrong Overgeneralisation+Prefix ge without onset +geld gegolden Wrong Overgeneralisation+Lacking ge prefix +segeld gegolden Overgeneralisation+prefix ge pronounced as se gegelde gegoldene Overgeneralisation+ egelde gegoldene Overgeneralisation+Prefix ge without onset +segelde gegoldene Overgeneralisation+prefix ge pronounced as se gegelden gegolden Wrong -en suffix egelden gegolden Wrong -en suffix gelden gegolden Wrong -en suffix -gegold gegolden Overgeneralisation +gegold gegolden Wrong Overgeneralisation egolden gegolden Prefix ge without onset golden gegolden Lacking ge prefix geneesde genezene Overgeneralisation geneesden genazen Overgeneralisation genasde genas Irregular form plus regular suffix genasden genazen Irregular form plus regular suffix -geneesd genezen Overgeneralisation -geneest genezen Overgeneralisation +geneesd genezen Wrong Overgeneralisation +geneest genezen Wrong Overgeneralisation genesen genezen Wrong -en suffix enezen genezen Prefix ge without onset nezen genezen Lacking ge prefix @@ -519,22 +626,26 @@ genootte genoot Irregular form plus regular suffix genootten genoten Irregular form plus regular suffix geniet genoten Overgeneralisation geniete genotene Overgeneralisation +genietd genoten Wrong Overgeneralisation genieten genoten Wrong -en suffix -genoot genoten Overgeneralisation +genoot genoten Wrong Overgeneralisation +genootd genoten Wrong Overgeneralisation enoten genoten Prefix ge without onset noten genoten Lacking ge prefix geefde gaf Overgeneralisation geefden gaven Overgeneralisation gafde gaf Irregular form plus regular suffix gafden gaven Irregular form plus regular suffix -gegeefd gegeven Overgeneralisation +gegeefd gegeven Wrong Overgeneralisation egeefd gegeven Overgeneralisation+Prefix ge without onset geefd gegeven Overgeneralisation+Lacking ge prefix +segeefd gegeven Overgeneralisation+prefix ge pronounced as se gegeefde gegevene Overgeneralisation+ egeefde gegevene Overgeneralisation+Prefix ge without onset -gegeeft gegeven Overgeneralisation -egeeft gegeven Overgeneralisation -geeft gegeven Overgeneralisation +segeefde gegevene Overgeneralisation+prefix ge pronounced as se +gegeeft gegeven Wrong Overgeneralisation +egeeft gegeven Wrong Overgeneralisation+Prefix ge without onset +geeft gegeven Wrong Overgeneralisation+Lacking ge prefix gegefen gegeven Wrong -en suffix egefen gegeven Wrong -en suffix gefen gegeven Wrong -en suffix @@ -544,30 +655,38 @@ giette goot Overgeneralisation gietten goten Overgeneralisation gootte goot Irregular form plus regular suffix gootten goten Irregular form plus regular suffix -gegiet gegoten Overgeneralisation -egiet gegoten Overgeneralisation -giet gegoten Overgeneralisation +gegiet gegoten Overgeneralisation+ +egiet gegoten Overgeneralisation+Prefix ge without onset +giet gegoten Overgeneralisation+Lacking ge prefix +segiet gegoten Overgeneralisation+prefix ge pronounced as se gegiete gegotene Overgeneralisation+ egiete gegotene Overgeneralisation+Prefix ge without onset +segiete gegotene Overgeneralisation+prefix ge pronounced as se +gegietd gegoten Wrong Overgeneralisation+ +egietd gegoten Wrong Overgeneralisation+Prefix ge without onset +gietd gegoten Wrong Overgeneralisation+Lacking ge prefix gegieten gegoten Wrong -en suffix egieten gegoten Wrong -en suffix gieten gegoten Wrong -en suffix -gegoot gegoten Overgeneralisation +gegoot gegoten Wrong Overgeneralisation +gegootd gegoten Wrong Overgeneralisation egoten gegoten Prefix ge without onset goten gegoten Lacking ge prefix glijdde gleed Overgeneralisation glijdden gleden Overgeneralisation gleedde gleed Irregular form plus regular suffix gleedden gleden Irregular form plus regular suffix -geglijd gegleden Overgeneralisation -eglijd gegleden Overgeneralisation -glijd gegleden Overgeneralisation +geglijd gegleden Wrong Overgeneralisation+ +eglijd gegleden Wrong Overgeneralisation+Prefix ge without onset +glijd gegleden Wrong Overgeneralisation+Lacking ge prefix +seglijd gegleden Overgeneralisation+prefix ge pronounced as se geglijde gegledene Overgeneralisation+ eglijde gegledene Overgeneralisation+Prefix ge without onset +seglijde gegledene Overgeneralisation+prefix ge pronounced as se geglijden gegleden Wrong -en suffix eglijden gegleden Wrong -en suffix glijden gegleden Wrong -en suffix -gegleed gegleden Overgeneralisation +gegleed gegleden Wrong Overgeneralisation egleden gegleden Prefix ge without onset gleden gegleden Lacking ge prefix glimde glom Overgeneralisation @@ -577,29 +696,33 @@ glomden glommen Irregular form plus regular suffix geglimd geglommen Overgeneralisation+ eglimd geglommen Overgeneralisation+Prefix ge without onset glimd geglommen Overgeneralisation+Lacking ge prefix +seglimd geglommen Overgeneralisation+prefix ge pronounced as se geglimde geglommene Overgeneralisation+ eglimde geglommene Overgeneralisation+Prefix ge without onset -geglimt geglommen Overgeneralisation -eglimt geglommen Overgeneralisation -glimt geglommen Overgeneralisation +seglimde geglommene Overgeneralisation+prefix ge pronounced as se +geglimt geglommen Wrong Overgeneralisation+ +eglimt geglommen Wrong Overgeneralisation+Prefix ge without onset +glimt geglommen Wrong Overgeneralisation+Lacking ge prefix geglimmen geglommen Wrong -en suffix eglimmen geglommen Wrong -en suffix glimmen geglommen Wrong -en suffix -geglomt geglommen Overgeneralisation +geglomt geglommen Wrong Overgeneralisation eglommen geglommen Prefix ge without onset glommen geglommen Lacking ge prefix graafde groef Overgeneralisation graafden groeven Overgeneralisation groefde groef Irregular form plus regular suffix groefden groeven Irregular form plus regular suffix -gegraafd gegraven Overgeneralisation +gegraafd gegraven Wrong Overgeneralisation egraafd gegraven Overgeneralisation+Prefix ge without onset graafd gegraven Overgeneralisation+Lacking ge prefix +segraafd gegraven Overgeneralisation+prefix ge pronounced as se gegraafde gegravene Overgeneralisation+ egraafde gegravene Overgeneralisation+Prefix ge without onset -gegraaft gegraven Overgeneralisation -egraaft gegraven Overgeneralisation -graaft gegraven Overgeneralisation +segraafde gegravene Overgeneralisation+prefix ge pronounced as se +gegraaft gegraven Wrong Overgeneralisation +egraaft gegraven Wrong Overgeneralisation+Prefix ge without onset +graaft gegraven Wrong Overgeneralisation+Lacking ge prefix gegrafen gegraven Wrong -en suffix egrafen gegraven Wrong -en suffix grafen gegraven Wrong -en suffix @@ -609,29 +732,37 @@ grijpte greep Overgeneralisation grijpten grepen Overgeneralisation greepte greep Irregular form plus regular suffix greepten grepen Irregular form plus regular suffix -gegrijpt gegrepen Overgeneralisation -egrijpt gegrepen Overgeneralisation -grijpt gegrepen Overgeneralisation +gegrijpt gegrepen Overgeneralisation+ +egrijpt gegrepen Overgeneralisation+Prefix ge without onset +grijpt gegrepen Overgeneralisation+Lacking ge prefix +segrijpt gegrepen Overgeneralisation+prefix ge pronounced as se gegrijpte gegrepene Overgeneralisation+ egrijpte gegrepene Overgeneralisation+Prefix ge without onset +segrijpte gegrepene Overgeneralisation+prefix ge pronounced as se +gegrijpd gegrepen Wrong Overgeneralisation+ +egrijpd gegrepen Wrong Overgeneralisation+Prefix ge without onset +grijpd gegrepen Wrong Overgeneralisation+Lacking ge prefix gegrijpen gegrepen Wrong -en suffix egrijpen gegrepen Wrong -en suffix grijpen gegrepen Wrong -en suffix -gegreept gegrepen Overgeneralisation +gegreept gegrepen Wrong Overgeneralisation +gegreepd gegrepen Wrong Overgeneralisation egrepen gegrepen Prefix ge without onset grepen gegrepen Lacking ge prefix hangde hing Overgeneralisation hangden hingen Overgeneralisation hingde hing Irregular form plus regular suffix hingden hingen Irregular form plus regular suffix -gehangd gehangen Overgeneralisation +gehangd gehangen Wrong Overgeneralisation ehangd gehangen Overgeneralisation+Prefix ge without onset hangd gehangen Overgeneralisation+Lacking ge prefix +sehangd gehangen Overgeneralisation+prefix ge pronounced as se gehangde gehangene Overgeneralisation+ ehangde gehangene Overgeneralisation+Prefix ge without onset -gehangt gehangen Overgeneralisation -ehangt gehangen Overgeneralisation -hangt gehangen Overgeneralisation +sehangde gehangene Overgeneralisation+prefix ge pronounced as se +gehangt gehangen Wrong Overgeneralisation +ehangt gehangen Wrong Overgeneralisation+Prefix ge without onset +hangt gehangen Wrong Overgeneralisation+Lacking ge prefix ehangen gehangen Prefix ge without onset hangen gehangen Lacking ge prefix hebde had Overgeneralisation @@ -640,11 +771,13 @@ hadde had Irregular form plus regular suffix gehebd gehad Overgeneralisation+ ehebd gehad Overgeneralisation+Prefix ge without onset hebd gehad Overgeneralisation+Lacking ge prefix +sehebd gehad Overgeneralisation+prefix ge pronounced as se gehebde gehade Overgeneralisation+ ehebde gehade Overgeneralisation+Prefix ge without onset -gehebt gehad Overgeneralisation -ehebt gehad Overgeneralisation -hebt gehad Overgeneralisation +sehebde gehade Overgeneralisation+prefix ge pronounced as se +gehebt gehad Wrong Overgeneralisation+ +ehebt gehad Wrong Overgeneralisation+Prefix ge without onset +hebt gehad Wrong Overgeneralisation+Lacking ge prefix gehebben gehad Wrong -en suffix ehebben gehad Wrong -en suffix hebben gehad Wrong -en suffix @@ -654,63 +787,87 @@ hefte hief Overgeneralisation heften hieven Overgeneralisation hiefte hief Irregular form plus regular suffix hieften hieven Irregular form plus regular suffix -geheft geheven Overgeneralisation -eheft geheven Overgeneralisation -heft geheven Overgeneralisation +geheft geheven Overgeneralisation+ +eheft geheven Overgeneralisation+Prefix ge without onset +heft geheven Overgeneralisation+Lacking ge prefix +seheft geheven Overgeneralisation+prefix ge pronounced as se gehefte gehevene Overgeneralisation+ ehefte gehevene Overgeneralisation+Prefix ge without onset +sehefte gehevene Overgeneralisation+prefix ge pronounced as se +gehefd geheven Wrong Overgeneralisation+ +ehefd geheven Wrong Overgeneralisation+Prefix ge without onset +hefd geheven Wrong Overgeneralisation+Lacking ge prefix geheffen geheven Wrong -en suffix eheffen geheven Wrong -en suffix heffen geheven Wrong -en suffix -geheefd geheven Overgeneralisation -geheeft geheven Overgeneralisation +geheefd geheven Wrong Overgeneralisation +geheeft geheven Wrong Overgeneralisation eheven geheven Prefix ge without onset heven geheven Lacking ge prefix helpte hielp Overgeneralisation helpten hielpen Overgeneralisation hielpte hielp Irregular form plus regular suffix hielpten hielpen Irregular form plus regular suffix -gehelpt geholpen Overgeneralisation -ehelpt geholpen Overgeneralisation -helpt geholpen Overgeneralisation +gehelpt geholpen Overgeneralisation+ +ehelpt geholpen Overgeneralisation+Prefix ge without onset +helpt geholpen Overgeneralisation+Lacking ge prefix +sehelpt geholpen Overgeneralisation+prefix ge pronounced as se gehelpte geholpene Overgeneralisation+ ehelpte geholpene Overgeneralisation+Prefix ge without onset +sehelpte geholpene Overgeneralisation+prefix ge pronounced as se +gehelpd geholpen Wrong Overgeneralisation+ +ehelpd geholpen Wrong Overgeneralisation+Prefix ge without onset +helpd geholpen Wrong Overgeneralisation+Lacking ge prefix gehelpen geholpen Wrong -en suffix ehelpen geholpen Wrong -en suffix helpen geholpen Wrong -en suffix -geholpt geholpen Overgeneralisation +geholpt geholpen Wrong Overgeneralisation +geholpd geholpen Wrong Overgeneralisation eholpen geholpen Prefix ge without onset holpen geholpen Lacking ge prefix -geheet geheten Overgeneralisation -eheet geheten Overgeneralisation -heet geheten Overgeneralisation +geheet geheten Wrong Overgeneralisation +eheet geheten Overgeneralisation+Prefix ge without onset +heet geheten Overgeneralisation+Lacking ge prefix +seheet geheten Overgeneralisation+prefix ge pronounced as se gehete gehetene Overgeneralisation+ ehete gehetene Overgeneralisation+Prefix ge without onset +sehete gehetene Overgeneralisation+prefix ge pronounced as se +geheetd geheten Wrong Overgeneralisation +eheetd geheten Wrong Overgeneralisation+Prefix ge without onset +heetd geheten Wrong Overgeneralisation+Lacking ge prefix eheten geheten Prefix ge without onset heten geheten Lacking ge prefix hijste hees Overgeneralisation hijsten hesen Overgeneralisation heeste hees Irregular form plus regular suffix heesten hesen Irregular form plus regular suffix -gehijst gehesen Overgeneralisation -ehijst gehesen Overgeneralisation -hijst gehesen Overgeneralisation +gehijst gehesen Overgeneralisation+ +ehijst gehesen Overgeneralisation+Prefix ge without onset +hijst gehesen Overgeneralisation+Lacking ge prefix +sehijst gehesen Overgeneralisation+prefix ge pronounced as se gehijste gehesene Overgeneralisation+ ehijste gehesene Overgeneralisation+Prefix ge without onset +sehijste gehesene Overgeneralisation+prefix ge pronounced as se +gehijsd gehesen Wrong Overgeneralisation+ +ehijsd gehesen Wrong Overgeneralisation+Prefix ge without onset +hijsd gehesen Wrong Overgeneralisation+Lacking ge prefix gehijsen gehesen Wrong -en suffix ehijsen gehesen Wrong -en suffix hijsen gehesen Wrong -en suffix -geheest gehesen Overgeneralisation +geheest gehesen Wrong Overgeneralisation +geheesd gehesen Wrong Overgeneralisation ehesen gehesen Prefix ge without onset hesen gehesen Lacking ge prefix -gehoefd gehoeven Overgeneralisation +gehoefd gehoeven Wrong Overgeneralisation ehoefd gehoeven Overgeneralisation+Prefix ge without onset hoefd gehoeven Overgeneralisation+Lacking ge prefix +sehoefd gehoeven Overgeneralisation+prefix ge pronounced as se gehoefde gehoevene Overgeneralisation+ ehoefde gehoevene Overgeneralisation+Prefix ge without onset -gehoeft gehoeven Overgeneralisation -ehoeft gehoeven Overgeneralisation -hoeft gehoeven Overgeneralisation +sehoefde gehoevene Overgeneralisation+prefix ge pronounced as se +gehoeft gehoeven Wrong Overgeneralisation +ehoeft gehoeven Wrong Overgeneralisation+Prefix ge without onset +hoeft gehoeven Wrong Overgeneralisation+Lacking ge prefix gehoefen gehoeven Wrong -en suffix ehoefen gehoeven Wrong -en suffix hoefen gehoeven Wrong -en suffix @@ -720,33 +877,39 @@ houdde hield Overgeneralisation houdden hielden Overgeneralisation hieldde hield Irregular form plus regular suffix hieldden hielden Irregular form plus regular suffix -gehoud gehouden Overgeneralisation -ehoud gehouden Overgeneralisation -houd gehouden Overgeneralisation +gehoud gehouden Wrong Overgeneralisation +ehoud gehouden Wrong Overgeneralisation+Prefix ge without onset +houd gehouden Wrong Overgeneralisation+Lacking ge prefix +sehoud gehouden Overgeneralisation+prefix ge pronounced as se gehoude gehoudene Overgeneralisation+ ehoude gehoudene Overgeneralisation+Prefix ge without onset +sehoude gehoudene Overgeneralisation+prefix ge pronounced as se ehouden gehouden Prefix ge without onset houden gehouden Lacking ge prefix houwde hieuw Overgeneralisation houwden hieuwen Overgeneralisation hieuwde hieuw Irregular form plus regular suffix hieuwden hieuwen Irregular form plus regular suffix -gehouwd gehouwen Overgeneralisation +gehouwd gehouwen Wrong Overgeneralisation ehouwd gehouwen Overgeneralisation+Prefix ge without onset houwd gehouwen Overgeneralisation+Lacking ge prefix +sehouwd gehouwen Overgeneralisation+prefix ge pronounced as se gehouwde gehouwene Overgeneralisation+ ehouwde gehouwene Overgeneralisation+Prefix ge without onset -gehouwt gehouwen Overgeneralisation -ehouwt gehouwen Overgeneralisation -houwt gehouwen Overgeneralisation +sehouwde gehouwene Overgeneralisation+prefix ge pronounced as se +gehouwt gehouwen Wrong Overgeneralisation +ehouwt gehouwen Wrong Overgeneralisation+Prefix ge without onset +houwt gehouwen Wrong Overgeneralisation+Lacking ge prefix ehouwen gehouwen Prefix ge without onset houwen gehouwen Lacking ge prefix ejaagd gejaagd Prefix ge without onset jaagd gejaagd Lacking ge prefix +sejaagd gejaagd Overgeneralisation+prefix ge pronounced as se ejaagde gejaagde Overgeneralisation+Prefix ge without onset -gejaagt gejaagd Overgeneralisation -ejaagt gejaagd Overgeneralisation -jaagt gejaagd Overgeneralisation +sejaagde gejaagde Overgeneralisation+prefix ge pronounced as se +gejaagt gejaagd Wrong Overgeneralisation+ +ejaagt gejaagd Wrong Overgeneralisation+Prefix ge without onset +jaagt gejaagd Wrong Overgeneralisation+Lacking ge prefix gejagen gejaagd Wrong -en suffix ejagen gejaagd Wrong -en suffix jagen gejaagd Wrong -en suffix @@ -757,30 +920,38 @@ koosden kozen Irregular form plus regular suffix gekiesd gekozen Overgeneralisation+ ekiesd gekozen Overgeneralisation+Prefix ge without onset kiesd gekozen Overgeneralisation+Lacking ge prefix +sekiesd gekozen Overgeneralisation+prefix ge pronounced as se gekiesde gekozene Overgeneralisation+ ekiesde gekozene Overgeneralisation+Prefix ge without onset -gekiest gekozen Overgeneralisation -ekiest gekozen Overgeneralisation -kiest gekozen Overgeneralisation +sekiesde gekozene Overgeneralisation+prefix ge pronounced as se +gekiest gekozen Wrong Overgeneralisation+ +ekiest gekozen Wrong Overgeneralisation+Prefix ge without onset +kiest gekozen Wrong Overgeneralisation+Lacking ge prefix gekiesen gekozen Wrong -en suffix ekiesen gekozen Wrong -en suffix kiesen gekozen Wrong -en suffix -gekoost gekozen Overgeneralisation +gekoost gekozen Wrong Overgeneralisation ekozen gekozen Prefix ge without onset kozen gekozen Lacking ge prefix kijkte keek Overgeneralisation kijkten keken Overgeneralisation keekte keek Irregular form plus regular suffix keekten keken Irregular form plus regular suffix -gekijkt gekeken Overgeneralisation -ekijkt gekeken Overgeneralisation -kijkt gekeken Overgeneralisation +gekijkt gekeken Overgeneralisation+ +ekijkt gekeken Overgeneralisation+Prefix ge without onset +kijkt gekeken Overgeneralisation+Lacking ge prefix +sekijkt gekeken Overgeneralisation+prefix ge pronounced as se gekijkte gekekene Overgeneralisation+ ekijkte gekekene Overgeneralisation+Prefix ge without onset +sekijkte gekekene Overgeneralisation+prefix ge pronounced as se +gekijkd gekeken Wrong Overgeneralisation+ +ekijkd gekeken Wrong Overgeneralisation+Prefix ge without onset +kijkd gekeken Wrong Overgeneralisation+Lacking ge prefix gekijken gekeken Wrong -en suffix ekijken gekeken Wrong -en suffix kijken gekeken Wrong -en suffix -gekeekt gekeken Overgeneralisation +gekeekt gekeken Wrong Overgeneralisation +gekeekd gekeken Wrong Overgeneralisation ekeken gekeken Prefix ge without onset keken gekeken Lacking ge prefix klimde klom Overgeneralisation @@ -790,30 +961,38 @@ klomden klommen Irregular form plus regular suffix geklimd geklommen Overgeneralisation+ eklimd geklommen Overgeneralisation+Prefix ge without onset klimd geklommen Overgeneralisation+Lacking ge prefix +seklimd geklommen Overgeneralisation+prefix ge pronounced as se geklimde geklommene Overgeneralisation+ eklimde geklommene Overgeneralisation+Prefix ge without onset -geklimt geklommen Overgeneralisation -eklimt geklommen Overgeneralisation -klimt geklommen Overgeneralisation +seklimde geklommene Overgeneralisation+prefix ge pronounced as se +geklimt geklommen Wrong Overgeneralisation+ +eklimt geklommen Wrong Overgeneralisation+Prefix ge without onset +klimt geklommen Wrong Overgeneralisation+Lacking ge prefix geklimmen geklommen Wrong -en suffix eklimmen geklommen Wrong -en suffix klimmen geklommen Wrong -en suffix -geklomt geklommen Overgeneralisation +geklomt geklommen Wrong Overgeneralisation eklommen geklommen Prefix ge without onset klommen geklommen Lacking ge prefix klinkte klonk Overgeneralisation klinkten klonken Overgeneralisation klonkte klonk Irregular form plus regular suffix klonkten klonken Irregular form plus regular suffix -geklinkt geklonken Overgeneralisation -eklinkt geklonken Overgeneralisation -klinkt geklonken Overgeneralisation +geklinkt geklonken Overgeneralisation+ +eklinkt geklonken Overgeneralisation+Prefix ge without onset +klinkt geklonken Overgeneralisation+Lacking ge prefix +seklinkt geklonken Overgeneralisation+prefix ge pronounced as se geklinkte geklonkene Overgeneralisation+ eklinkte geklonkene Overgeneralisation+Prefix ge without onset +seklinkte geklonkene Overgeneralisation+prefix ge pronounced as se +geklinkd geklonken Wrong Overgeneralisation+ +eklinkd geklonken Wrong Overgeneralisation+Prefix ge without onset +klinkd geklonken Wrong Overgeneralisation+Lacking ge prefix geklinken geklonken Wrong -en suffix eklinken geklonken Wrong -en suffix klinken geklonken Wrong -en suffix -geklonkt geklonken Overgeneralisation +geklonkt geklonken Wrong Overgeneralisation +geklonkd geklonken Wrong Overgeneralisation eklonken geklonken Prefix ge without onset klonken geklonken Lacking ge prefix kluifde kloof Overgeneralisation @@ -823,41 +1002,67 @@ kloofden kloven Irregular form plus regular suffix gekluifd gekloven Overgeneralisation+ ekluifd gekloven Overgeneralisation+Prefix ge without onset kluifd gekloven Overgeneralisation+Lacking ge prefix +sekluifd gekloven Overgeneralisation+prefix ge pronounced as se gekluifde geklovene Overgeneralisation+ ekluifde geklovene Overgeneralisation+Prefix ge without onset -gekluift gekloven Overgeneralisation -ekluift gekloven Overgeneralisation -kluift gekloven Overgeneralisation +sekluifde geklovene Overgeneralisation+prefix ge pronounced as se +gekluift gekloven Wrong Overgeneralisation+ +ekluift gekloven Wrong Overgeneralisation+Prefix ge without onset +kluift gekloven Wrong Overgeneralisation+Lacking ge prefix gekluifen gekloven Wrong -en suffix ekluifen gekloven Wrong -en suffix kluifen gekloven Wrong -en suffix -geklooft gekloven Overgeneralisation +geklooft gekloven Wrong Overgeneralisation ekloven gekloven Prefix ge without onset kloven gekloven Lacking ge prefix knijpte kneep Overgeneralisation knijpten knepen Overgeneralisation kneepte kneep Irregular form plus regular suffix kneepten knepen Irregular form plus regular suffix -geknijpt geknepen Overgeneralisation -eknijpt geknepen Overgeneralisation -knijpt geknepen Overgeneralisation +geknijpt geknepen Overgeneralisation+ +eknijpt geknepen Overgeneralisation+Prefix ge without onset +knijpt geknepen Overgeneralisation+Lacking ge prefix +seknijpt geknepen Overgeneralisation+prefix ge pronounced as se geknijpte geknepene Overgeneralisation+ eknijpte geknepene Overgeneralisation+Prefix ge without onset +seknijpte geknepene Overgeneralisation+prefix ge pronounced as se +geknijpd geknepen Wrong Overgeneralisation+ +eknijpd geknepen Wrong Overgeneralisation+Prefix ge without onset +knijpd geknepen Wrong Overgeneralisation+Lacking ge prefix geknijpen geknepen Wrong -en suffix eknijpen geknepen Wrong -en suffix knijpen geknepen Wrong -en suffix -gekneept geknepen Overgeneralisation +gekneept geknepen Wrong Overgeneralisation +gekneepd geknepen Wrong Overgeneralisation eknepen geknepen Prefix ge without onset knepen geknepen Lacking ge prefix +koomte kwam Overgeneralisation +koomten kwamen Overgeneralisation +kwamte kwam Irregular form plus regular suffix +kwamten kwamen Irregular form plus regular suffix +gekoomt gekomen Wrong Overgeneralisation +ekoomt gekomen Wrong Overgeneralisation+Prefix ge without onset +koomt gekomen Wrong Overgeneralisation+Lacking ge prefix +sekoomt gekomen Overgeneralisation+prefix ge pronounced as se +gekoomte gekomene Overgeneralisation+ +ekoomte gekomene Overgeneralisation+Prefix ge without onset +sekoomte gekomene Overgeneralisation+prefix ge pronounced as se +ekomen gekomen Prefix ge without onset +komen gekomen Lacking ge prefix koopte kocht Overgeneralisation koopten kochten Overgeneralisation kochtte kocht Irregular form plus regular suffix kochtten kochten Irregular form plus regular suffix -gekoopt gekocht Overgeneralisation -ekoopt gekocht Overgeneralisation -koopt gekocht Overgeneralisation +gekoopt gekocht Overgeneralisation+ +ekoopt gekocht Overgeneralisation+Prefix ge without onset +koopt gekocht Overgeneralisation+Lacking ge prefix +sekoopt gekocht Overgeneralisation+prefix ge pronounced as se gekoopte gekochte Overgeneralisation+ ekoopte gekochte Overgeneralisation+Prefix ge without onset +sekoopte gekochte Overgeneralisation+prefix ge pronounced as se +gekoopd gekocht Wrong Overgeneralisation+ +ekoopd gekocht Wrong Overgeneralisation+Prefix ge without onset +koopd gekocht Wrong Overgeneralisation+Lacking ge prefix gekopen gekocht Wrong -en suffix ekopen gekocht Wrong -en suffix kopen gekocht Wrong -en suffix @@ -870,105 +1075,133 @@ kreegden kregen Irregular form plus regular suffix gekrijgd gekregen Overgeneralisation+ ekrijgd gekregen Overgeneralisation+Prefix ge without onset krijgd gekregen Overgeneralisation+Lacking ge prefix +sekrijgd gekregen Overgeneralisation+prefix ge pronounced as se gekrijgde gekregene Overgeneralisation+ ekrijgde gekregene Overgeneralisation+Prefix ge without onset -gekrijgt gekregen Overgeneralisation -ekrijgt gekregen Overgeneralisation -krijgt gekregen Overgeneralisation +sekrijgde gekregene Overgeneralisation+prefix ge pronounced as se +gekrijgt gekregen Wrong Overgeneralisation+ +ekrijgt gekregen Wrong Overgeneralisation+Prefix ge without onset +krijgt gekregen Wrong Overgeneralisation+Lacking ge prefix gekrijgen gekregen Wrong -en suffix ekrijgen gekregen Wrong -en suffix krijgen gekregen Wrong -en suffix -gekreegd gekregen Overgeneralisation -gekreegt gekregen Overgeneralisation +gekreegd gekregen Wrong Overgeneralisation +gekreegt gekregen Wrong Overgeneralisation ekregen gekregen Prefix ge without onset kregen gekregen Lacking ge prefix krimpte kromp Overgeneralisation krimpten krompen Overgeneralisation krompte kromp Irregular form plus regular suffix krompten krompen Irregular form plus regular suffix -gekrimpt gekrompen Overgeneralisation -ekrimpt gekrompen Overgeneralisation -krimpt gekrompen Overgeneralisation +gekrimpt gekrompen Overgeneralisation+ +ekrimpt gekrompen Overgeneralisation+Prefix ge without onset +krimpt gekrompen Overgeneralisation+Lacking ge prefix +sekrimpt gekrompen Overgeneralisation+prefix ge pronounced as se gekrimpte gekrompene Overgeneralisation+ ekrimpte gekrompene Overgeneralisation+Prefix ge without onset +sekrimpte gekrompene Overgeneralisation+prefix ge pronounced as se +gekrimpd gekrompen Wrong Overgeneralisation+ +ekrimpd gekrompen Wrong Overgeneralisation+Prefix ge without onset +krimpd gekrompen Wrong Overgeneralisation+Lacking ge prefix gekrimpen gekrompen Wrong -en suffix ekrimpen gekrompen Wrong -en suffix krimpen gekrompen Wrong -en suffix -gekrompt gekrompen Overgeneralisation +gekrompt gekrompen Wrong Overgeneralisation +gekrompd gekrompen Wrong Overgeneralisation ekrompen gekrompen Prefix ge without onset krompen gekrompen Lacking ge prefix kruipte kroop Overgeneralisation kruipten kropen Overgeneralisation kroopte kroop Irregular form plus regular suffix kroopten kropen Irregular form plus regular suffix -gekruipt gekropen Overgeneralisation -ekruipt gekropen Overgeneralisation -kruipt gekropen Overgeneralisation +gekruipt gekropen Overgeneralisation+ +ekruipt gekropen Overgeneralisation+Prefix ge without onset +kruipt gekropen Overgeneralisation+Lacking ge prefix +sekruipt gekropen Overgeneralisation+prefix ge pronounced as se gekruipte gekropene Overgeneralisation+ ekruipte gekropene Overgeneralisation+Prefix ge without onset +sekruipte gekropene Overgeneralisation+prefix ge pronounced as se +gekruipd gekropen Wrong Overgeneralisation+ +ekruipd gekropen Wrong Overgeneralisation+Prefix ge without onset +kruipd gekropen Wrong Overgeneralisation+Lacking ge prefix gekruipen gekropen Wrong -en suffix ekruipen gekropen Wrong -en suffix kruipen gekropen Wrong -en suffix -gekroopt gekropen Overgeneralisation +gekroopt gekropen Wrong Overgeneralisation +gekroopd gekropen Wrong Overgeneralisation ekropen gekropen Prefix ge without onset kropen gekropen Lacking ge prefix kwijtte kweet Overgeneralisation kwijtten kweten Overgeneralisation kweette kweet Irregular form plus regular suffix kweetten kweten Irregular form plus regular suffix -gekwijt gekweten Overgeneralisation -ekwijt gekweten Overgeneralisation -kwijt gekweten Overgeneralisation +gekwijt gekweten Overgeneralisation+ +ekwijt gekweten Overgeneralisation+Prefix ge without onset +kwijt gekweten Overgeneralisation+Lacking ge prefix +sekwijt gekweten Overgeneralisation+prefix ge pronounced as se gekwijte gekwetene Overgeneralisation+ ekwijte gekwetene Overgeneralisation+Prefix ge without onset +sekwijte gekwetene Overgeneralisation+prefix ge pronounced as se +gekwijtd gekweten Wrong Overgeneralisation+ +ekwijtd gekweten Wrong Overgeneralisation+Prefix ge without onset +kwijtd gekweten Wrong Overgeneralisation+Lacking ge prefix gekwijten gekweten Wrong -en suffix ekwijten gekweten Wrong -en suffix kwijten gekweten Wrong -en suffix -gekweet gekweten Overgeneralisation +gekweet gekweten Wrong Overgeneralisation +gekweetd gekweten Wrong Overgeneralisation ekweten gekweten Prefix ge without onset kweten gekweten Lacking ge prefix lachde lachte Overgeneralisation lachden lachten Overgeneralisation -gelachd gelachen Overgeneralisation -elachd gelachen Overgeneralisation+Prefix ge without onset -lachd gelachen Overgeneralisation+Lacking ge prefix +gelachd gelachen Wrong Overgeneralisation +elachd gelachen Wrong Overgeneralisation+Prefix ge without onset +lachd gelachen Wrong Overgeneralisation+Lacking ge prefix +selachd gelachen Overgeneralisation+prefix ge pronounced as se gelachde gelachene Overgeneralisation+ elachde gelachene Overgeneralisation+Prefix ge without onset -gelacht gelachen Overgeneralisation -elacht gelachen Overgeneralisation -lacht gelachen Overgeneralisation +selachde gelachene Overgeneralisation+prefix ge pronounced as se elachen gelachen Prefix ge without onset lachen gelachen Lacking ge prefix -gelaad geladen Overgeneralisation -elaad geladen Overgeneralisation -laad geladen Overgeneralisation +gelaad geladen Wrong Overgeneralisation +elaad geladen Wrong Overgeneralisation+Prefix ge without onset +laad geladen Wrong Overgeneralisation+Lacking ge prefix +selaad geladen Overgeneralisation+prefix ge pronounced as se gelade geladene Overgeneralisation+ elade geladene Overgeneralisation+Prefix ge without onset +selade geladene Overgeneralisation+prefix ge pronounced as se eladen geladen Prefix ge without onset laden geladen Lacking ge prefix laatte liet Overgeneralisation laatten lieten Overgeneralisation liette liet Irregular form plus regular suffix lietten lieten Irregular form plus regular suffix -gelaat gelaten Overgeneralisation -elaat gelaten Overgeneralisation -laat gelaten Overgeneralisation +gelaat gelaten Wrong Overgeneralisation +elaat gelaten Overgeneralisation+Prefix ge without onset +laat gelaten Overgeneralisation+Lacking ge prefix +selaat gelaten Overgeneralisation+prefix ge pronounced as se gelate gelatene Overgeneralisation+ elate gelatene Overgeneralisation+Prefix ge without onset +selate gelatene Overgeneralisation+prefix ge pronounced as se +gelaatd gelaten Wrong Overgeneralisation +elaatd gelaten Wrong Overgeneralisation+Prefix ge without onset +laatd gelaten Wrong Overgeneralisation+Lacking ge prefix elaten gelaten Prefix ge without onset laten gelaten Lacking ge prefix leesde las Overgeneralisation leesden lazen Overgeneralisation lasde las Irregular form plus regular suffix lasden lazen Irregular form plus regular suffix -geleesd gelezen Overgeneralisation +geleesd gelezen Wrong Overgeneralisation eleesd gelezen Overgeneralisation+Prefix ge without onset leesd gelezen Overgeneralisation+Lacking ge prefix +seleesd gelezen Overgeneralisation+prefix ge pronounced as se geleesde gelezene Overgeneralisation+ eleesde gelezene Overgeneralisation+Prefix ge without onset -geleest gelezen Overgeneralisation -eleest gelezen Overgeneralisation -leest gelezen Overgeneralisation +seleesde gelezene Overgeneralisation+prefix ge pronounced as se +geleest gelezen Wrong Overgeneralisation +eleest gelezen Wrong Overgeneralisation+Prefix ge without onset +leest gelezen Wrong Overgeneralisation+Lacking ge prefix gelesen gelezen Wrong -en suffix elesen gelezen Wrong -en suffix lesen gelezen Wrong -en suffix @@ -981,15 +1214,17 @@ loogden logen Irregular form plus regular suffix geliegd gelogen Overgeneralisation+ eliegd gelogen Overgeneralisation+Prefix ge without onset liegd gelogen Overgeneralisation+Lacking ge prefix +seliegd gelogen Overgeneralisation+prefix ge pronounced as se geliegde gelogene Overgeneralisation+ eliegde gelogene Overgeneralisation+Prefix ge without onset -geliegt gelogen Overgeneralisation -eliegt gelogen Overgeneralisation -liegt gelogen Overgeneralisation +seliegde gelogene Overgeneralisation+prefix ge pronounced as se +geliegt gelogen Wrong Overgeneralisation+ +eliegt gelogen Wrong Overgeneralisation+Prefix ge without onset +liegt gelogen Wrong Overgeneralisation+Lacking ge prefix geliegen gelogen Wrong -en suffix eliegen gelogen Wrong -en suffix liegen gelogen Wrong -en suffix -geloogt gelogen Overgeneralisation +geloogt gelogen Wrong Overgeneralisation elogen gelogen Prefix ge without onset logen gelogen Lacking ge prefix ligde lag Overgeneralisation @@ -999,72 +1234,94 @@ lagden lagen Irregular form plus regular suffix geligd gelegen Overgeneralisation+ eligd gelegen Overgeneralisation+Prefix ge without onset ligd gelegen Overgeneralisation+Lacking ge prefix +seligd gelegen Overgeneralisation+prefix ge pronounced as se geligde gelegene Overgeneralisation+ eligde gelegene Overgeneralisation+Prefix ge without onset -geligt gelegen Overgeneralisation -eligt gelegen Overgeneralisation -ligt gelegen Overgeneralisation +seligde gelegene Overgeneralisation+prefix ge pronounced as se +geligt gelegen Wrong Overgeneralisation+ +eligt gelegen Wrong Overgeneralisation+Prefix ge without onset +ligt gelegen Wrong Overgeneralisation+Lacking ge prefix geliggen gelegen Wrong -en suffix eliggen gelegen Wrong -en suffix liggen gelegen Wrong -en suffix -geleegd gelegen Overgeneralisation -geleegt gelegen Overgeneralisation +geleegd gelegen Wrong Overgeneralisation +geleegt gelegen Wrong Overgeneralisation elegen gelegen Prefix ge without onset legen gelegen Lacking ge prefix lijdde leed Overgeneralisation lijdden leden Overgeneralisation leedde leed Irregular form plus regular suffix leedden leden Irregular form plus regular suffix -gelijd geleden Overgeneralisation -elijd geleden Overgeneralisation -lijd geleden Overgeneralisation +gelijd geleden Wrong Overgeneralisation+ +elijd geleden Wrong Overgeneralisation+Prefix ge without onset +lijd geleden Wrong Overgeneralisation+Lacking ge prefix +selijd geleden Overgeneralisation+prefix ge pronounced as se gelijde geledene Overgeneralisation+ elijde geledene Overgeneralisation+Prefix ge without onset +selijde geledene Overgeneralisation+prefix ge pronounced as se gelijden geleden Wrong -en suffix elijden geleden Wrong -en suffix lijden geleden Wrong -en suffix -geleed geleden Overgeneralisation +geleed geleden Wrong Overgeneralisation eleden geleden Prefix ge without onset leden geleden Lacking ge prefix lijkte leek Overgeneralisation lijkten leken Overgeneralisation leekte leek Irregular form plus regular suffix leekten leken Irregular form plus regular suffix -gelijkt geleken Overgeneralisation -elijkt geleken Overgeneralisation -lijkt geleken Overgeneralisation +gelijkt geleken Overgeneralisation+ +elijkt geleken Overgeneralisation+Prefix ge without onset +lijkt geleken Overgeneralisation+Lacking ge prefix +selijkt geleken Overgeneralisation+prefix ge pronounced as se gelijkte gelekene Overgeneralisation+ elijkte gelekene Overgeneralisation+Prefix ge without onset +selijkte gelekene Overgeneralisation+prefix ge pronounced as se +gelijkd geleken Wrong Overgeneralisation+ +elijkd geleken Wrong Overgeneralisation+Prefix ge without onset +lijkd geleken Wrong Overgeneralisation+Lacking ge prefix gelijken geleken Wrong -en suffix elijken geleken Wrong -en suffix lijken geleken Wrong -en suffix -geleekt geleken Overgeneralisation +geleekt geleken Wrong Overgeneralisation +geleekd geleken Wrong Overgeneralisation eleken geleken Prefix ge without onset leken geleken Lacking ge prefix loopte liep Overgeneralisation loopten liepen Overgeneralisation liepte liep Irregular form plus regular suffix liepten liepen Irregular form plus regular suffix -geloopt gelopen Overgeneralisation -eloopt gelopen Overgeneralisation -loopt gelopen Overgeneralisation +geloopt gelopen Wrong Overgeneralisation +eloopt gelopen Overgeneralisation+Prefix ge without onset +loopt gelopen Overgeneralisation+Lacking ge prefix +seloopt gelopen Overgeneralisation+prefix ge pronounced as se geloopte gelopene Overgeneralisation+ eloopte gelopene Overgeneralisation+Prefix ge without onset +seloopte gelopene Overgeneralisation+prefix ge pronounced as se +geloopd gelopen Wrong Overgeneralisation +eloopd gelopen Wrong Overgeneralisation+Prefix ge without onset +loopd gelopen Wrong Overgeneralisation+Lacking ge prefix elopen gelopen Prefix ge without onset lopen gelopen Lacking ge prefix -gemaald gemalen Overgeneralisation +gemaald gemalen Wrong Overgeneralisation emaald gemalen Overgeneralisation+Prefix ge without onset maald gemalen Overgeneralisation+Lacking ge prefix +semaald gemalen Overgeneralisation+prefix ge pronounced as se gemaalde gemalene Overgeneralisation+ emaalde gemalene Overgeneralisation+Prefix ge without onset -gemaalt gemalen Overgeneralisation -emaalt gemalen Overgeneralisation -maalt gemalen Overgeneralisation +semaalde gemalene Overgeneralisation+prefix ge pronounced as se +gemaalt gemalen Wrong Overgeneralisation +emaalt gemalen Wrong Overgeneralisation+Prefix ge without onset +maalt gemalen Wrong Overgeneralisation+Lacking ge prefix emalen gemalen Prefix ge without onset malen gemalen Lacking ge prefix emelkt gemelkt Prefix ge without onset melkt gemelkt Lacking ge prefix +semelkt gemelkt Overgeneralisation+prefix ge pronounced as se emelkte gemelkte Overgeneralisation+Prefix ge without onset +semelkte gemelkte Overgeneralisation+prefix ge pronounced as se +gemelkd gemelkt Wrong Overgeneralisation+ +emelkd gemelkt Wrong Overgeneralisation+Prefix ge without onset +melkd gemelkt Wrong Overgeneralisation+Lacking ge prefix gemelken gemelkt Wrong -en suffix emelken gemelkt Wrong -en suffix melken gemelkt Wrong -en suffix @@ -1072,37 +1329,49 @@ meette mat Overgeneralisation meetten maten Overgeneralisation matte mat Irregular form plus regular suffix matten maten Irregular form plus regular suffix -gemeet gemeten Overgeneralisation -emeet gemeten Overgeneralisation -meet gemeten Overgeneralisation +gemeet gemeten Wrong Overgeneralisation +emeet gemeten Overgeneralisation+Prefix ge without onset +meet gemeten Overgeneralisation+Lacking ge prefix +semeet gemeten Overgeneralisation+prefix ge pronounced as se gemete gemetene Overgeneralisation+ emete gemetene Overgeneralisation+Prefix ge without onset +semete gemetene Overgeneralisation+prefix ge pronounced as se +gemeetd gemeten Wrong Overgeneralisation +emeetd gemeten Wrong Overgeneralisation+Prefix ge without onset +meetd gemeten Wrong Overgeneralisation+Lacking ge prefix emeten gemeten Prefix ge without onset meten gemeten Lacking ge prefix mijdde meed Overgeneralisation mijdden meden Overgeneralisation meedde meed Irregular form plus regular suffix meedden meden Irregular form plus regular suffix -gemijd gemeden Overgeneralisation -emijd gemeden Overgeneralisation -mijd gemeden Overgeneralisation +gemijd gemeden Wrong Overgeneralisation+ +emijd gemeden Wrong Overgeneralisation+Prefix ge without onset +mijd gemeden Wrong Overgeneralisation+Lacking ge prefix +semijd gemeden Overgeneralisation+prefix ge pronounced as se gemijde gemedene Overgeneralisation+ emijde gemedene Overgeneralisation+Prefix ge without onset +semijde gemedene Overgeneralisation+prefix ge pronounced as se gemijden gemeden Wrong -en suffix emijden gemeden Wrong -en suffix mijden gemeden Wrong -en suffix -gemeed gemeden Overgeneralisation +gemeed gemeden Wrong Overgeneralisation emeden gemeden Prefix ge without onset meden gemeden Lacking ge prefix moette moest Overgeneralisation moetten moesten Overgeneralisation moestte moest Irregular form plus regular suffix moestten moesten Irregular form plus regular suffix -gemoet gemoeten Overgeneralisation -emoet gemoeten Overgeneralisation -moet gemoeten Overgeneralisation +gemoet gemoeten Wrong Overgeneralisation +emoet gemoeten Overgeneralisation+Prefix ge without onset +moet gemoeten Overgeneralisation+Lacking ge prefix +semoet gemoeten Overgeneralisation+prefix ge pronounced as se gemoete gemoetene Overgeneralisation+ emoete gemoetene Overgeneralisation+Prefix ge without onset +semoete gemoetene Overgeneralisation+prefix ge pronounced as se +gemoetd gemoeten Wrong Overgeneralisation +emoetd gemoeten Wrong Overgeneralisation+Prefix ge without onset +moetd gemoeten Wrong Overgeneralisation+Lacking ge prefix emoeten gemoeten Prefix ge without onset moeten gemoeten Lacking ge prefix neemde nam Overgeneralisation @@ -1112,15 +1381,17 @@ namden namen Irregular form plus regular suffix geneemd genomen Overgeneralisation+ eneemd genomen Overgeneralisation+Prefix ge without onset neemd genomen Overgeneralisation+Lacking ge prefix +seneemd genomen Overgeneralisation+prefix ge pronounced as se geneemde genomene Overgeneralisation+ eneemde genomene Overgeneralisation+Prefix ge without onset -geneemt genomen Overgeneralisation -eneemt genomen Overgeneralisation -neemt genomen Overgeneralisation +seneemde genomene Overgeneralisation+prefix ge pronounced as se +geneemt genomen Wrong Overgeneralisation+ +eneemt genomen Wrong Overgeneralisation+Prefix ge without onset +neemt genomen Wrong Overgeneralisation+Lacking ge prefix genemen genomen Wrong -en suffix enemen genomen Wrong -en suffix nemen genomen Wrong -en suffix -genoomt genomen Overgeneralisation +genoomt genomen Wrong Overgeneralisation enomen genomen Prefix ge without onset nomen genomen Lacking ge prefix nijgde neeg Overgeneralisation @@ -1130,16 +1401,18 @@ neegden negen Irregular form plus regular suffix genijgd genegen Overgeneralisation+ enijgd genegen Overgeneralisation+Prefix ge without onset nijgd genegen Overgeneralisation+Lacking ge prefix +senijgd genegen Overgeneralisation+prefix ge pronounced as se genijgde genegene Overgeneralisation+ enijgde genegene Overgeneralisation+Prefix ge without onset -genijgt genegen Overgeneralisation -enijgt genegen Overgeneralisation -nijgt genegen Overgeneralisation +senijgde genegene Overgeneralisation+prefix ge pronounced as se +genijgt genegen Wrong Overgeneralisation+ +enijgt genegen Wrong Overgeneralisation+Prefix ge without onset +nijgt genegen Wrong Overgeneralisation+Lacking ge prefix genijgen genegen Wrong -en suffix enijgen genegen Wrong -en suffix nijgen genegen Wrong -en suffix -geneegd genegen Overgeneralisation -geneegt genegen Overgeneralisation +geneegd genegen Wrong Overgeneralisation +geneegt genegen Wrong Overgeneralisation enegen genegen Prefix ge without onset negen genegen Lacking ge prefix ontginde ontgonnene Overgeneralisation @@ -1147,16 +1420,18 @@ ontginden ontgonnen Overgeneralisation ontgonde ontgon Irregular form plus regular suffix ontgonden ontgonnen Irregular form plus regular suffix ontgind ontgonnen Overgeneralisation -ontgint ontgonnen Overgeneralisation +ontgint ontgonnen Wrong Overgeneralisation ontginnen ontgonnen Wrong -en suffix -ontgont ontgonnen Overgeneralisation +ontgont ontgonnen Wrong Overgeneralisation ontluikte ontlokene Overgeneralisation ontluikten ontloken Overgeneralisation ontlookte ontlook Irregular form plus regular suffix ontlookten ontloken Irregular form plus regular suffix ontluikt ontloken Overgeneralisation +ontluikd ontloken Wrong Overgeneralisation ontluiken ontloken Wrong -en suffix -ontlookt ontloken Overgeneralisation +ontlookt ontloken Wrong Overgeneralisation +ontlookd ontloken Wrong Overgeneralisation pluisde ploos Overgeneralisation pluisden plozen Overgeneralisation ploosde ploos Irregular form plus regular suffix @@ -1164,15 +1439,17 @@ ploosden plozen Irregular form plus regular suffix gepluisd geplozen Overgeneralisation+ epluisd geplozen Overgeneralisation+Prefix ge without onset pluisd geplozen Overgeneralisation+Lacking ge prefix +sepluisd geplozen Overgeneralisation+prefix ge pronounced as se gepluisde geplozene Overgeneralisation+ epluisde geplozene Overgeneralisation+Prefix ge without onset -gepluist geplozen Overgeneralisation -epluist geplozen Overgeneralisation -pluist geplozen Overgeneralisation +sepluisde geplozene Overgeneralisation+prefix ge pronounced as se +gepluist geplozen Wrong Overgeneralisation+ +epluist geplozen Wrong Overgeneralisation+Prefix ge without onset +pluist geplozen Wrong Overgeneralisation+Lacking ge prefix gepluisen geplozen Wrong -en suffix epluisen geplozen Wrong -en suffix pluisen geplozen Wrong -en suffix -geploost geplozen Overgeneralisation +geploost geplozen Wrong Overgeneralisation eplozen geplozen Prefix ge without onset plozen geplozen Lacking ge prefix prijsde prees Overgeneralisation @@ -1182,40 +1459,46 @@ preesden prezen Irregular form plus regular suffix geprijsd geprezen Overgeneralisation+ eprijsd geprezen Overgeneralisation+Prefix ge without onset prijsd geprezen Overgeneralisation+Lacking ge prefix +seprijsd geprezen Overgeneralisation+prefix ge pronounced as se geprijsde geprezene Overgeneralisation+ eprijsde geprezene Overgeneralisation+Prefix ge without onset -geprijst geprezen Overgeneralisation -eprijst geprezen Overgeneralisation -prijst geprezen Overgeneralisation +seprijsde geprezene Overgeneralisation+prefix ge pronounced as se +geprijst geprezen Wrong Overgeneralisation+ +eprijst geprezen Wrong Overgeneralisation+Prefix ge without onset +prijst geprezen Wrong Overgeneralisation+Lacking ge prefix geprijsen geprezen Wrong -en suffix eprijsen geprezen Wrong -en suffix prijsen geprezen Wrong -en suffix -gepreesd geprezen Overgeneralisation -gepreest geprezen Overgeneralisation +gepreesd geprezen Wrong Overgeneralisation +gepreest geprezen Wrong Overgeneralisation eprezen geprezen Prefix ge without onset prezen geprezen Lacking ge prefix -geraad geraden Overgeneralisation -eraad geraden Overgeneralisation -raad geraden Overgeneralisation +geraad geraden Wrong Overgeneralisation +eraad geraden Wrong Overgeneralisation+Prefix ge without onset +raad geraden Wrong Overgeneralisation+Lacking ge prefix +seraad geraden Overgeneralisation+prefix ge pronounced as se gerade geradene Overgeneralisation+ erade geradene Overgeneralisation+Prefix ge without onset +serade geradene Overgeneralisation+prefix ge pronounced as se eraden geraden Prefix ge without onset raden geraden Lacking ge prefix -verraad verraden Overgeneralisation +verraad verraden Wrong Overgeneralisation verrade verradene Overgeneralisation rijdde reed Overgeneralisation rijdden reden Overgeneralisation reedde reed Irregular form plus regular suffix reedden reden Irregular form plus regular suffix -gerijd gereden Overgeneralisation -erijd gereden Overgeneralisation -rijd gereden Overgeneralisation +gerijd gereden Wrong Overgeneralisation+ +erijd gereden Wrong Overgeneralisation+Prefix ge without onset +rijd gereden Wrong Overgeneralisation+Lacking ge prefix +serijd gereden Overgeneralisation+prefix ge pronounced as se gerijde geredene Overgeneralisation+ erijde geredene Overgeneralisation+Prefix ge without onset +serijde geredene Overgeneralisation+prefix ge pronounced as se gerijden gereden Wrong -en suffix erijden gereden Wrong -en suffix rijden gereden Wrong -en suffix -gereed gereden Overgeneralisation +gereed gereden Wrong Overgeneralisation ereden gereden Prefix ge without onset reden gereden Lacking ge prefix rijgde reeg Overgeneralisation @@ -1225,31 +1508,39 @@ reegden regen Irregular form plus regular suffix gerijgd geregen Overgeneralisation+ erijgd geregen Overgeneralisation+Prefix ge without onset rijgd geregen Overgeneralisation+Lacking ge prefix +serijgd geregen Overgeneralisation+prefix ge pronounced as se gerijgde geregene Overgeneralisation+ erijgde geregene Overgeneralisation+Prefix ge without onset -gerijgt geregen Overgeneralisation -erijgt geregen Overgeneralisation -rijgt geregen Overgeneralisation +serijgde geregene Overgeneralisation+prefix ge pronounced as se +gerijgt geregen Wrong Overgeneralisation+ +erijgt geregen Wrong Overgeneralisation+Prefix ge without onset +rijgt geregen Wrong Overgeneralisation+Lacking ge prefix gerijgen geregen Wrong -en suffix erijgen geregen Wrong -en suffix rijgen geregen Wrong -en suffix -gereegd geregen Overgeneralisation -gereegt geregen Overgeneralisation +gereegd geregen Wrong Overgeneralisation +gereegt geregen Wrong Overgeneralisation eregen geregen Prefix ge without onset regen geregen Lacking ge prefix rijtte reet Overgeneralisation rijtten reten Overgeneralisation reette reet Irregular form plus regular suffix reetten reten Irregular form plus regular suffix -gerijt gereten Overgeneralisation -erijt gereten Overgeneralisation -rijt gereten Overgeneralisation +gerijt gereten Overgeneralisation+ +erijt gereten Overgeneralisation+Prefix ge without onset +rijt gereten Overgeneralisation+Lacking ge prefix +serijt gereten Overgeneralisation+prefix ge pronounced as se gerijte geretene Overgeneralisation+ erijte geretene Overgeneralisation+Prefix ge without onset +serijte geretene Overgeneralisation+prefix ge pronounced as se +gerijtd gereten Wrong Overgeneralisation+ +erijtd gereten Wrong Overgeneralisation+Prefix ge without onset +rijtd gereten Wrong Overgeneralisation+Lacking ge prefix gerijten gereten Wrong -en suffix erijten gereten Wrong -en suffix rijten gereten Wrong -en suffix -gereet gereten Overgeneralisation +gereet gereten Wrong Overgeneralisation +gereetd gereten Wrong Overgeneralisation ereten gereten Prefix ge without onset reten gereten Lacking ge prefix rijsde rees Overgeneralisation @@ -1259,136 +1550,175 @@ reesden rezen Irregular form plus regular suffix gerijsd Gerezen Overgeneralisation+ erijsd Gerezen Overgeneralisation+Prefix ge without onset rijsd Gerezen Overgeneralisation+Lacking ge prefix +serijsd Gerezen Overgeneralisation+prefix ge pronounced as se gerijsde Gerezene Overgeneralisation+ erijsde Gerezene Overgeneralisation+Prefix ge without onset -gerijst Gerezen Overgeneralisation -erijst Gerezen Overgeneralisation -rijst Gerezen Overgeneralisation +serijsde Gerezene Overgeneralisation+prefix ge pronounced as se +gerijst Gerezen Wrong Overgeneralisation+ +erijst Gerezen Wrong Overgeneralisation+Prefix ge without onset +rijst Gerezen Wrong Overgeneralisation+Lacking ge prefix gerijsen Gerezen Wrong -en suffix erijsen Gerezen Wrong -en suffix rijsen Gerezen Wrong -en suffix -geGereesd Gerezen Overgeneralisation -geGereest Gerezen Overgeneralisation +geGereesd Gerezen Wrong Overgeneralisation+ +geGereest Gerezen Wrong Overgeneralisation+ roepte riep Overgeneralisation roepten riepen Overgeneralisation riepte riep Irregular form plus regular suffix riepten riepen Irregular form plus regular suffix -geroept geroepen Overgeneralisation -eroept geroepen Overgeneralisation -roept geroepen Overgeneralisation +geroept geroepen Wrong Overgeneralisation +eroept geroepen Overgeneralisation+Prefix ge without onset +roept geroepen Overgeneralisation+Lacking ge prefix +seroept geroepen Overgeneralisation+prefix ge pronounced as se geroepte geroepene Overgeneralisation+ eroepte geroepene Overgeneralisation+Prefix ge without onset +seroepte geroepene Overgeneralisation+prefix ge pronounced as se +geroepd geroepen Wrong Overgeneralisation +eroepd geroepen Wrong Overgeneralisation+Prefix ge without onset +roepd geroepen Wrong Overgeneralisation+Lacking ge prefix eroepen geroepen Prefix ge without onset roepen geroepen Lacking ge prefix ruikte rook Overgeneralisation ruikten roken Overgeneralisation rookte rook Irregular form plus regular suffix rookten roken Irregular form plus regular suffix -geruikt geroken Overgeneralisation -eruikt geroken Overgeneralisation -ruikt geroken Overgeneralisation +geruikt geroken Overgeneralisation+ +eruikt geroken Overgeneralisation+Prefix ge without onset +ruikt geroken Overgeneralisation+Lacking ge prefix +seruikt geroken Overgeneralisation+prefix ge pronounced as se geruikte gerokene Overgeneralisation+ eruikte gerokene Overgeneralisation+Prefix ge without onset +seruikte gerokene Overgeneralisation+prefix ge pronounced as se +geruikd geroken Wrong Overgeneralisation+ +eruikd geroken Wrong Overgeneralisation+Prefix ge without onset +ruikd geroken Wrong Overgeneralisation+Lacking ge prefix geruiken geroken Wrong -en suffix eruiken geroken Wrong -en suffix ruiken geroken Wrong -en suffix -gerookt geroken Overgeneralisation +gerookt geroken Wrong Overgeneralisation +gerookd geroken Wrong Overgeneralisation eroken geroken Prefix ge without onset roken geroken Lacking ge prefix -gescheid gescheiden Overgeneralisation -escheid gescheiden Overgeneralisation -scheid gescheiden Overgeneralisation +gescheid gescheiden Wrong Overgeneralisation +escheid gescheiden Wrong Overgeneralisation+Prefix ge without onset +scheid gescheiden Wrong Overgeneralisation+Lacking ge prefix +sescheid gescheiden Overgeneralisation+prefix ge pronounced as se gescheide gescheidene Overgeneralisation+ escheide gescheidene Overgeneralisation+Prefix ge without onset +sescheide gescheidene Overgeneralisation+prefix ge pronounced as se escheiden gescheiden Prefix ge without onset scheiden gescheiden Lacking ge prefix scheldde schold Overgeneralisation scheldden scholden Overgeneralisation scholdde schold Irregular form plus regular suffix scholdden scholden Irregular form plus regular suffix -gescheld gescholden Overgeneralisation -escheld gescholden Overgeneralisation -scheld gescholden Overgeneralisation +gescheld gescholden Wrong Overgeneralisation+ +escheld gescholden Wrong Overgeneralisation+Prefix ge without onset +scheld gescholden Wrong Overgeneralisation+Lacking ge prefix +sescheld gescholden Overgeneralisation+prefix ge pronounced as se geschelde gescholdene Overgeneralisation+ eschelde gescholdene Overgeneralisation+Prefix ge without onset +seschelde gescholdene Overgeneralisation+prefix ge pronounced as se geschelden gescholden Wrong -en suffix eschelden gescholden Wrong -en suffix schelden gescholden Wrong -en suffix -geschold gescholden Overgeneralisation +geschold gescholden Wrong Overgeneralisation escholden gescholden Prefix ge without onset scholden gescholden Lacking ge prefix schendde schond Overgeneralisation schendden schonden Overgeneralisation schondde schond Irregular form plus regular suffix schondden schonden Irregular form plus regular suffix -geschend geschonden Overgeneralisation -eschend geschonden Overgeneralisation -schend geschonden Overgeneralisation +geschend geschonden Wrong Overgeneralisation+ +eschend geschonden Wrong Overgeneralisation+Prefix ge without onset +schend geschonden Wrong Overgeneralisation+Lacking ge prefix +seschend geschonden Overgeneralisation+prefix ge pronounced as se geschende geschondene Overgeneralisation+ eschende geschondene Overgeneralisation+Prefix ge without onset +seschende geschondene Overgeneralisation+prefix ge pronounced as se geschenden geschonden Wrong -en suffix eschenden geschonden Wrong -en suffix schenden geschonden Wrong -en suffix -geschond geschonden Overgeneralisation +geschond geschonden Wrong Overgeneralisation eschonden geschonden Prefix ge without onset schonden geschonden Lacking ge prefix schenkte schonk Overgeneralisation schenkten schonken Overgeneralisation schonkte schonk Irregular form plus regular suffix schonkten schonken Irregular form plus regular suffix -geschenkt geschonken Overgeneralisation -eschenkt geschonken Overgeneralisation -schenkt geschonken Overgeneralisation +geschenkt geschonken Overgeneralisation+ +eschenkt geschonken Overgeneralisation+Prefix ge without onset +schenkt geschonken Overgeneralisation+Lacking ge prefix +seschenkt geschonken Overgeneralisation+prefix ge pronounced as se geschenkte geschonkene Overgeneralisation+ eschenkte geschonkene Overgeneralisation+Prefix ge without onset +seschenkte geschonkene Overgeneralisation+prefix ge pronounced as se +geschenkd geschonken Wrong Overgeneralisation+ +eschenkd geschonken Wrong Overgeneralisation+Prefix ge without onset +schenkd geschonken Wrong Overgeneralisation+Lacking ge prefix geschenken geschonken Wrong -en suffix eschenken geschonken Wrong -en suffix schenken geschonken Wrong -en suffix -geschonkt geschonken Overgeneralisation +geschonkt geschonken Wrong Overgeneralisation +geschonkd geschonken Wrong Overgeneralisation eschonken geschonken Prefix ge without onset schonken geschonken Lacking ge prefix schepte shiep Overgeneralisation schepten schiepen Overgeneralisation shiepte shiep Irregular form plus regular suffix shiepten schiepen Irregular form plus regular suffix -geschept geschapen Overgeneralisation -eschept geschapen Overgeneralisation -schept geschapen Overgeneralisation +geschept geschapen Overgeneralisation+ +eschept geschapen Overgeneralisation+Prefix ge without onset +schept geschapen Overgeneralisation+Lacking ge prefix +seschept geschapen Overgeneralisation+prefix ge pronounced as se geschepte geschapene Overgeneralisation+ eschepte geschapene Overgeneralisation+Prefix ge without onset +seschepte geschapene Overgeneralisation+prefix ge pronounced as se +geschepd geschapen Wrong Overgeneralisation+ +eschepd geschapen Wrong Overgeneralisation+Prefix ge without onset +schepd geschapen Wrong Overgeneralisation+Lacking ge prefix gescheppen geschapen Wrong -en suffix escheppen geschapen Wrong -en suffix scheppen geschapen Wrong -en suffix -geschaapt geschapen Overgeneralisation +geschaapt geschapen Wrong Overgeneralisation +geschaapd geschapen Wrong Overgeneralisation eschapen geschapen Prefix ge without onset schapen geschapen Lacking ge prefix gescheerd geschoren Overgeneralisation+ escheerd geschoren Overgeneralisation+Prefix ge without onset scheerd geschoren Overgeneralisation+Lacking ge prefix +sescheerd geschoren Overgeneralisation+prefix ge pronounced as se gescheerde geschorene Overgeneralisation+ escheerde geschorene Overgeneralisation+Prefix ge without onset -gescheert geschoren Overgeneralisation -escheert geschoren Overgeneralisation -scheert geschoren Overgeneralisation +sescheerde geschorene Overgeneralisation+prefix ge pronounced as se +gescheert geschoren Wrong Overgeneralisation+ +escheert geschoren Wrong Overgeneralisation+Prefix ge without onset +scheert geschoren Wrong Overgeneralisation+Lacking ge prefix gescheren geschoren Wrong -en suffix escheren geschoren Wrong -en suffix scheren geschoren Wrong -en suffix -geschoort geschoren Overgeneralisation +geschoort geschoren Wrong Overgeneralisation eschoren geschoren Prefix ge without onset schoren geschoren Lacking ge prefix schiette schoot Overgeneralisation schietten schoten Overgeneralisation schootte schoot Irregular form plus regular suffix schootten schoten Irregular form plus regular suffix -geschiet geschoten Overgeneralisation -eschiet geschoten Overgeneralisation -schiet geschoten Overgeneralisation +geschiet geschoten Overgeneralisation+ +eschiet geschoten Overgeneralisation+Prefix ge without onset +schiet geschoten Overgeneralisation+Lacking ge prefix +seschiet geschoten Overgeneralisation+prefix ge pronounced as se geschiete geschotene Overgeneralisation+ eschiete geschotene Overgeneralisation+Prefix ge without onset +seschiete geschotene Overgeneralisation+prefix ge pronounced as se +geschietd geschoten Wrong Overgeneralisation+ +eschietd geschoten Wrong Overgeneralisation+Prefix ge without onset +schietd geschoten Wrong Overgeneralisation+Lacking ge prefix geschieten geschoten Wrong -en suffix eschieten geschoten Wrong -en suffix schieten geschoten Wrong -en suffix -geschoot geschoten Overgeneralisation +geschoot geschoten Wrong Overgeneralisation +geschootd geschoten Wrong Overgeneralisation eschoten geschoten Prefix ge without onset schoten geschoten Lacking ge prefix schijnde scheen Overgeneralisation @@ -1398,31 +1728,39 @@ scheenden schenen Irregular form plus regular suffix geschijnd geschenen Overgeneralisation+ eschijnd geschenen Overgeneralisation+Prefix ge without onset schijnd geschenen Overgeneralisation+Lacking ge prefix +seschijnd geschenen Overgeneralisation+prefix ge pronounced as se geschijnde geschenene Overgeneralisation+ eschijnde geschenene Overgeneralisation+Prefix ge without onset -geschijnt geschenen Overgeneralisation -eschijnt geschenen Overgeneralisation -schijnt geschenen Overgeneralisation +seschijnde geschenene Overgeneralisation+prefix ge pronounced as se +geschijnt geschenen Wrong Overgeneralisation+ +eschijnt geschenen Wrong Overgeneralisation+Prefix ge without onset +schijnt geschenen Wrong Overgeneralisation+Lacking ge prefix geschijnen geschenen Wrong -en suffix eschijnen geschenen Wrong -en suffix schijnen geschenen Wrong -en suffix -gescheend geschenen Overgeneralisation -gescheent geschenen Overgeneralisation +gescheend geschenen Wrong Overgeneralisation +gescheent geschenen Wrong Overgeneralisation eschenen geschenen Prefix ge without onset schenen geschenen Lacking ge prefix schijtte scheet Overgeneralisation schijtten scheten Overgeneralisation scheette scheet Irregular form plus regular suffix scheetten scheten Irregular form plus regular suffix -geschijt gescheten Overgeneralisation -eschijt gescheten Overgeneralisation -schijt gescheten Overgeneralisation +geschijt gescheten Overgeneralisation+ +eschijt gescheten Overgeneralisation+Prefix ge without onset +schijt gescheten Overgeneralisation+Lacking ge prefix +seschijt gescheten Overgeneralisation+prefix ge pronounced as se geschijte geschetene Overgeneralisation+ eschijte geschetene Overgeneralisation+Prefix ge without onset +seschijte geschetene Overgeneralisation+prefix ge pronounced as se +geschijtd gescheten Wrong Overgeneralisation+ +eschijtd gescheten Wrong Overgeneralisation+Prefix ge without onset +schijtd gescheten Wrong Overgeneralisation+Lacking ge prefix geschijten gescheten Wrong -en suffix eschijten gescheten Wrong -en suffix schijten gescheten Wrong -en suffix -gescheet gescheten Overgeneralisation +gescheet gescheten Wrong Overgeneralisation +gescheetd gescheten Wrong Overgeneralisation escheten gescheten Prefix ge without onset scheten gescheten Lacking ge prefix schrijfde schreef Overgeneralisation @@ -1432,39 +1770,49 @@ schreefden schreven Irregular form plus regular suffix geschrijfd geschreven Overgeneralisation+ eschrijfd geschreven Overgeneralisation+Prefix ge without onset schrijfd geschreven Overgeneralisation+Lacking ge prefix +seschrijfd geschreven Overgeneralisation+prefix ge pronounced as se geschrijfde geschrevene Overgeneralisation+ eschrijfde geschrevene Overgeneralisation+Prefix ge without onset -geschrijft geschreven Overgeneralisation -eschrijft geschreven Overgeneralisation -schrijft geschreven Overgeneralisation +seschrijfde geschrevene Overgeneralisation+prefix ge pronounced as se +geschrijft geschreven Wrong Overgeneralisation+ +eschrijft geschreven Wrong Overgeneralisation+Prefix ge without onset +schrijft geschreven Wrong Overgeneralisation+Lacking ge prefix geschrijfen geschreven Wrong -en suffix eschrijfen geschreven Wrong -en suffix schrijfen geschreven Wrong -en suffix -geschreefd geschreven Overgeneralisation -geschreeft geschreven Overgeneralisation +geschreefd geschreven Wrong Overgeneralisation +geschreeft geschreven Wrong Overgeneralisation eschreven geschreven Prefix ge without onset schreven geschreven Lacking ge prefix schrikte schrok Overgeneralisation schrikten schrokken Overgeneralisation schrokte schrok Irregular form plus regular suffix schrokten schrokken Irregular form plus regular suffix -geschrikt geschrokken Overgeneralisation -eschrikt geschrokken Overgeneralisation -schrikt geschrokken Overgeneralisation +geschrikt geschrokken Overgeneralisation+ +eschrikt geschrokken Overgeneralisation+Prefix ge without onset +schrikt geschrokken Overgeneralisation+Lacking ge prefix +seschrikt geschrokken Overgeneralisation+prefix ge pronounced as se geschrikte geschrokkene Overgeneralisation+ eschrikte geschrokkene Overgeneralisation+Prefix ge without onset +seschrikte geschrokkene Overgeneralisation+prefix ge pronounced as se +geschrikd geschrokken Wrong Overgeneralisation+ +eschrikd geschrokken Wrong Overgeneralisation+Prefix ge without onset +schrikd geschrokken Wrong Overgeneralisation+Lacking ge prefix geschrikken geschrokken Wrong -en suffix eschrikken geschrokken Wrong -en suffix schrikken geschrokken Wrong -en suffix -geschrokt geschrokken Overgeneralisation +geschrokt geschrokken Wrong Overgeneralisation +geschrokd geschrokken Wrong Overgeneralisation eschrokken geschrokken Prefix ge without onset schrokken geschrokken Lacking ge prefix eschuild geschuild Prefix ge without onset schuild geschuild Lacking ge prefix +seschuild geschuild Overgeneralisation+prefix ge pronounced as se eschuilde geschuilde Overgeneralisation+Prefix ge without onset -geschuilt geschuild Overgeneralisation -eschuilt geschuild Overgeneralisation -schuilt geschuild Overgeneralisation +seschuilde geschuilde Overgeneralisation+prefix ge pronounced as se +geschuilt geschuild Wrong Overgeneralisation+ +eschuilt geschuild Wrong Overgeneralisation+Prefix ge without onset +schuilt geschuild Wrong Overgeneralisation+Lacking ge prefix geschuilen geschuild Wrong -en suffix eschuilen geschuild Wrong -en suffix schuilen geschuild Wrong -en suffix @@ -1475,15 +1823,17 @@ schoofden schoven Irregular form plus regular suffix geschuifd geschoven Overgeneralisation+ eschuifd geschoven Overgeneralisation+Prefix ge without onset schuifd geschoven Overgeneralisation+Lacking ge prefix +seschuifd geschoven Overgeneralisation+prefix ge pronounced as se geschuifde geschovene Overgeneralisation+ eschuifde geschovene Overgeneralisation+Prefix ge without onset -geschuift geschoven Overgeneralisation -eschuift geschoven Overgeneralisation -schuift geschoven Overgeneralisation +seschuifde geschovene Overgeneralisation+prefix ge pronounced as se +geschuift geschoven Wrong Overgeneralisation+ +eschuift geschoven Wrong Overgeneralisation+Prefix ge without onset +schuift geschoven Wrong Overgeneralisation+Lacking ge prefix geschuifen geschoven Wrong -en suffix eschuifen geschoven Wrong -en suffix schuifen geschoven Wrong -en suffix -geschooft geschoven Overgeneralisation +geschooft geschoven Wrong Overgeneralisation eschoven geschoven Prefix ge without onset schoven geschoven Lacking ge prefix slade sloeg Overgeneralisation @@ -1493,160 +1843,217 @@ sloegden sloegen Irregular form plus regular suffix geslaad geslagen Overgeneralisation+ eslaad geslagen Overgeneralisation+Prefix ge without onset slaad geslagen Overgeneralisation+Lacking ge prefix +seslaad geslagen Overgeneralisation+prefix ge pronounced as se geslade geslagene Overgeneralisation+ eslade geslagene Overgeneralisation+Prefix ge without onset -geslaat geslagen Overgeneralisation -eslaat geslagen Overgeneralisation -slaat geslagen Overgeneralisation +seslade geslagene Overgeneralisation+prefix ge pronounced as se +geslaat geslagen Wrong Overgeneralisation+ +eslaat geslagen Wrong Overgeneralisation+Prefix ge without onset +slaat geslagen Wrong Overgeneralisation+Lacking ge prefix geslaan geslagen Wrong -en suffix eslaan geslagen Wrong -en suffix slaan geslagen Wrong -en suffix -geslaagd geslagen Overgeneralisation -geslaagt geslagen Overgeneralisation +geslaagd geslagen Wrong Overgeneralisation +geslaagt geslagen Wrong Overgeneralisation eslagen geslagen Prefix ge without onset slagen geslagen Lacking ge prefix slaapte sliep Overgeneralisation slaapten sliepen Overgeneralisation sliepte sliep Irregular form plus regular suffix sliepten sliepen Irregular form plus regular suffix -geslaapt geslapen Overgeneralisation -eslaapt geslapen Overgeneralisation -slaapt geslapen Overgeneralisation +geslaapt geslapen Wrong Overgeneralisation +eslaapt geslapen Overgeneralisation+Prefix ge without onset +slaapt geslapen Overgeneralisation+Lacking ge prefix +seslaapt geslapen Overgeneralisation+prefix ge pronounced as se geslaapte geslapene Overgeneralisation+ eslaapte geslapene Overgeneralisation+Prefix ge without onset +seslaapte geslapene Overgeneralisation+prefix ge pronounced as se +geslaapd geslapen Wrong Overgeneralisation +eslaapd geslapen Wrong Overgeneralisation+Prefix ge without onset +slaapd geslapen Wrong Overgeneralisation+Lacking ge prefix eslapen geslapen Prefix ge without onset slapen geslapen Lacking ge prefix slijpte sleep Overgeneralisation slijpten slepen Overgeneralisation sleepte sleep Irregular form plus regular suffix sleepten slepen Irregular form plus regular suffix -geslijpt geslepen Overgeneralisation -eslijpt geslepen Overgeneralisation -slijpt geslepen Overgeneralisation +geslijpt geslepen Overgeneralisation+ +eslijpt geslepen Overgeneralisation+Prefix ge without onset +slijpt geslepen Overgeneralisation+Lacking ge prefix +seslijpt geslepen Overgeneralisation+prefix ge pronounced as se geslijpte geslepene Overgeneralisation+ eslijpte geslepene Overgeneralisation+Prefix ge without onset +seslijpte geslepene Overgeneralisation+prefix ge pronounced as se +geslijpd geslepen Wrong Overgeneralisation+ +eslijpd geslepen Wrong Overgeneralisation+Prefix ge without onset +slijpd geslepen Wrong Overgeneralisation+Lacking ge prefix geslijpen geslepen Wrong -en suffix eslijpen geslepen Wrong -en suffix slijpen geslepen Wrong -en suffix -gesleept geslepen Overgeneralisation +gesleept geslepen Wrong Overgeneralisation +gesleepd geslepen Wrong Overgeneralisation eslepen geslepen Prefix ge without onset slepen geslepen Lacking ge prefix slijtte sleet Overgeneralisation slijtten sleten Overgeneralisation sleette sleet Irregular form plus regular suffix sleetten sleten Irregular form plus regular suffix -geslijt gesleten Overgeneralisation -eslijt gesleten Overgeneralisation -slijt gesleten Overgeneralisation +geslijt gesleten Overgeneralisation+ +eslijt gesleten Overgeneralisation+Prefix ge without onset +slijt gesleten Overgeneralisation+Lacking ge prefix +seslijt gesleten Overgeneralisation+prefix ge pronounced as se geslijte gesletene Overgeneralisation+ eslijte gesletene Overgeneralisation+Prefix ge without onset +seslijte gesletene Overgeneralisation+prefix ge pronounced as se +geslijtd gesleten Wrong Overgeneralisation+ +eslijtd gesleten Wrong Overgeneralisation+Prefix ge without onset +slijtd gesleten Wrong Overgeneralisation+Lacking ge prefix geslijten gesleten Wrong -en suffix eslijten gesleten Wrong -en suffix slijten gesleten Wrong -en suffix -gesleet gesleten Overgeneralisation +gesleet gesleten Wrong Overgeneralisation +gesleetd gesleten Wrong Overgeneralisation esleten gesleten Prefix ge without onset sleten gesleten Lacking ge prefix slinkte slonk Overgeneralisation slinkten slonken Overgeneralisation slonkte slonk Irregular form plus regular suffix slonkten slonken Irregular form plus regular suffix -geslinkt Geslonken Overgeneralisation -eslinkt Geslonken Overgeneralisation -slinkt Geslonken Overgeneralisation +geslinkt Geslonken Overgeneralisation+ +eslinkt Geslonken Overgeneralisation+Prefix ge without onset +slinkt Geslonken Overgeneralisation+Lacking ge prefix +seslinkt Geslonken Overgeneralisation+prefix ge pronounced as se geslinkte Geslonkene Overgeneralisation+ eslinkte Geslonkene Overgeneralisation+Prefix ge without onset +seslinkte Geslonkene Overgeneralisation+prefix ge pronounced as se +geslinkd Geslonken Wrong Overgeneralisation+ +eslinkd Geslonken Wrong Overgeneralisation+Prefix ge without onset +slinkd Geslonken Wrong Overgeneralisation+Lacking ge prefix geslinken Geslonken Wrong -en suffix eslinken Geslonken Wrong -en suffix slinken Geslonken Wrong -en suffix -geGeslonkt Geslonken Overgeneralisation +geGeslonkt Geslonken Wrong Overgeneralisation+ +geGeslonkd Geslonken Wrong Overgeneralisation+ sluipte sloop Overgeneralisation sluipten slopen Overgeneralisation sloopte sloop Irregular form plus regular suffix sloopten slopen Irregular form plus regular suffix -gesluipt geslopen Overgeneralisation -esluipt geslopen Overgeneralisation -sluipt geslopen Overgeneralisation +gesluipt geslopen Overgeneralisation+ +esluipt geslopen Overgeneralisation+Prefix ge without onset +sluipt geslopen Overgeneralisation+Lacking ge prefix +sesluipt geslopen Overgeneralisation+prefix ge pronounced as se gesluipte geslopene Overgeneralisation+ esluipte geslopene Overgeneralisation+Prefix ge without onset +sesluipte geslopene Overgeneralisation+prefix ge pronounced as se +gesluipd geslopen Wrong Overgeneralisation+ +esluipd geslopen Wrong Overgeneralisation+Prefix ge without onset +sluipd geslopen Wrong Overgeneralisation+Lacking ge prefix gesluipen geslopen Wrong -en suffix esluipen geslopen Wrong -en suffix sluipen geslopen Wrong -en suffix -gesloopt geslopen Overgeneralisation +gesloopt geslopen Wrong Overgeneralisation +gesloopd geslopen Wrong Overgeneralisation eslopen geslopen Prefix ge without onset slopen geslopen Lacking ge prefix sluitte sloot Overgeneralisation sluitten sloten Overgeneralisation slootte sloot Irregular form plus regular suffix slootten sloten Irregular form plus regular suffix -gesluit gesloten Overgeneralisation -esluit gesloten Overgeneralisation -sluit gesloten Overgeneralisation +gesluit gesloten Overgeneralisation+ +esluit gesloten Overgeneralisation+Prefix ge without onset +sluit gesloten Overgeneralisation+Lacking ge prefix +sesluit gesloten Overgeneralisation+prefix ge pronounced as se gesluite geslotene Overgeneralisation+ esluite geslotene Overgeneralisation+Prefix ge without onset +sesluite geslotene Overgeneralisation+prefix ge pronounced as se +gesluitd gesloten Wrong Overgeneralisation+ +esluitd gesloten Wrong Overgeneralisation+Prefix ge without onset +sluitd gesloten Wrong Overgeneralisation+Lacking ge prefix gesluiten gesloten Wrong -en suffix esluiten gesloten Wrong -en suffix sluiten gesloten Wrong -en suffix -gesloot gesloten Overgeneralisation +gesloot gesloten Wrong Overgeneralisation +geslootd gesloten Wrong Overgeneralisation esloten gesloten Prefix ge without onset sloten gesloten Lacking ge prefix smeltte smolt Overgeneralisation smeltten smolten Overgeneralisation smoltte smolt Irregular form plus regular suffix smoltten smolten Irregular form plus regular suffix -gesmelt gesmolten Overgeneralisation -esmelt gesmolten Overgeneralisation -smelt gesmolten Overgeneralisation +gesmelt gesmolten Overgeneralisation+ +esmelt gesmolten Overgeneralisation+Prefix ge without onset +smelt gesmolten Overgeneralisation+Lacking ge prefix +sesmelt gesmolten Overgeneralisation+prefix ge pronounced as se gesmelte gesmoltene Overgeneralisation+ esmelte gesmoltene Overgeneralisation+Prefix ge without onset +sesmelte gesmoltene Overgeneralisation+prefix ge pronounced as se +gesmeltd gesmolten Wrong Overgeneralisation+ +esmeltd gesmolten Wrong Overgeneralisation+Prefix ge without onset +smeltd gesmolten Wrong Overgeneralisation+Lacking ge prefix gesmelten gesmolten Wrong -en suffix esmelten gesmolten Wrong -en suffix smelten gesmolten Wrong -en suffix -gesmolt gesmolten Overgeneralisation +gesmolt gesmolten Wrong Overgeneralisation +gesmoltd gesmolten Wrong Overgeneralisation esmolten gesmolten Prefix ge without onset smolten gesmolten Lacking ge prefix smijtte smeet Overgeneralisation smijtten smeten Overgeneralisation smeette smeet Irregular form plus regular suffix smeetten smeten Irregular form plus regular suffix -gesmijt gesmeten Overgeneralisation -esmijt gesmeten Overgeneralisation -smijt gesmeten Overgeneralisation +gesmijt gesmeten Overgeneralisation+ +esmijt gesmeten Overgeneralisation+Prefix ge without onset +smijt gesmeten Overgeneralisation+Lacking ge prefix +sesmijt gesmeten Overgeneralisation+prefix ge pronounced as se gesmijte gesmetene Overgeneralisation+ esmijte gesmetene Overgeneralisation+Prefix ge without onset +sesmijte gesmetene Overgeneralisation+prefix ge pronounced as se +gesmijtd gesmeten Wrong Overgeneralisation+ +esmijtd gesmeten Wrong Overgeneralisation+Prefix ge without onset +smijtd gesmeten Wrong Overgeneralisation+Lacking ge prefix gesmijten gesmeten Wrong -en suffix esmijten gesmeten Wrong -en suffix smijten gesmeten Wrong -en suffix -gesmeet gesmeten Overgeneralisation +gesmeet gesmeten Wrong Overgeneralisation +gesmeetd gesmeten Wrong Overgeneralisation esmeten gesmeten Prefix ge without onset smeten gesmeten Lacking ge prefix snijdde sneed Overgeneralisation snijdden sneden Overgeneralisation sneedde sneed Irregular form plus regular suffix sneedden sneden Irregular form plus regular suffix -gesnijd gesneden Overgeneralisation -esnijd gesneden Overgeneralisation -snijd gesneden Overgeneralisation +gesnijd gesneden Wrong Overgeneralisation+ +esnijd gesneden Wrong Overgeneralisation+Prefix ge without onset +snijd gesneden Wrong Overgeneralisation+Lacking ge prefix +sesnijd gesneden Overgeneralisation+prefix ge pronounced as se gesnijde gesnedene Overgeneralisation+ esnijde gesnedene Overgeneralisation+Prefix ge without onset +sesnijde gesnedene Overgeneralisation+prefix ge pronounced as se gesnijden gesneden Wrong -en suffix esnijden gesneden Wrong -en suffix snijden gesneden Wrong -en suffix -gesneed gesneden Overgeneralisation +gesneed gesneden Wrong Overgeneralisation esneden gesneden Prefix ge without onset sneden gesneden Lacking ge prefix snuitte snoot Overgeneralisation snuitten snoten Overgeneralisation snootte snoot Irregular form plus regular suffix snootten snoten Irregular form plus regular suffix -gesnuit gesnoten Overgeneralisation -esnuit gesnoten Overgeneralisation -snuit gesnoten Overgeneralisation +gesnuit gesnoten Overgeneralisation+ +esnuit gesnoten Overgeneralisation+Prefix ge without onset +snuit gesnoten Overgeneralisation+Lacking ge prefix +sesnuit gesnoten Overgeneralisation+prefix ge pronounced as se gesnuite gesnotene Overgeneralisation+ esnuite gesnotene Overgeneralisation+Prefix ge without onset +sesnuite gesnotene Overgeneralisation+prefix ge pronounced as se +gesnuitd gesnoten Wrong Overgeneralisation+ +esnuitd gesnoten Wrong Overgeneralisation+Prefix ge without onset +snuitd gesnoten Wrong Overgeneralisation+Lacking ge prefix gesnuiten gesnoten Wrong -en suffix esnuiten gesnoten Wrong -en suffix snuiten gesnoten Wrong -en suffix -gesnoot gesnoten Overgeneralisation +gesnoot gesnoten Wrong Overgeneralisation +gesnootd gesnoten Wrong Overgeneralisation esnoten gesnoten Prefix ge without onset snoten gesnoten Lacking ge prefix snuifde snoof Overgeneralisation @@ -1656,40 +2063,50 @@ snoofden snoven Irregular form plus regular suffix gesnuifd gesnoven Overgeneralisation+ esnuifd gesnoven Overgeneralisation+Prefix ge without onset snuifd gesnoven Overgeneralisation+Lacking ge prefix +sesnuifd gesnoven Overgeneralisation+prefix ge pronounced as se gesnuifde gesnovene Overgeneralisation+ esnuifde gesnovene Overgeneralisation+Prefix ge without onset -gesnuift gesnoven Overgeneralisation -esnuift gesnoven Overgeneralisation -snuift gesnoven Overgeneralisation +sesnuifde gesnovene Overgeneralisation+prefix ge pronounced as se +gesnuift gesnoven Wrong Overgeneralisation+ +esnuift gesnoven Wrong Overgeneralisation+Prefix ge without onset +snuift gesnoven Wrong Overgeneralisation+Lacking ge prefix gesnuifen gesnoven Wrong -en suffix esnuifen gesnoven Wrong -en suffix snuifen gesnoven Wrong -en suffix -gesnooft gesnoven Overgeneralisation +gesnooft gesnoven Wrong Overgeneralisation esnoven gesnoven Prefix ge without onset snoven gesnoven Lacking ge prefix -gespand gespannen Overgeneralisation +gespand gespannen Wrong Overgeneralisation espand gespannen Overgeneralisation+Prefix ge without onset spand gespannen Overgeneralisation+Lacking ge prefix +sespand gespannen Overgeneralisation+prefix ge pronounced as se gespande gespannene Overgeneralisation+ espande gespannene Overgeneralisation+Prefix ge without onset -gespant gespannen Overgeneralisation -espant gespannen Overgeneralisation -spant gespannen Overgeneralisation +sespande gespannene Overgeneralisation+prefix ge pronounced as se +gespant gespannen Wrong Overgeneralisation +espant gespannen Wrong Overgeneralisation+Prefix ge without onset +spant gespannen Wrong Overgeneralisation+Lacking ge prefix espannen gespannen Prefix ge without onset spannen gespannen Lacking ge prefix spijtte speet Overgeneralisation spijtten speten Overgeneralisation speette speet Irregular form plus regular suffix speetten speten Irregular form plus regular suffix -gespijt gespeten Overgeneralisation -espijt gespeten Overgeneralisation -spijt gespeten Overgeneralisation +gespijt gespeten Overgeneralisation+ +espijt gespeten Overgeneralisation+Prefix ge without onset +spijt gespeten Overgeneralisation+Lacking ge prefix +sespijt gespeten Overgeneralisation+prefix ge pronounced as se gespijte gespetene Overgeneralisation+ espijte gespetene Overgeneralisation+Prefix ge without onset +sespijte gespetene Overgeneralisation+prefix ge pronounced as se +gespijtd gespeten Wrong Overgeneralisation+ +espijtd gespeten Wrong Overgeneralisation+Prefix ge without onset +spijtd gespeten Wrong Overgeneralisation+Lacking ge prefix gespijten gespeten Wrong -en suffix espijten gespeten Wrong -en suffix spijten gespeten Wrong -en suffix -gespeet gespeten Overgeneralisation +gespeet gespeten Wrong Overgeneralisation +gespeetd gespeten Wrong Overgeneralisation espeten gespeten Prefix ge without onset speten gespeten Lacking ge prefix spinde spon Overgeneralisation @@ -1699,45 +2116,59 @@ sponden sponnen Irregular form plus regular suffix gespind gesponnen Overgeneralisation+ espind gesponnen Overgeneralisation+Prefix ge without onset spind gesponnen Overgeneralisation+Lacking ge prefix +sespind gesponnen Overgeneralisation+prefix ge pronounced as se gespinde gesponnene Overgeneralisation+ espinde gesponnene Overgeneralisation+Prefix ge without onset -gespint gesponnen Overgeneralisation -espint gesponnen Overgeneralisation -spint gesponnen Overgeneralisation +sespinde gesponnene Overgeneralisation+prefix ge pronounced as se +gespint gesponnen Wrong Overgeneralisation+ +espint gesponnen Wrong Overgeneralisation+Prefix ge without onset +spint gesponnen Wrong Overgeneralisation+Lacking ge prefix gespinnen gesponnen Wrong -en suffix espinnen gesponnen Wrong -en suffix spinnen gesponnen Wrong -en suffix -gespont gesponnen Overgeneralisation +gespont gesponnen Wrong Overgeneralisation esponnen gesponnen Prefix ge without onset sponnen gesponnen Lacking ge prefix splijtte spleet Overgeneralisation splijtten spleten Overgeneralisation spleette spleet Irregular form plus regular suffix spleetten spleten Irregular form plus regular suffix -gesplijt gespleten Overgeneralisation -esplijt gespleten Overgeneralisation -splijt gespleten Overgeneralisation +gesplijt gespleten Overgeneralisation+ +esplijt gespleten Overgeneralisation+Prefix ge without onset +splijt gespleten Overgeneralisation+Lacking ge prefix +sesplijt gespleten Overgeneralisation+prefix ge pronounced as se gesplijte gespletene Overgeneralisation+ esplijte gespletene Overgeneralisation+Prefix ge without onset +sesplijte gespletene Overgeneralisation+prefix ge pronounced as se +gesplijtd gespleten Wrong Overgeneralisation+ +esplijtd gespleten Wrong Overgeneralisation+Prefix ge without onset +splijtd gespleten Wrong Overgeneralisation+Lacking ge prefix gesplijten gespleten Wrong -en suffix esplijten gespleten Wrong -en suffix splijten gespleten Wrong -en suffix -gespleet gespleten Overgeneralisation +gespleet gespleten Wrong Overgeneralisation +gespleetd gespleten Wrong Overgeneralisation espleten gespleten Prefix ge without onset spleten gespleten Lacking ge prefix spreekte sprak Overgeneralisation spreekten spraken Overgeneralisation sprakte sprak Irregular form plus regular suffix sprakten spraken Irregular form plus regular suffix -gespreekt gesproken Overgeneralisation -espreekt gesproken Overgeneralisation -spreekt gesproken Overgeneralisation +gespreekt gesproken Overgeneralisation+ +espreekt gesproken Overgeneralisation+Prefix ge without onset +spreekt gesproken Overgeneralisation+Lacking ge prefix +sespreekt gesproken Overgeneralisation+prefix ge pronounced as se gespreekte gesprokene Overgeneralisation+ espreekte gesprokene Overgeneralisation+Prefix ge without onset +sespreekte gesprokene Overgeneralisation+prefix ge pronounced as se +gespreekd gesproken Wrong Overgeneralisation+ +espreekd gesproken Wrong Overgeneralisation+Prefix ge without onset +spreekd gesproken Wrong Overgeneralisation+Lacking ge prefix gespreken gesproken Wrong -en suffix espreken gesproken Wrong -en suffix spreken gesproken Wrong -en suffix -gesprookt gesproken Overgeneralisation +gesprookt gesproken Wrong Overgeneralisation +gesprookd gesproken Wrong Overgeneralisation esproken gesproken Prefix ge without onset sproken gesproken Lacking ge prefix springde sprong Overgeneralisation @@ -1747,46 +2178,60 @@ sprongden sprongen Irregular form plus regular suffix gespringd gesprongen Overgeneralisation+ espringd gesprongen Overgeneralisation+Prefix ge without onset springd gesprongen Overgeneralisation+Lacking ge prefix +sespringd gesprongen Overgeneralisation+prefix ge pronounced as se gespringde gesprongene Overgeneralisation+ espringde gesprongene Overgeneralisation+Prefix ge without onset -gespringt gesprongen Overgeneralisation -espringt gesprongen Overgeneralisation -springt gesprongen Overgeneralisation +sespringde gesprongene Overgeneralisation+prefix ge pronounced as se +gespringt gesprongen Wrong Overgeneralisation+ +espringt gesprongen Wrong Overgeneralisation+Prefix ge without onset +springt gesprongen Wrong Overgeneralisation+Lacking ge prefix gespringen gesprongen Wrong -en suffix espringen gesprongen Wrong -en suffix springen gesprongen Wrong -en suffix -gesprongd gesprongen Overgeneralisation -gesprongt gesprongen Overgeneralisation +gesprongd gesprongen Wrong Overgeneralisation +gesprongt gesprongen Wrong Overgeneralisation esprongen gesprongen Prefix ge without onset sprongen gesprongen Lacking ge prefix spruitte sproot Overgeneralisation spruitten sproten Overgeneralisation sprootte sproot Irregular form plus regular suffix sprootten sproten Irregular form plus regular suffix -gespruit gesproten Overgeneralisation -espruit gesproten Overgeneralisation -spruit gesproten Overgeneralisation +gespruit gesproten Overgeneralisation+ +espruit gesproten Overgeneralisation+Prefix ge without onset +spruit gesproten Overgeneralisation+Lacking ge prefix +sespruit gesproten Overgeneralisation+prefix ge pronounced as se gespruite gesprotene Overgeneralisation+ espruite gesprotene Overgeneralisation+Prefix ge without onset +sespruite gesprotene Overgeneralisation+prefix ge pronounced as se +gespruitd gesproten Wrong Overgeneralisation+ +espruitd gesproten Wrong Overgeneralisation+Prefix ge without onset +spruitd gesproten Wrong Overgeneralisation+Lacking ge prefix gespruiten gesproten Wrong -en suffix espruiten gesproten Wrong -en suffix spruiten gesproten Wrong -en suffix -gesproot gesproten Overgeneralisation +gesproot gesproten Wrong Overgeneralisation +gesprootd gesproten Wrong Overgeneralisation esproten gesproten Prefix ge without onset sproten gesproten Lacking ge prefix spuitte spoot Overgeneralisation spuitten spoten Overgeneralisation spootte spoot Irregular form plus regular suffix spootten spoten Irregular form plus regular suffix -gespuit gespoten Overgeneralisation -espuit gespoten Overgeneralisation -spuit gespoten Overgeneralisation +gespuit gespoten Overgeneralisation+ +espuit gespoten Overgeneralisation+Prefix ge without onset +spuit gespoten Overgeneralisation+Lacking ge prefix +sespuit gespoten Overgeneralisation+prefix ge pronounced as se gespuite gespotene Overgeneralisation+ espuite gespotene Overgeneralisation+Prefix ge without onset +sespuite gespotene Overgeneralisation+prefix ge pronounced as se +gespuitd gespoten Wrong Overgeneralisation+ +espuitd gespoten Wrong Overgeneralisation+Prefix ge without onset +spuitd gespoten Wrong Overgeneralisation+Lacking ge prefix gespuiten gespoten Wrong -en suffix espuiten gespoten Wrong -en suffix spuiten gespoten Wrong -en suffix -gespoot gespoten Overgeneralisation +gespoot gespoten Wrong Overgeneralisation +gespootd gespoten Wrong Overgeneralisation espoten gespoten Prefix ge without onset spoten gespoten Lacking ge prefix state stond Overgeneralisation @@ -1796,26 +2241,34 @@ stondten stonden Irregular form plus regular suffix gestat gestaan Overgeneralisation+ estat gestaan Overgeneralisation+Prefix ge without onset stat gestaan Overgeneralisation+Lacking ge prefix +sestat gestaan Overgeneralisation+prefix ge pronounced as se gestatte gestaane Overgeneralisation+ estatte gestaane Overgeneralisation+Prefix ge without onset -gestaat gestaan Overgeneralisation -estaat gestaan Overgeneralisation -staat gestaan Overgeneralisation +sestatte gestaane Overgeneralisation+prefix ge pronounced as se +gestaat gestaan Wrong Overgeneralisation+ +estaat gestaan Wrong Overgeneralisation+Prefix ge without onset +staat gestaan Wrong Overgeneralisation+Lacking ge prefix estaan gestaan Prefix ge without onset staan gestaan Lacking ge prefix steekte stak Overgeneralisation steekten staken Overgeneralisation stakte stak Irregular form plus regular suffix stakten staken Irregular form plus regular suffix -gesteekt gestoken Overgeneralisation -esteekt gestoken Overgeneralisation -steekt gestoken Overgeneralisation +gesteekt gestoken Overgeneralisation+ +esteekt gestoken Overgeneralisation+Prefix ge without onset +steekt gestoken Overgeneralisation+Lacking ge prefix +sesteekt gestoken Overgeneralisation+prefix ge pronounced as se gesteekte gestokene Overgeneralisation+ esteekte gestokene Overgeneralisation+Prefix ge without onset +sesteekte gestokene Overgeneralisation+prefix ge pronounced as se +gesteekd gestoken Wrong Overgeneralisation+ +esteekd gestoken Wrong Overgeneralisation+Prefix ge without onset +steekd gestoken Wrong Overgeneralisation+Lacking ge prefix gesteken gestoken Wrong -en suffix esteken gestoken Wrong -en suffix steken gestoken Wrong -en suffix -gestookt gestoken Overgeneralisation +gestookt gestoken Wrong Overgeneralisation +gestookd gestoken Wrong Overgeneralisation estoken gestoken Prefix ge without onset stoken gestoken Lacking ge prefix steelde stal Overgeneralisation @@ -1825,15 +2278,17 @@ stalden stalen Irregular form plus regular suffix gesteeld gestolen Overgeneralisation+ esteeld gestolen Overgeneralisation+Prefix ge without onset steeld gestolen Overgeneralisation+Lacking ge prefix +sesteeld gestolen Overgeneralisation+prefix ge pronounced as se gesteelde gestolene Overgeneralisation+ esteelde gestolene Overgeneralisation+Prefix ge without onset -gesteelt gestolen Overgeneralisation -esteelt gestolen Overgeneralisation -steelt gestolen Overgeneralisation +sesteelde gestolene Overgeneralisation+prefix ge pronounced as se +gesteelt gestolen Wrong Overgeneralisation+ +esteelt gestolen Wrong Overgeneralisation+Prefix ge without onset +steelt gestolen Wrong Overgeneralisation+Lacking ge prefix gestelen gestolen Wrong -en suffix estelen gestolen Wrong -en suffix stelen gestolen Wrong -en suffix -gestoolt gestolen Overgeneralisation +gestoolt gestolen Wrong Overgeneralisation estolen gestolen Prefix ge without onset stolen gestolen Lacking ge prefix sterfde stierf Overgeneralisation @@ -1843,16 +2298,18 @@ stierfden stierven Irregular form plus regular suffix gesterfd gestorven Overgeneralisation+ esterfd gestorven Overgeneralisation+Prefix ge without onset sterfd gestorven Overgeneralisation+Lacking ge prefix +sesterfd gestorven Overgeneralisation+prefix ge pronounced as se gesterfde gestorvene Overgeneralisation+ esterfde gestorvene Overgeneralisation+Prefix ge without onset -gesterft gestorven Overgeneralisation -esterft gestorven Overgeneralisation -sterft gestorven Overgeneralisation +sesterfde gestorvene Overgeneralisation+prefix ge pronounced as se +gesterft gestorven Wrong Overgeneralisation+ +esterft gestorven Wrong Overgeneralisation+Prefix ge without onset +sterft gestorven Wrong Overgeneralisation+Lacking ge prefix gesterfen gestorven Wrong -en suffix esterfen gestorven Wrong -en suffix sterfen gestorven Wrong -en suffix -gestorfd gestorven Overgeneralisation -gestorft gestorven Overgeneralisation +gestorfd gestorven Wrong Overgeneralisation +gestorft gestorven Wrong Overgeneralisation estorven gestorven Prefix ge without onset storven gestorven Lacking ge prefix stijgde steeg Overgeneralisation @@ -1862,16 +2319,18 @@ steegden stegen Irregular form plus regular suffix gestijgd gestegen Overgeneralisation+ estijgd gestegen Overgeneralisation+Prefix ge without onset stijgd gestegen Overgeneralisation+Lacking ge prefix +sestijgd gestegen Overgeneralisation+prefix ge pronounced as se gestijgde gestegene Overgeneralisation+ estijgde gestegene Overgeneralisation+Prefix ge without onset -gestijgt gestegen Overgeneralisation -estijgt gestegen Overgeneralisation -stijgt gestegen Overgeneralisation +sestijgde gestegene Overgeneralisation+prefix ge pronounced as se +gestijgt gestegen Wrong Overgeneralisation+ +estijgt gestegen Wrong Overgeneralisation+Prefix ge without onset +stijgt gestegen Wrong Overgeneralisation+Lacking ge prefix gestijgen gestegen Wrong -en suffix estijgen gestegen Wrong -en suffix stijgen gestegen Wrong -en suffix -gesteegd gestegen Overgeneralisation -gesteegt gestegen Overgeneralisation +gesteegd gestegen Wrong Overgeneralisation +gesteegt gestegen Wrong Overgeneralisation estegen gestegen Prefix ge without onset stegen gestegen Lacking ge prefix stijfde steef Overgeneralisation @@ -1881,68 +2340,89 @@ steefden steven Irregular form plus regular suffix gestijfd gesteven Overgeneralisation+ estijfd gesteven Overgeneralisation+Prefix ge without onset stijfd gesteven Overgeneralisation+Lacking ge prefix +sestijfd gesteven Overgeneralisation+prefix ge pronounced as se gestijfde gestevene Overgeneralisation+ estijfde gestevene Overgeneralisation+Prefix ge without onset -gestijft gesteven Overgeneralisation -estijft gesteven Overgeneralisation -stijft gesteven Overgeneralisation +sestijfde gestevene Overgeneralisation+prefix ge pronounced as se +gestijft gesteven Wrong Overgeneralisation+ +estijft gesteven Wrong Overgeneralisation+Prefix ge without onset +stijft gesteven Wrong Overgeneralisation+Lacking ge prefix gestijfen gesteven Wrong -en suffix estijfen gesteven Wrong -en suffix stijfen gesteven Wrong -en suffix -gesteefd gesteven Overgeneralisation -gesteeft gesteven Overgeneralisation +gesteefd gesteven Wrong Overgeneralisation +gesteeft gesteven Wrong Overgeneralisation esteven gesteven Prefix ge without onset steven gesteven Lacking ge prefix stinkte stonk Overgeneralisation stinkten stonken Overgeneralisation stonkte stonk Irregular form plus regular suffix stonkten stonken Irregular form plus regular suffix -gestinkt gestonken Overgeneralisation -estinkt gestonken Overgeneralisation -stinkt gestonken Overgeneralisation +gestinkt gestonken Overgeneralisation+ +estinkt gestonken Overgeneralisation+Prefix ge without onset +stinkt gestonken Overgeneralisation+Lacking ge prefix +sestinkt gestonken Overgeneralisation+prefix ge pronounced as se gestinkte gestonkene Overgeneralisation+ estinkte gestonkene Overgeneralisation+Prefix ge without onset +sestinkte gestonkene Overgeneralisation+prefix ge pronounced as se +gestinkd gestonken Wrong Overgeneralisation+ +estinkd gestonken Wrong Overgeneralisation+Prefix ge without onset +stinkd gestonken Wrong Overgeneralisation+Lacking ge prefix gestinken gestonken Wrong -en suffix estinken gestonken Wrong -en suffix stinken gestonken Wrong -en suffix -gestonkt gestonken Overgeneralisation +gestonkt gestonken Wrong Overgeneralisation +gestonkd gestonken Wrong Overgeneralisation estonken gestonken Prefix ge without onset stonken gestonken Lacking ge prefix -gestoot gestoten Overgeneralisation -estoot gestoten Overgeneralisation -stoot gestoten Overgeneralisation +gestoot gestoten Wrong Overgeneralisation +estoot gestoten Overgeneralisation+Prefix ge without onset +stoot gestoten Overgeneralisation+Lacking ge prefix +sestoot gestoten Overgeneralisation+prefix ge pronounced as se gestote gestotene Overgeneralisation+ estote gestotene Overgeneralisation+Prefix ge without onset +sestote gestotene Overgeneralisation+prefix ge pronounced as se +gestootd gestoten Wrong Overgeneralisation +estootd gestoten Wrong Overgeneralisation+Prefix ge without onset +stootd gestoten Wrong Overgeneralisation+Lacking ge prefix estoten gestoten Prefix ge without onset stoten gestoten Lacking ge prefix strijdde streed Overgeneralisation strijdden streden Overgeneralisation streedde streed Irregular form plus regular suffix streedden streden Irregular form plus regular suffix -gestrijd gestreden Overgeneralisation -estrijd gestreden Overgeneralisation -strijd gestreden Overgeneralisation +gestrijd gestreden Wrong Overgeneralisation+ +estrijd gestreden Wrong Overgeneralisation+Prefix ge without onset +strijd gestreden Wrong Overgeneralisation+Lacking ge prefix +sestrijd gestreden Overgeneralisation+prefix ge pronounced as se gestrijde gestredene Overgeneralisation+ estrijde gestredene Overgeneralisation+Prefix ge without onset +sestrijde gestredene Overgeneralisation+prefix ge pronounced as se gestrijden gestreden Wrong -en suffix estrijden gestreden Wrong -en suffix strijden gestreden Wrong -en suffix -gestreed gestreden Overgeneralisation +gestreed gestreden Wrong Overgeneralisation estreden gestreden Prefix ge without onset streden gestreden Lacking ge prefix strijkte streek Overgeneralisation strijkten streken Overgeneralisation streekte streek Irregular form plus regular suffix streekten streken Irregular form plus regular suffix -gestrijkt gestreken Overgeneralisation -estrijkt gestreken Overgeneralisation -strijkt gestreken Overgeneralisation +gestrijkt gestreken Overgeneralisation+ +estrijkt gestreken Overgeneralisation+Prefix ge without onset +strijkt gestreken Overgeneralisation+Lacking ge prefix +sestrijkt gestreken Overgeneralisation+prefix ge pronounced as se gestrijkte gestrekene Overgeneralisation+ estrijkte gestrekene Overgeneralisation+Prefix ge without onset +sestrijkte gestrekene Overgeneralisation+prefix ge pronounced as se +gestrijkd gestreken Wrong Overgeneralisation+ +estrijkd gestreken Wrong Overgeneralisation+Prefix ge without onset +strijkd gestreken Wrong Overgeneralisation+Lacking ge prefix gestrijken gestreken Wrong -en suffix estrijken gestreken Wrong -en suffix strijken gestreken Wrong -en suffix -gestreekt gestreken Overgeneralisation +gestreekt gestreken Wrong Overgeneralisation +gestreekd gestreken Wrong Overgeneralisation estreken gestreken Prefix ge without onset streken gestreken Lacking ge prefix stuifde stoof Overgeneralisation @@ -1952,113 +2432,141 @@ stoofden stoven Irregular form plus regular suffix gestuifd gestoventoven Overgeneralisation+ estuifd gestoventoven Overgeneralisation+Prefix ge without onset stuifd gestoventoven Overgeneralisation+Lacking ge prefix +sestuifd gestoventoven Overgeneralisation+prefix ge pronounced as se gestuifde gestoventovene Overgeneralisation+ estuifde gestoventovene Overgeneralisation+Prefix ge without onset -gestuift gestoventoven Overgeneralisation -estuift gestoventoven Overgeneralisation -stuift gestoventoven Overgeneralisation +sestuifde gestoventovene Overgeneralisation+prefix ge pronounced as se +gestuift gestoventoven Wrong Overgeneralisation+ +estuift gestoventoven Wrong Overgeneralisation+Prefix ge without onset +stuift gestoventoven Wrong Overgeneralisation+Lacking ge prefix gestuifen gestoventoven Wrong -en suffix estuifen gestoventoven Wrong -en suffix stuifen gestoventoven Wrong -en suffix -gestoventooft gestoventoven Overgeneralisation +gestoventooft gestoventoven Wrong Overgeneralisation estoventoven gestoventoven Prefix ge without onset stoventoven gestoventoven Lacking ge prefix treedde trad Overgeneralisation treedden traden Overgeneralisation tradde trad Irregular form plus regular suffix tradden traden Irregular form plus regular suffix -getreed getreden Overgeneralisation -etreed getreden Overgeneralisation -treed getreden Overgeneralisation +getreed getreden Wrong Overgeneralisation +etreed getreden Wrong Overgeneralisation+Prefix ge without onset +treed getreden Wrong Overgeneralisation+Lacking ge prefix +setreed getreden Overgeneralisation+prefix ge pronounced as se getrede getredene Overgeneralisation+ etrede getredene Overgeneralisation+Prefix ge without onset +setrede getredene Overgeneralisation+prefix ge pronounced as se etreden getreden Prefix ge without onset treden getreden Lacking ge prefix trefte trof Overgeneralisation treften troffen Overgeneralisation trofte trof Irregular form plus regular suffix troften troffen Irregular form plus regular suffix -getreft getroffen Overgeneralisation -etreft getroffen Overgeneralisation -treft getroffen Overgeneralisation +getreft getroffen Overgeneralisation+ +etreft getroffen Overgeneralisation+Prefix ge without onset +treft getroffen Overgeneralisation+Lacking ge prefix +setreft getroffen Overgeneralisation+prefix ge pronounced as se getrefte getroffene Overgeneralisation+ etrefte getroffene Overgeneralisation+Prefix ge without onset +setrefte getroffene Overgeneralisation+prefix ge pronounced as se +getrefd getroffen Wrong Overgeneralisation+ +etrefd getroffen Wrong Overgeneralisation+Prefix ge without onset +trefd getroffen Wrong Overgeneralisation+Lacking ge prefix getreffen getroffen Wrong -en suffix etreffen getroffen Wrong -en suffix treffen getroffen Wrong -en suffix -getroft getroffen Overgeneralisation +getroft getroffen Wrong Overgeneralisation +getrofd getroffen Wrong Overgeneralisation etroffen getroffen Prefix ge without onset troffen getroffen Lacking ge prefix trekte trok Overgeneralisation trekten trokken Overgeneralisation trokte trok Irregular form plus regular suffix trokten trokken Irregular form plus regular suffix -getrekt getrokken Overgeneralisation -etrekt getrokken Overgeneralisation -trekt getrokken Overgeneralisation +getrekt getrokken Overgeneralisation+ +etrekt getrokken Overgeneralisation+Prefix ge without onset +trekt getrokken Overgeneralisation+Lacking ge prefix +setrekt getrokken Overgeneralisation+prefix ge pronounced as se getrekte getrokkene Overgeneralisation+ etrekte getrokkene Overgeneralisation+Prefix ge without onset +setrekte getrokkene Overgeneralisation+prefix ge pronounced as se +getrekd getrokken Wrong Overgeneralisation+ +etrekd getrokken Wrong Overgeneralisation+Prefix ge without onset +trekd getrokken Wrong Overgeneralisation+Lacking ge prefix getrekken getrokken Wrong -en suffix etrekken getrokken Wrong -en suffix trekken getrokken Wrong -en suffix -getrokt getrokken Overgeneralisation +getrokt getrokken Wrong Overgeneralisation +getrokd getrokken Wrong Overgeneralisation etrokken getrokken Prefix ge without onset trokken getrokken Lacking ge prefix valde viel Overgeneralisation valden vielen Overgeneralisation vielde viel Irregular form plus regular suffix vielden vielen Irregular form plus regular suffix -gevald gevallen Overgeneralisation +gevald gevallen Wrong Overgeneralisation evald gevallen Overgeneralisation+Prefix ge without onset vald gevallen Overgeneralisation+Lacking ge prefix +sevald gevallen Overgeneralisation+prefix ge pronounced as se gevalde gevallene Overgeneralisation+ evalde gevallene Overgeneralisation+Prefix ge without onset -gevalt gevallen Overgeneralisation -evalt gevallen Overgeneralisation -valt gevallen Overgeneralisation +sevalde gevallene Overgeneralisation+prefix ge pronounced as se +gevalt gevallen Wrong Overgeneralisation +evalt gevallen Wrong Overgeneralisation+Prefix ge without onset +valt gevallen Wrong Overgeneralisation+Lacking ge prefix evallen gevallen Prefix ge without onset vallen gevallen Lacking ge prefix vangde ving Overgeneralisation vangden vingen Overgeneralisation vingde ving Irregular form plus regular suffix vingden vingen Irregular form plus regular suffix -gevangd gevangen Overgeneralisation +gevangd gevangen Wrong Overgeneralisation evangd gevangen Overgeneralisation+Prefix ge without onset vangd gevangen Overgeneralisation+Lacking ge prefix +sevangd gevangen Overgeneralisation+prefix ge pronounced as se gevangde gevangene Overgeneralisation+ evangde gevangene Overgeneralisation+Prefix ge without onset -gevangt gevangen Overgeneralisation -evangt gevangen Overgeneralisation -vangt gevangen Overgeneralisation +sevangde gevangene Overgeneralisation+prefix ge pronounced as se +gevangt gevangen Wrong Overgeneralisation +evangt gevangen Wrong Overgeneralisation+Prefix ge without onset +vangt gevangen Wrong Overgeneralisation+Lacking ge prefix evangen gevangen Prefix ge without onset vangen gevangen Lacking ge prefix vaarde voer Overgeneralisation vaarden voeren Overgeneralisation voerde voer Irregular form plus regular suffix voerden voeren Irregular form plus regular suffix -gevaard gevaren Overgeneralisation +gevaard gevaren Wrong Overgeneralisation evaard gevaren Overgeneralisation+Prefix ge without onset vaard gevaren Overgeneralisation+Lacking ge prefix +sevaard gevaren Overgeneralisation+prefix ge pronounced as se gevaarde gevarene Overgeneralisation+ evaarde gevarene Overgeneralisation+Prefix ge without onset -gevaart gevaren Overgeneralisation -evaart gevaren Overgeneralisation -vaart gevaren Overgeneralisation +sevaarde gevarene Overgeneralisation+prefix ge pronounced as se +gevaart gevaren Wrong Overgeneralisation +evaart gevaren Wrong Overgeneralisation+Prefix ge without onset +vaart gevaren Wrong Overgeneralisation+Lacking ge prefix evaren gevaren Prefix ge without onset varen gevaren Lacking ge prefix vechtte vocht Overgeneralisation vechtten vochten Overgeneralisation vochtte vocht Irregular form plus regular suffix vochtten vochten Irregular form plus regular suffix -gevecht gevochten Overgeneralisation -evecht gevochten Overgeneralisation -vecht gevochten Overgeneralisation +gevecht gevochten Overgeneralisation+ +evecht gevochten Overgeneralisation+Prefix ge without onset +vecht gevochten Overgeneralisation+Lacking ge prefix +sevecht gevochten Overgeneralisation+prefix ge pronounced as se gevechte gevochtene Overgeneralisation+ evechte gevochtene Overgeneralisation+Prefix ge without onset +sevechte gevochtene Overgeneralisation+prefix ge pronounced as se +gevechtd gevochten Wrong Overgeneralisation+ +evechtd gevochten Wrong Overgeneralisation+Prefix ge without onset +vechtd gevochten Wrong Overgeneralisation+Lacking ge prefix gevechten gevochten Wrong -en suffix evechten gevochten Wrong -en suffix vechten gevochten Wrong -en suffix -gevocht gevochten Overgeneralisation +gevocht gevochten Wrong Overgeneralisation +gevochtd gevochten Wrong Overgeneralisation evochten gevochten Prefix ge without onset vochten gevochten Lacking ge prefix verdriette verdroot Overgeneralisation @@ -2067,59 +2575,70 @@ verdrootte verdroot Irregular form plus regular suffix verdrootten verdroten Irregular form plus regular suffix verdriet verdroten Overgeneralisation verdriete verdrotene Overgeneralisation +verdrietd verdroten Wrong Overgeneralisation verdrieten verdroten Wrong -en suffix -verdroot verdroten Overgeneralisation +verdroot verdroten Wrong Overgeneralisation +verdrootd verdroten Wrong Overgeneralisation verdwijnde verdwenene Overgeneralisation verdwijnden verdwenen Overgeneralisation verdweende verdween Irregular form plus regular suffix verdweenden verdwenen Irregular form plus regular suffix verdwijnd verdwenen Overgeneralisation -verdwijnt verdwenen Overgeneralisation +verdwijnt verdwenen Wrong Overgeneralisation verdwijnen verdwenen Wrong -en suffix -verdweend verdwenen Overgeneralisation -verdweent verdwenen Overgeneralisation +verdweend verdwenen Wrong Overgeneralisation +verdweent verdwenen Wrong Overgeneralisation vergeette vergat Overgeneralisation vergeetten vergaten Overgeneralisation vergatte vergat Irregular form plus regular suffix vergatten vergaten Irregular form plus regular suffix -vergeet vergeten Overgeneralisation +vergeet vergeten Wrong Overgeneralisation vergete vergetene Overgeneralisation +vergeetd vergeten Wrong Overgeneralisation verliesde verlorene Overgeneralisation verliesden verloren Overgeneralisation verloorde verloor Irregular form plus regular suffix verloorden verloren Irregular form plus regular suffix verliesd verloren Overgeneralisation -verliest verloren Overgeneralisation +verliest verloren Wrong Overgeneralisation verliesen verloren Wrong -en suffix -verloort verloren Overgeneralisation +verloort verloren Wrong Overgeneralisation vindde vond Overgeneralisation vindden vonden Overgeneralisation vondde vond Irregular form plus regular suffix vondden vonden Irregular form plus regular suffix -gevind gevonden Overgeneralisation -evind gevonden Overgeneralisation -vind gevonden Overgeneralisation +gevind gevonden Wrong Overgeneralisation+ +evind gevonden Wrong Overgeneralisation+Prefix ge without onset +vind gevonden Wrong Overgeneralisation+Lacking ge prefix +sevind gevonden Overgeneralisation+prefix ge pronounced as se gevinde gevondene Overgeneralisation+ evinde gevondene Overgeneralisation+Prefix ge without onset +sevinde gevondene Overgeneralisation+prefix ge pronounced as se gevinden gevonden Wrong -en suffix evinden gevonden Wrong -en suffix vinden gevonden Wrong -en suffix -gevond gevonden Overgeneralisation +gevond gevonden Wrong Overgeneralisation evonden gevonden Prefix ge without onset vonden gevonden Lacking ge prefix vlechtte vlocht Overgeneralisation vlechtten vlochten Overgeneralisation vlochtte vlocht Irregular form plus regular suffix vlochtten vlochten Irregular form plus regular suffix -gevlecht gevlochten Overgeneralisation -evlecht gevlochten Overgeneralisation -vlecht gevlochten Overgeneralisation +gevlecht gevlochten Overgeneralisation+ +evlecht gevlochten Overgeneralisation+Prefix ge without onset +vlecht gevlochten Overgeneralisation+Lacking ge prefix +sevlecht gevlochten Overgeneralisation+prefix ge pronounced as se gevlechte gevlochtene Overgeneralisation+ evlechte gevlochtene Overgeneralisation+Prefix ge without onset +sevlechte gevlochtene Overgeneralisation+prefix ge pronounced as se +gevlechtd gevlochten Wrong Overgeneralisation+ +evlechtd gevlochten Wrong Overgeneralisation+Prefix ge without onset +vlechtd gevlochten Wrong Overgeneralisation+Lacking ge prefix gevlechten gevlochten Wrong -en suffix evlechten gevlochten Wrong -en suffix vlechten gevlochten Wrong -en suffix -gevlocht gevlochten Overgeneralisation +gevlocht gevlochten Wrong Overgeneralisation +gevlochtd gevlochten Wrong Overgeneralisation evlochten gevlochten Prefix ge without onset vlochten gevlochten Lacking ge prefix vliegde vloog Overgeneralisation @@ -2129,25 +2648,29 @@ vloogden vlogen Irregular form plus regular suffix gevliegd gevlogen Overgeneralisation+ evliegd gevlogen Overgeneralisation+Prefix ge without onset vliegd gevlogen Overgeneralisation+Lacking ge prefix +sevliegd gevlogen Overgeneralisation+prefix ge pronounced as se gevliegde gevlogene Overgeneralisation+ evliegde gevlogene Overgeneralisation+Prefix ge without onset -gevliegt gevlogen Overgeneralisation -evliegt gevlogen Overgeneralisation -vliegt gevlogen Overgeneralisation +sevliegde gevlogene Overgeneralisation+prefix ge pronounced as se +gevliegt gevlogen Wrong Overgeneralisation+ +evliegt gevlogen Wrong Overgeneralisation+Prefix ge without onset +vliegt gevlogen Wrong Overgeneralisation+Lacking ge prefix gevliegen gevlogen Wrong -en suffix evliegen gevlogen Wrong -en suffix vliegen gevlogen Wrong -en suffix -gevloogt gevlogen Overgeneralisation +gevloogt gevlogen Wrong Overgeneralisation evlogen gevlogen Prefix ge without onset vlogen gevlogen Lacking ge prefix -gevouwd gevouwen Overgeneralisation +gevouwd gevouwen Wrong Overgeneralisation evouwd gevouwen Overgeneralisation+Prefix ge without onset vouwd gevouwen Overgeneralisation+Lacking ge prefix +sevouwd gevouwen Overgeneralisation+prefix ge pronounced as se gevouwde gevouwene Overgeneralisation+ evouwde gevouwene Overgeneralisation+Prefix ge without onset -gevouwt gevouwen Overgeneralisation -evouwt gevouwen Overgeneralisation -vouwt gevouwen Overgeneralisation +sevouwde gevouwene Overgeneralisation+prefix ge pronounced as se +gevouwt gevouwen Wrong Overgeneralisation +evouwt gevouwen Wrong Overgeneralisation+Prefix ge without onset +vouwt gevouwen Wrong Overgeneralisation+Lacking ge prefix evouwen gevouwen Prefix ge without onset vouwen gevouwen Lacking ge prefix vraagde vroeg Overgeneralisation @@ -2156,10 +2679,12 @@ vroegde vroeg Irregular form plus regular suffix vroegden vroegen Irregular form plus regular suffix evraagd gevraagd Prefix ge without onset vraagd gevraagd Lacking ge prefix +sevraagd gevraagd Overgeneralisation+prefix ge pronounced as se evraagde gevraagde Overgeneralisation+Prefix ge without onset -gevraagt gevraagd Overgeneralisation -evraagt gevraagd Overgeneralisation -vraagt gevraagd Overgeneralisation +sevraagde gevraagde Overgeneralisation+prefix ge pronounced as se +gevraagt gevraagd Wrong Overgeneralisation+ +evraagt gevraagd Wrong Overgeneralisation+Prefix ge without onset +vraagt gevraagd Wrong Overgeneralisation+Lacking ge prefix gevragen gevraagd Wrong -en suffix evragen gevraagd Wrong -en suffix vragen gevraagd Wrong -en suffix @@ -2167,11 +2692,16 @@ vreette vrat Overgeneralisation vreetten vraten Overgeneralisation vratte vrat Irregular form plus regular suffix vratten vraten Irregular form plus regular suffix -gevreet gevreten Overgeneralisation -evreet gevreten Overgeneralisation -vreet gevreten Overgeneralisation +gevreet gevreten Wrong Overgeneralisation +evreet gevreten Overgeneralisation+Prefix ge without onset +vreet gevreten Overgeneralisation+Lacking ge prefix +sevreet gevreten Overgeneralisation+prefix ge pronounced as se gevrete gevretene Overgeneralisation+ evrete gevretene Overgeneralisation+Prefix ge without onset +sevrete gevretene Overgeneralisation+prefix ge pronounced as se +gevreetd gevreten Wrong Overgeneralisation +evreetd gevreten Wrong Overgeneralisation+Prefix ge without onset +vreetd gevreten Wrong Overgeneralisation+Lacking ge prefix evreten gevreten Prefix ge without onset vreten gevreten Lacking ge prefix vriesde vroor Overgeneralisation @@ -2181,15 +2711,17 @@ vroorden vroren Irregular form plus regular suffix gevriesd gevroren Overgeneralisation+ evriesd gevroren Overgeneralisation+Prefix ge without onset vriesd gevroren Overgeneralisation+Lacking ge prefix +sevriesd gevroren Overgeneralisation+prefix ge pronounced as se gevriesde gevrorene Overgeneralisation+ evriesde gevrorene Overgeneralisation+Prefix ge without onset -gevriest gevroren Overgeneralisation -evriest gevroren Overgeneralisation -vriest gevroren Overgeneralisation +sevriesde gevrorene Overgeneralisation+prefix ge pronounced as se +gevriest gevroren Wrong Overgeneralisation+ +evriest gevroren Wrong Overgeneralisation+Prefix ge without onset +vriest gevroren Wrong Overgeneralisation+Lacking ge prefix gevriesen gevroren Wrong -en suffix evriesen gevroren Wrong -en suffix vriesen gevroren Wrong -en suffix -gevroort gevroren Overgeneralisation +gevroort gevroren Wrong Overgeneralisation evroren gevroren Prefix ge without onset vroren gevroren Lacking ge prefix vriijde vrijde Overgeneralisation @@ -2197,21 +2729,28 @@ vriijden vrijden Overgeneralisation gevriijd gevrijd Overgeneralisation+ evriijd gevrijd Overgeneralisation+Prefix ge without onset vriijd gevrijd Overgeneralisation+Lacking ge prefix +sevriijd gevrijd Overgeneralisation+prefix ge pronounced as se gevriijde gevrijde Overgeneralisation+ evriijde gevrijde Overgeneralisation+Prefix ge without onset -gevriijt gevrijd Overgeneralisation -evriijt gevrijd Overgeneralisation -vriijt gevrijd Overgeneralisation +sevriijde gevrijde Overgeneralisation+prefix ge pronounced as se +gevriijt gevrijd Wrong Overgeneralisation+ +evriijt gevrijd Wrong Overgeneralisation+Prefix ge without onset +vriijt gevrijd Wrong Overgeneralisation+Lacking ge prefix gevrijen gevrijd Wrong -en suffix evrijen gevrijd Wrong -en suffix vrijen gevrijd Wrong -en suffix evrijd gevrijd Prefix ge without onset vrijd gevrijd Lacking ge prefix -gewast gewassen Overgeneralisation -ewast gewassen Overgeneralisation -wast gewassen Overgeneralisation +gewast gewassen Wrong Overgeneralisation +ewast gewassen Overgeneralisation+Prefix ge without onset +wast gewassen Overgeneralisation+Lacking ge prefix +sewast gewassen Overgeneralisation+prefix ge pronounced as se gewaste gewassene Overgeneralisation+ ewaste gewassene Overgeneralisation+Prefix ge without onset +sewaste gewassene Overgeneralisation+prefix ge pronounced as se +gewasd gewassen Wrong Overgeneralisation +ewasd gewassen Wrong Overgeneralisation+Prefix ge without onset +wasd gewassen Wrong Overgeneralisation+Lacking ge prefix ewassen gewassen Prefix ge without onset wassen gewassen Lacking ge prefix weegde woog Overgeneralisation @@ -2221,30 +2760,38 @@ woogden wogen Irregular form plus regular suffix geweegd gewogen Overgeneralisation+ eweegd gewogen Overgeneralisation+Prefix ge without onset weegd gewogen Overgeneralisation+Lacking ge prefix +seweegd gewogen Overgeneralisation+prefix ge pronounced as se geweegde gewogene Overgeneralisation+ eweegde gewogene Overgeneralisation+Prefix ge without onset -geweegt gewogen Overgeneralisation -eweegt gewogen Overgeneralisation -weegt gewogen Overgeneralisation +seweegde gewogene Overgeneralisation+prefix ge pronounced as se +geweegt gewogen Wrong Overgeneralisation+ +eweegt gewogen Wrong Overgeneralisation+Prefix ge without onset +weegt gewogen Wrong Overgeneralisation+Lacking ge prefix gewegen gewogen Wrong -en suffix ewegen gewogen Wrong -en suffix wegen gewogen Wrong -en suffix -gewoogt gewogen Overgeneralisation +gewoogt gewogen Wrong Overgeneralisation ewogen gewogen Prefix ge without onset wogen gewogen Lacking ge prefix werpte wierp Overgeneralisation werpten wierpen Overgeneralisation wierpte wierp Irregular form plus regular suffix wierpten wierpen Irregular form plus regular suffix -gewerpt geworpen Overgeneralisation -ewerpt geworpen Overgeneralisation -werpt geworpen Overgeneralisation +gewerpt geworpen Overgeneralisation+ +ewerpt geworpen Overgeneralisation+Prefix ge without onset +werpt geworpen Overgeneralisation+Lacking ge prefix +sewerpt geworpen Overgeneralisation+prefix ge pronounced as se gewerpte geworpene Overgeneralisation+ ewerpte geworpene Overgeneralisation+Prefix ge without onset +sewerpte geworpene Overgeneralisation+prefix ge pronounced as se +gewerpd geworpen Wrong Overgeneralisation+ +ewerpd geworpen Wrong Overgeneralisation+Prefix ge without onset +werpd geworpen Wrong Overgeneralisation+Lacking ge prefix gewerpen geworpen Wrong -en suffix ewerpen geworpen Wrong -en suffix werpen geworpen Wrong -en suffix -geworpt geworpen Overgeneralisation +geworpt geworpen Wrong Overgeneralisation +geworpd geworpen Wrong Overgeneralisation eworpen geworpen Prefix ge without onset worpen geworpen Lacking ge prefix werfde wierf Overgeneralisation @@ -2254,37 +2801,46 @@ wierfden wierven Irregular form plus regular suffix gewerfd geworven Overgeneralisation+ ewerfd geworven Overgeneralisation+Prefix ge without onset werfd geworven Overgeneralisation+Lacking ge prefix +sewerfd geworven Overgeneralisation+prefix ge pronounced as se gewerfde geworvene Overgeneralisation+ ewerfde geworvene Overgeneralisation+Prefix ge without onset -gewerft geworven Overgeneralisation -ewerft geworven Overgeneralisation -werft geworven Overgeneralisation +sewerfde geworvene Overgeneralisation+prefix ge pronounced as se +gewerft geworven Wrong Overgeneralisation+ +ewerft geworven Wrong Overgeneralisation+Prefix ge without onset +werft geworven Wrong Overgeneralisation+Lacking ge prefix gewerfen geworven Wrong -en suffix ewerfen geworven Wrong -en suffix werfen geworven Wrong -en suffix -geworfd geworven Overgeneralisation -geworft geworven Overgeneralisation +geworfd geworven Wrong Overgeneralisation +geworft geworven Wrong Overgeneralisation eworven geworven Prefix ge without onset worven geworven Lacking ge prefix weette weet Irregular form plus regular suffix weetten weten Irregular form plus regular suffix wistte wist Irregular form plus regular suffix wistten wisten Irregular form plus regular suffix -geweet geweten Overgeneralisation -eweet geweten Overgeneralisation -weet geweten Overgeneralisation +geweet geweten Wrong Overgeneralisation +eweet geweten Overgeneralisation+Prefix ge without onset +weet geweten Overgeneralisation+Lacking ge prefix +seweet geweten Overgeneralisation+prefix ge pronounced as se gewete gewetene Overgeneralisation+ ewete gewetene Overgeneralisation+Prefix ge without onset +sewete gewetene Overgeneralisation+prefix ge pronounced as se +geweetd geweten Wrong Overgeneralisation +eweetd geweten Wrong Overgeneralisation+Prefix ge without onset +weetd geweten Wrong Overgeneralisation+Lacking ge prefix eweten geweten Prefix ge without onset weten geweten Lacking ge prefix -geweefd geweven Overgeneralisation +geweefd geweven Wrong Overgeneralisation eweefd geweven Overgeneralisation+Prefix ge without onset weefd geweven Overgeneralisation+Lacking ge prefix +seweefd geweven Overgeneralisation+prefix ge pronounced as se geweefde gewevene Overgeneralisation+ eweefde gewevene Overgeneralisation+Prefix ge without onset -geweeft geweven Overgeneralisation -eweeft geweven Overgeneralisation -weeft geweven Overgeneralisation +seweefde gewevene Overgeneralisation+prefix ge pronounced as se +geweeft geweven Wrong Overgeneralisation +eweeft geweven Wrong Overgeneralisation+Prefix ge without onset +weeft geweven Wrong Overgeneralisation+Lacking ge prefix gewefen geweven Wrong -en suffix ewefen geweven Wrong -en suffix wefen geweven Wrong -en suffix @@ -2294,24 +2850,35 @@ wijkte week Overgeneralisation wijkten weken Overgeneralisation weekte week Irregular form plus regular suffix weekten weken Irregular form plus regular suffix -gewijkt geweken Overgeneralisation -ewijkt geweken Overgeneralisation -wijkt geweken Overgeneralisation +gewijkt geweken Overgeneralisation+ +ewijkt geweken Overgeneralisation+Prefix ge without onset +wijkt geweken Overgeneralisation+Lacking ge prefix +sewijkt geweken Overgeneralisation+prefix ge pronounced as se gewijkte gewekene Overgeneralisation+ ewijkte gewekene Overgeneralisation+Prefix ge without onset +sewijkte gewekene Overgeneralisation+prefix ge pronounced as se +gewijkd geweken Wrong Overgeneralisation+ +ewijkd geweken Wrong Overgeneralisation+Prefix ge without onset +wijkd geweken Wrong Overgeneralisation+Lacking ge prefix gewijken geweken Wrong -en suffix ewijken geweken Wrong -en suffix wijken geweken Wrong -en suffix -geweekt geweken Overgeneralisation +geweekt geweken Wrong Overgeneralisation +geweekd geweken Wrong Overgeneralisation eweken geweken Prefix ge without onset weken geweken Lacking ge prefix wijtte weet Overgeneralisation wijtten weten Overgeneralisation -gewijt geweten Overgeneralisation -ewijt geweten Overgeneralisation -wijt geweten Overgeneralisation +gewijt geweten Overgeneralisation+ +ewijt geweten Overgeneralisation+Prefix ge without onset +wijt geweten Overgeneralisation+Lacking ge prefix +sewijt geweten Overgeneralisation+prefix ge pronounced as se gewijte gewetene Overgeneralisation+ ewijte gewetene Overgeneralisation+Prefix ge without onset +sewijte gewetene Overgeneralisation+prefix ge pronounced as se +gewijtd geweten Wrong Overgeneralisation+ +ewijtd geweten Wrong Overgeneralisation+Prefix ge without onset +wijtd geweten Wrong Overgeneralisation+Lacking ge prefix gewijten geweten Wrong -en suffix ewijten geweten Wrong -en suffix wijten geweten Wrong -en suffix @@ -2322,16 +2889,18 @@ weesden wezen Irregular form plus regular suffix gewijsd gewezen Overgeneralisation+ ewijsd gewezen Overgeneralisation+Prefix ge without onset wijsd gewezen Overgeneralisation+Lacking ge prefix +sewijsd gewezen Overgeneralisation+prefix ge pronounced as se gewijsde gewezene Overgeneralisation+ ewijsde gewezene Overgeneralisation+Prefix ge without onset -gewijst gewezen Overgeneralisation -ewijst gewezen Overgeneralisation -wijst gewezen Overgeneralisation +sewijsde gewezene Overgeneralisation+prefix ge pronounced as se +gewijst gewezen Wrong Overgeneralisation+ +ewijst gewezen Wrong Overgeneralisation+Prefix ge without onset +wijst gewezen Wrong Overgeneralisation+Lacking ge prefix gewijsen gewezen Wrong -en suffix ewijsen gewezen Wrong -en suffix wijsen gewezen Wrong -en suffix -geweesd gewezen Overgeneralisation -geweest gewezen Overgeneralisation +geweesd gewezen Wrong Overgeneralisation +geweest gewezen Wrong Overgeneralisation ewezen gewezen Prefix ge without onset wezen gewezen Lacking ge prefix windde wond Overgeneralisation @@ -2341,34 +2910,38 @@ wondden wonden Irregular form plus regular suffix gewind gewonnen Overgeneralisation+ ewind gewonnen Overgeneralisation+Prefix ge without onset wind gewonnen Overgeneralisation+Lacking ge prefix +sewind gewonnen Overgeneralisation+prefix ge pronounced as se gewinde gewonnene Overgeneralisation+ ewinde gewonnene Overgeneralisation+Prefix ge without onset +sewinde gewonnene Overgeneralisation+prefix ge pronounced as se gewinden gewonden Wrong -en suffix ewinden gewonden Wrong -en suffix winden wonnen Overgeneralisation -gewond gewonden Overgeneralisation +gewond gewonden Wrong Overgeneralisation ewonden gewonden Prefix ge without onset wonden wonnen Irregular form plus regular suffix winde won Overgeneralisation wonde won Irregular form plus regular suffix -gewint gewonnen Overgeneralisation -ewint gewonnen Overgeneralisation -wint gewonnen Overgeneralisation +gewint gewonnen Wrong Overgeneralisation+ +ewint gewonnen Wrong Overgeneralisation+Prefix ge without onset +wint gewonnen Wrong Overgeneralisation+Lacking ge prefix gewinnen gewonnen Wrong -en suffix ewinnen gewonnen Wrong -en suffix winnen gewonnen Wrong -en suffix -gewont gewonnen Overgeneralisation +gewont gewonnen Wrong Overgeneralisation ewonnen gewonnen Prefix ge without onset wonnen gewonnen Lacking ge prefix wordde werd Overgeneralisation wordden werden Overgeneralisation werdde werd Irregular form plus regular suffix werdden werden Irregular form plus regular suffix -geword geworden Overgeneralisation -eword geworden Overgeneralisation -word geworden Overgeneralisation +geword geworden Wrong Overgeneralisation +eword geworden Wrong Overgeneralisation+Prefix ge without onset +word geworden Wrong Overgeneralisation+Lacking ge prefix +seword geworden Overgeneralisation+prefix ge pronounced as se geworde gewordene Overgeneralisation+ eworde gewordene Overgeneralisation+Prefix ge without onset +seworde gewordene Overgeneralisation+prefix ge pronounced as se eworden geworden Prefix ge without onset worden geworden Lacking ge prefix wrijfde wreef Overgeneralisation @@ -2378,16 +2951,18 @@ wreefden wreven Irregular form plus regular suffix gewrijfd gewreven Overgeneralisation+ ewrijfd gewreven Overgeneralisation+Prefix ge without onset wrijfd gewreven Overgeneralisation+Lacking ge prefix +sewrijfd gewreven Overgeneralisation+prefix ge pronounced as se gewrijfde gewrevene Overgeneralisation+ ewrijfde gewrevene Overgeneralisation+Prefix ge without onset -gewrijft gewreven Overgeneralisation -ewrijft gewreven Overgeneralisation -wrijft gewreven Overgeneralisation +sewrijfde gewrevene Overgeneralisation+prefix ge pronounced as se +gewrijft gewreven Wrong Overgeneralisation+ +ewrijft gewreven Wrong Overgeneralisation+Prefix ge without onset +wrijft gewreven Wrong Overgeneralisation+Lacking ge prefix gewrijfen gewreven Wrong -en suffix ewrijfen gewreven Wrong -en suffix wrijfen gewreven Wrong -en suffix -gewreefd gewreven Overgeneralisation -gewreeft gewreven Overgeneralisation +gewreefd gewreven Wrong Overgeneralisation +gewreeft gewreven Wrong Overgeneralisation ewreven gewreven Prefix ge without onset wreven gewreven Lacking ge prefix wringde wrong Overgeneralisation @@ -2397,16 +2972,18 @@ wrongden wrongen Irregular form plus regular suffix gewringd gewrongen Overgeneralisation+ ewringd gewrongen Overgeneralisation+Prefix ge without onset wringd gewrongen Overgeneralisation+Lacking ge prefix +sewringd gewrongen Overgeneralisation+prefix ge pronounced as se gewringde gewrongene Overgeneralisation+ ewringde gewrongene Overgeneralisation+Prefix ge without onset -gewringt gewrongen Overgeneralisation -ewringt gewrongen Overgeneralisation -wringt gewrongen Overgeneralisation +sewringde gewrongene Overgeneralisation+prefix ge pronounced as se +gewringt gewrongen Wrong Overgeneralisation+ +ewringt gewrongen Wrong Overgeneralisation+Prefix ge without onset +wringt gewrongen Wrong Overgeneralisation+Lacking ge prefix gewringen gewrongen Wrong -en suffix ewringen gewrongen Wrong -en suffix wringen gewrongen Wrong -en suffix -gewrongd gewrongen Overgeneralisation -gewrongt gewrongen Overgeneralisation +gewrongd gewrongen Wrong Overgeneralisation +gewrongt gewrongen Wrong Overgeneralisation ewrongen gewrongen Prefix ge without onset wrongen gewrongen Lacking ge prefix zegde zei Overgeneralisation @@ -2414,10 +2991,12 @@ zegden zeiden Overgeneralisation zeide zei Irregular form plus regular suffix ezegd gezegd Prefix ge without onset zegd gezegd Lacking ge prefix +sezegd gezegd Overgeneralisation+prefix ge pronounced as se ezegde gezegde Overgeneralisation+Prefix ge without onset -gezegt gezegd Overgeneralisation -ezegt gezegd Overgeneralisation -zegt gezegd Overgeneralisation +sezegde gezegde Overgeneralisation+prefix ge pronounced as se +gezegt gezegd Wrong Overgeneralisation+ +ezegt gezegd Wrong Overgeneralisation+Prefix ge without onset +zegt gezegd Wrong Overgeneralisation+Lacking ge prefix gezeggen gezegd Wrong -en suffix ezeggen gezegd Wrong -en suffix zeggen gezegd Wrong -en suffix @@ -2425,15 +3004,17 @@ zendde zond Overgeneralisation zendden zonden Overgeneralisation zondde zond Irregular form plus regular suffix zondden zonden Irregular form plus regular suffix -gezend gezonden Overgeneralisation -ezend gezonden Overgeneralisation -zend gezonden Overgeneralisation +gezend gezonden Wrong Overgeneralisation+ +ezend gezonden Wrong Overgeneralisation+Prefix ge without onset +zend gezonden Wrong Overgeneralisation+Lacking ge prefix +sezend gezonden Overgeneralisation+prefix ge pronounced as se gezende gezondene Overgeneralisation+ ezende gezondene Overgeneralisation+Prefix ge without onset +sezende gezondene Overgeneralisation+prefix ge pronounced as se gezenden gezonden Wrong -en suffix ezenden gezonden Wrong -en suffix zenden gezonden Wrong -en suffix -gezond gezonden Overgeneralisation +gezond gezonden Wrong Overgeneralisation ezonden gezonden Prefix ge without onset zonden zonnen Irregular form plus regular suffix zijgde zeeg Overgeneralisation @@ -2443,16 +3024,18 @@ zeegden zegen Irregular form plus regular suffix gezijgd gezegen Overgeneralisation+ ezijgd gezegen Overgeneralisation+Prefix ge without onset zijgd gezegen Overgeneralisation+Lacking ge prefix +sezijgd gezegen Overgeneralisation+prefix ge pronounced as se gezijgde gezegene Overgeneralisation+ ezijgde gezegene Overgeneralisation+Prefix ge without onset -gezijgt gezegen Overgeneralisation -ezijgt gezegen Overgeneralisation -zijgt gezegen Overgeneralisation +sezijgde gezegene Overgeneralisation+prefix ge pronounced as se +gezijgt gezegen Wrong Overgeneralisation+ +ezijgt gezegen Wrong Overgeneralisation+Prefix ge without onset +zijgt gezegen Wrong Overgeneralisation+Lacking ge prefix gezijgen gezegen Wrong -en suffix ezijgen gezegen Wrong -en suffix zijgen gezegen Wrong -en suffix -gezeegd gezegen Overgeneralisation -gezeegt gezegen Overgeneralisation +gezeegd gezegen Wrong Overgeneralisation +gezeegt gezegen Wrong Overgeneralisation ezegen gezegen Prefix ge without onset zegen gezegen Lacking ge prefix zijde was Overgeneralisation @@ -2462,11 +3045,13 @@ wasden waren Irregular form plus regular suffix gezijd geweest Overgeneralisation+ ezijd geweest Overgeneralisation+Prefix ge without onset zijd geweest Overgeneralisation+Lacking ge prefix +sezijd geweest Overgeneralisation+prefix ge pronounced as se gezijde geweeste Overgeneralisation+ ezijde geweeste Overgeneralisation+Prefix ge without onset -gezijt geweest Overgeneralisation -ezijt geweest Overgeneralisation -zijt geweest Overgeneralisation +sezijde geweeste Overgeneralisation+prefix ge pronounced as se +gezijt geweest Wrong Overgeneralisation+ +ezijt geweest Wrong Overgeneralisation+Prefix ge without onset +zijt geweest Wrong Overgeneralisation+Lacking ge prefix gezijjen geweest Wrong -en suffix ezijjen geweest Wrong -en suffix zijjen geweest Wrong -en suffix @@ -2479,31 +3064,39 @@ zongden zongen Irregular form plus regular suffix gezingd gezongen Overgeneralisation+ ezingd gezongen Overgeneralisation+Prefix ge without onset zingd gezongen Overgeneralisation+Lacking ge prefix +sezingd gezongen Overgeneralisation+prefix ge pronounced as se gezingde gezongene Overgeneralisation+ ezingde gezongene Overgeneralisation+Prefix ge without onset -gezingt gezongen Overgeneralisation -ezingt gezongen Overgeneralisation -zingt gezongen Overgeneralisation +sezingde gezongene Overgeneralisation+prefix ge pronounced as se +gezingt gezongen Wrong Overgeneralisation+ +ezingt gezongen Wrong Overgeneralisation+Prefix ge without onset +zingt gezongen Wrong Overgeneralisation+Lacking ge prefix gezingen gezongen Wrong -en suffix ezingen gezongen Wrong -en suffix zingen gezongen Wrong -en suffix -gezongd gezongen Overgeneralisation -gezongt gezongen Overgeneralisation +gezongd gezongen Wrong Overgeneralisation +gezongt gezongen Wrong Overgeneralisation ezongen gezongen Prefix ge without onset zongen gezongen Lacking ge prefix zinkte zonk Overgeneralisation zinkten zonken Overgeneralisation zonkte zonk Irregular form plus regular suffix zonkten zonken Irregular form plus regular suffix -gezinkt gezonken Overgeneralisation -ezinkt gezonken Overgeneralisation -zinkt gezonken Overgeneralisation +gezinkt gezonken Overgeneralisation+ +ezinkt gezonken Overgeneralisation+Prefix ge without onset +zinkt gezonken Overgeneralisation+Lacking ge prefix +sezinkt gezonken Overgeneralisation+prefix ge pronounced as se gezinkte gezonkene Overgeneralisation+ ezinkte gezonkene Overgeneralisation+Prefix ge without onset +sezinkte gezonkene Overgeneralisation+prefix ge pronounced as se +gezinkd gezonken Wrong Overgeneralisation+ +ezinkd gezonken Wrong Overgeneralisation+Prefix ge without onset +zinkd gezonken Wrong Overgeneralisation+Lacking ge prefix gezinken gezonken Wrong -en suffix ezinken gezonken Wrong -en suffix zinken gezonken Wrong -en suffix -gezonkt gezonken Overgeneralisation +gezonkt gezonken Wrong Overgeneralisation +gezonkd gezonken Wrong Overgeneralisation ezonken gezonken Prefix ge without onset zonken gezonken Lacking ge prefix zinde zon Overgeneralisation @@ -2512,40 +3105,53 @@ zonde zon Irregular form plus regular suffix gezind gezonnen Overgeneralisation+ ezind gezonnen Overgeneralisation+Prefix ge without onset zind gezonnen Overgeneralisation+Lacking ge prefix +sezind gezonnen Overgeneralisation+prefix ge pronounced as se gezinde gezonnene Overgeneralisation+ ezinde gezonnene Overgeneralisation+Prefix ge without onset -gezint gezonnen Overgeneralisation -ezint gezonnen Overgeneralisation -zint gezonnen Overgeneralisation +sezinde gezonnene Overgeneralisation+prefix ge pronounced as se +gezint gezonnen Wrong Overgeneralisation+ +ezint gezonnen Wrong Overgeneralisation+Prefix ge without onset +zint gezonnen Wrong Overgeneralisation+Lacking ge prefix gezinnen gezonnen Wrong -en suffix ezinnen gezonnen Wrong -en suffix zinnen gezonnen Wrong -en suffix -gezont gezonnen Overgeneralisation +gezont gezonnen Wrong Overgeneralisation ezonnen gezonnen Prefix ge without onset zonnen gezonnen Lacking ge prefix zitte zat Overgeneralisation zitten gezeten Wrong -en suffix zatte zat Irregular form plus regular suffix zatten zaten Irregular form plus regular suffix -gezit gezeten Overgeneralisation -ezit gezeten Overgeneralisation -zit gezeten Overgeneralisation +gezit gezeten Overgeneralisation+ +ezit gezeten Overgeneralisation+Prefix ge without onset +zit gezeten Overgeneralisation+Lacking ge prefix +sezit gezeten Overgeneralisation+prefix ge pronounced as se gezitte gezetene Overgeneralisation+ ezitte gezetene Overgeneralisation+Prefix ge without onset +sezitte gezetene Overgeneralisation+prefix ge pronounced as se +gezitd gezeten Wrong Overgeneralisation+ +ezitd gezeten Wrong Overgeneralisation+Prefix ge without onset +zitd gezeten Wrong Overgeneralisation+Lacking ge prefix gezitten gezeten Wrong -en suffix ezitten gezeten Wrong -en suffix -gezeet gezeten Overgeneralisation +gezeet gezeten Wrong Overgeneralisation +gezeetd gezeten Wrong Overgeneralisation ezeten gezeten Prefix ge without onset zeten gezeten Lacking ge prefix zoekte zocht Overgeneralisation zoekten zochten Overgeneralisation zochtte zocht Irregular form plus regular suffix zochtten zochten Irregular form plus regular suffix -gezoekt gezocht Overgeneralisation -ezoekt gezocht Overgeneralisation -zoekt gezocht Overgeneralisation +gezoekt gezocht Overgeneralisation+ +ezoekt gezocht Overgeneralisation+Prefix ge without onset +zoekt gezocht Overgeneralisation+Lacking ge prefix +sezoekt gezocht Overgeneralisation+prefix ge pronounced as se gezoekte gezochte Overgeneralisation+ ezoekte gezochte Overgeneralisation+Prefix ge without onset +sezoekte gezochte Overgeneralisation+prefix ge pronounced as se +gezoekd gezocht Wrong Overgeneralisation+ +ezoekd gezocht Wrong Overgeneralisation+Prefix ge without onset +zoekd gezocht Wrong Overgeneralisation+Lacking ge prefix gezoeken gezocht Wrong -en suffix ezoeken gezocht Wrong -en suffix zoeken gezocht Wrong -en suffix @@ -2558,30 +3164,38 @@ zoogden zogen Irregular form plus regular suffix gezuigd gezogen Overgeneralisation+ ezuigd gezogen Overgeneralisation+Prefix ge without onset zuigd gezogen Overgeneralisation+Lacking ge prefix +sezuigd gezogen Overgeneralisation+prefix ge pronounced as se gezuigde gezogene Overgeneralisation+ ezuigde gezogene Overgeneralisation+Prefix ge without onset -gezuigt gezogen Overgeneralisation -ezuigt gezogen Overgeneralisation -zuigt gezogen Overgeneralisation +sezuigde gezogene Overgeneralisation+prefix ge pronounced as se +gezuigt gezogen Wrong Overgeneralisation+ +ezuigt gezogen Wrong Overgeneralisation+Prefix ge without onset +zuigt gezogen Wrong Overgeneralisation+Lacking ge prefix gezuigen gezogen Wrong -en suffix ezuigen gezogen Wrong -en suffix zuigen gezogen Wrong -en suffix -gezoogt gezogen Overgeneralisation +gezoogt gezogen Wrong Overgeneralisation ezogen gezogen Prefix ge without onset zogen gezogen Lacking ge prefix zuipte zoop Overgeneralisation zuipten zopen Overgeneralisation zoopte zoop Irregular form plus regular suffix zoopten zopen Irregular form plus regular suffix -gezuipt gezopen Overgeneralisation -ezuipt gezopen Overgeneralisation -zuipt gezopen Overgeneralisation +gezuipt gezopen Overgeneralisation+ +ezuipt gezopen Overgeneralisation+Prefix ge without onset +zuipt gezopen Overgeneralisation+Lacking ge prefix +sezuipt gezopen Overgeneralisation+prefix ge pronounced as se gezuipte gezopene Overgeneralisation+ ezuipte gezopene Overgeneralisation+Prefix ge without onset +sezuipte gezopene Overgeneralisation+prefix ge pronounced as se +gezuipd gezopen Wrong Overgeneralisation+ +ezuipd gezopen Wrong Overgeneralisation+Prefix ge without onset +zuipd gezopen Wrong Overgeneralisation+Lacking ge prefix gezuipen gezopen Wrong -en suffix ezuipen gezopen Wrong -en suffix zuipen gezopen Wrong -en suffix -gezoopt gezopen Overgeneralisation +gezoopt gezopen Wrong Overgeneralisation +gezoopd gezopen Wrong Overgeneralisation ezopen gezopen Prefix ge without onset zopen gezopen Lacking ge prefix zwelgde zwolg Overgeneralisation @@ -2591,16 +3205,18 @@ zwolgden zwolgen Irregular form plus regular suffix gezwelgd gezwolgen Overgeneralisation+ ezwelgd gezwolgen Overgeneralisation+Prefix ge without onset zwelgd gezwolgen Overgeneralisation+Lacking ge prefix +sezwelgd gezwolgen Overgeneralisation+prefix ge pronounced as se gezwelgde gezwolgene Overgeneralisation+ ezwelgde gezwolgene Overgeneralisation+Prefix ge without onset -gezwelgt gezwolgen Overgeneralisation -ezwelgt gezwolgen Overgeneralisation -zwelgt gezwolgen Overgeneralisation +sezwelgde gezwolgene Overgeneralisation+prefix ge pronounced as se +gezwelgt gezwolgen Wrong Overgeneralisation+ +ezwelgt gezwolgen Wrong Overgeneralisation+Prefix ge without onset +zwelgt gezwolgen Wrong Overgeneralisation+Lacking ge prefix gezwelgen gezwolgen Wrong -en suffix ezwelgen gezwolgen Wrong -en suffix zwelgen gezwolgen Wrong -en suffix -gezwolgd gezwolgen Overgeneralisation -gezwolgt gezwolgen Overgeneralisation +gezwolgd gezwolgen Wrong Overgeneralisation +gezwolgt gezwolgen Wrong Overgeneralisation ezwolgen gezwolgen Prefix ge without onset zwolgen gezwolgen Lacking ge prefix zwelde zwol Overgeneralisation @@ -2610,15 +3226,17 @@ zwolden zwollen Irregular form plus regular suffix gezweld gezwollen Overgeneralisation+ ezweld gezwollen Overgeneralisation+Prefix ge without onset zweld gezwollen Overgeneralisation+Lacking ge prefix +sezweld gezwollen Overgeneralisation+prefix ge pronounced as se gezwelde gezwollene Overgeneralisation+ ezwelde gezwollene Overgeneralisation+Prefix ge without onset -gezwelt gezwollen Overgeneralisation -ezwelt gezwollen Overgeneralisation -zwelt gezwollen Overgeneralisation +sezwelde gezwollene Overgeneralisation+prefix ge pronounced as se +gezwelt gezwollen Wrong Overgeneralisation+ +ezwelt gezwollen Wrong Overgeneralisation+Prefix ge without onset +zwelt gezwollen Wrong Overgeneralisation+Lacking ge prefix gezwellen gezwollen Wrong -en suffix ezwellen gezwollen Wrong -en suffix zwellen gezwollen Wrong -en suffix -gezwolt gezwollen Overgeneralisation +gezwolt gezwollen Wrong Overgeneralisation ezwollen gezwollen Prefix ge without onset zwollen gezwollen Lacking ge prefix zwemde zwom Overgeneralisation @@ -2628,15 +3246,17 @@ zwomden zwommen Irregular form plus regular suffix gezwemd gezwommen Overgeneralisation+ ezwemd gezwommen Overgeneralisation+Prefix ge without onset zwemd gezwommen Overgeneralisation+Lacking ge prefix +sezwemd gezwommen Overgeneralisation+prefix ge pronounced as se gezwemde gezwommene Overgeneralisation+ ezwemde gezwommene Overgeneralisation+Prefix ge without onset -gezwemt gezwommen Overgeneralisation -ezwemt gezwommen Overgeneralisation -zwemt gezwommen Overgeneralisation +sezwemde gezwommene Overgeneralisation+prefix ge pronounced as se +gezwemt gezwommen Wrong Overgeneralisation+ +ezwemt gezwommen Wrong Overgeneralisation+Prefix ge without onset +zwemt gezwommen Wrong Overgeneralisation+Lacking ge prefix gezwemmen gezwommen Wrong -en suffix ezwemmen gezwommen Wrong -en suffix zwemmen gezwommen Wrong -en suffix -gezwomt gezwommen Overgeneralisation +gezwomt gezwommen Wrong Overgeneralisation ezwommen gezwommen Prefix ge without onset zwommen gezwommen Lacking ge prefix zweerde zwoer Overgeneralisation @@ -2646,15 +3266,17 @@ zwoerden zwoeren Irregular form plus regular suffix gezweerd gezworen Overgeneralisation+ ezweerd gezworen Overgeneralisation+Prefix ge without onset zweerd gezworen Overgeneralisation+Lacking ge prefix +sezweerd gezworen Overgeneralisation+prefix ge pronounced as se gezweerde gezworene Overgeneralisation+ ezweerde gezworene Overgeneralisation+Prefix ge without onset -gezweert gezworen Overgeneralisation -ezweert gezworen Overgeneralisation -zweert gezworen Overgeneralisation +sezweerde gezworene Overgeneralisation+prefix ge pronounced as se +gezweert gezworen Wrong Overgeneralisation+ +ezweert gezworen Wrong Overgeneralisation+Prefix ge without onset +zweert gezworen Wrong Overgeneralisation+Lacking ge prefix gezweren gezworen Wrong -en suffix ezweren gezworen Wrong -en suffix zweren gezworen Wrong -en suffix -gezwoort gezworen Overgeneralisation +gezwoort gezworen Wrong Overgeneralisation ezworen gezworen Prefix ge without onset zworen gezworen Lacking ge prefix zwerfde zwierf Overgeneralisation @@ -2664,16 +3286,18 @@ zwierfden zwierven Irregular form plus regular suffix gezwerfd gezworven Overgeneralisation+ ezwerfd gezworven Overgeneralisation+Prefix ge without onset zwerfd gezworven Overgeneralisation+Lacking ge prefix +sezwerfd gezworven Overgeneralisation+prefix ge pronounced as se gezwerfde gezworvene Overgeneralisation+ ezwerfde gezworvene Overgeneralisation+Prefix ge without onset -gezwerft gezworven Overgeneralisation -ezwerft gezworven Overgeneralisation -zwerft gezworven Overgeneralisation +sezwerfde gezworvene Overgeneralisation+prefix ge pronounced as se +gezwerft gezworven Wrong Overgeneralisation+ +ezwerft gezworven Wrong Overgeneralisation+Prefix ge without onset +zwerft gezworven Wrong Overgeneralisation+Lacking ge prefix gezwerfen gezworven Wrong -en suffix ezwerfen gezworven Wrong -en suffix zwerfen gezworven Wrong -en suffix -gezworfd gezworven Overgeneralisation -gezworft gezworven Overgeneralisation +gezworfd gezworven Wrong Overgeneralisation +gezworft gezworven Wrong Overgeneralisation ezworven gezworven Prefix ge without onset zworven gezworven Lacking ge prefix zwijgde zweeg Overgeneralisation @@ -2683,15 +3307,17 @@ zweegden zwegen Irregular form plus regular suffix gezwijgd gezwegen Overgeneralisation+ ezwijgd gezwegen Overgeneralisation+Prefix ge without onset zwijgd gezwegen Overgeneralisation+Lacking ge prefix +sezwijgd gezwegen Overgeneralisation+prefix ge pronounced as se gezwijgde gezwegene Overgeneralisation+ ezwijgde gezwegene Overgeneralisation+Prefix ge without onset -gezwijgt gezwegen Overgeneralisation -ezwijgt gezwegen Overgeneralisation -zwijgt gezwegen Overgeneralisation +sezwijgde gezwegene Overgeneralisation+prefix ge pronounced as se +gezwijgt gezwegen Wrong Overgeneralisation+ +ezwijgt gezwegen Wrong Overgeneralisation+Prefix ge without onset +zwijgt gezwegen Wrong Overgeneralisation+Lacking ge prefix gezwijgen gezwegen Wrong -en suffix ezwijgen gezwegen Wrong -en suffix zwijgen gezwegen Wrong -en suffix -gezweegd gezwegen Overgeneralisation -gezweegt gezwegen Overgeneralisation +gezweegd gezwegen Wrong Overgeneralisation +gezweegt gezwegen Wrong Overgeneralisation ezwegen gezwegen Prefix ge without onset zwegen gezwegen Lacking ge prefix diff --git a/src/sastadev/data/macros/newimperatives.txt b/src/sastadev/data/macros/newimperatives.txt index 03b45fb..6dd2b39 100644 --- a/src/sastadev/data/macros/newimperatives.txt +++ b/src/sastadev/data/macros/newimperatives.txt @@ -57,14 +57,18 @@ basicimpmod = """(node[@rel="mod" and (@lemma="maar" or @lemma="eens")])""" impmodfound = """(%basicimpmod% or node[%nonfinvc% and %basicimpmod%])""" nonfincat = """(@cat="inf" or @cat="ppart")""" + nonfinvc = """(@rel="vc" and %nonfincat%) """ realcomplormodnode = """node[%realcomplormod%]""" realcomplormod = """(not(%particlesvp%) and (not(%indexnode%) or %includeindexnode%) and not(%nonfinvc%) and not(@rel="hd"))""" indexnode = """(@index and not (@cat or @pt or @pos))""" +indexnodecount = """(count(node[%indexnode%]))""" includeindexnode = """(%indexnode% and parent::node[@cat="ssub" and parent::node[@cat="rel" ]])""" suindexnode = """(%indexnode% and @rel="su") """ nonfinindexnode = """(%indexnode% and parent::node[%nonfinvc%])""" +nonsuindexnode = """(%indexnode% and @rel!="su") """ +nonsuindexnodecount = """(count(node[%nonsuindexnode%]))""" fillednode = """node[not(%indexnode%)]""" @@ -77,7 +81,7 @@ wx = """(%basicimperative% wxy = """(%basicimperative% - and %realcomplormodnodecount% = 2)""" + and %realcomplormodnodecount% = 2) and not(node[%Tarsp_kijkVU%])""" wxyz = """(%basicimperative% @@ -112,9 +116,17 @@ Tarsp_OndVC = """(%Ond% and node[%Tarsp_Basic_VC%] and count(node) = 2) """ Tarsp_OndBVC = """(%Ond% and node[%Tarsp_Basic_B%] and node[%Tarsp_Basic_VC%] and count(node) = 3) """ -Tarsp_OndW = """(%declarative% and %Ond% and (%Tarsp_W% or node[%Tarsp_onlyWinVC%]) and %realcomplormodnodecount% = 1 )""" +Tarsp_OndW = """(%declarative% and %Ond% and + ((%Tarsp_W% and node[%Tarsp_onlyWinVC%]) or + (%Tarsp_W% and not(node[@rel="vc"])) or + (not(node[%Tarsp_W%]) and node[%Tarsp_onlyWinVC%]) + ) and + (%realcomplormodnodecount% + %indexnodecount% = 1) and + (@rel!="dp" or (count(descendant::node[%realwordnode%]) = count(ancestor::node[@cat="top"]/descendant::node[%realwordnode%]) ) ) + + )""" -Tarsp_onlyWinVC = """(@rel="vc" and node[@rel="hd" and @pt="ww" and %realcomplormodnodecount% = 0])""" +Tarsp_onlyWinVC = """(@rel="vc" and node[@rel="hd" and @pt="ww"] and (%realcomplormodnodecount% + %nonsuindexnodecount% = 0) )""" Tarsp_OndWB = """(%declarative% and %Ond% and %Tarsp_W% and %Tarsp_B_X% and %realcomplormodnodecount% = 2 )""" @@ -200,7 +212,13 @@ Tarsp_Ov3 = """(%declarative% and onlywordinutt = """(ancestor::node[@cat="top" and count(.//node[@pt])=1] )""" Tarsp_kijkVU_old = """(@pt="ww" and @lemma="kijken" and @wvorm="pv" and @pvagr="ev" and @pvtijd="tgw" and count(ancestor::node[@cat="top"]/descendant::node[@pt!="let"])<=2)""" -Tarsp_kijkVU = """(@pt="ww" and @lemma="kijken" and @wvorm="pv" and @pvagr="ev" and @pvtijd="tgw" and not(../node[%Tarsp_pporvc%]))""" +Tarsp_kijkVU_old2 = """(@pt="ww" and @lemma="kijken" and @wvorm="pv" and @pvagr="ev" and @pvtijd="tgw" and not(../node[%Tarsp_pporvc%]))""" +Tarsp_kijkVU1 = """(@pt="ww" and @lemma="kijken" and (( @wvorm="pv" and @pvagr="ev" and @pvtijd="tgw") or @word = "kijke" or @word = "kij") and not(../node[@rel="vc" or @rel="su" or @cat="pp" or @lemma="maar" or @lemma="eens" or @lemma="dan" or @lemma="nou"])) """ +Tarsp_kijkVU2 = """(@lemma = "kijk" and (@pt="bw" or @pt="n")) """ +Tarsp_kijkVU3 = """(@pt="ww" and @lemma="kijken" and @wvorm="pv" and @pvagr="ev" and @pvtijd="tgw" and ../node[@rel="mod" and (@lemma="eens" or @lemma="hier")] and + (parent::node[count(node) = 2] or (parent::node[count(node) = 3] and ../node[@rel="obj1"])) + ) """ +Tarsp_kijkVU = """( %Tarsp_kijkVU1% or %Tarsp_kijkVU2% or %Tarsp_kijkVU3%)""" Tarsp_pporvc = """ (((@rel="pc" or @rel="mod" or @rel="ld") and @cat="pp") or @rel="vc")""" @@ -211,12 +229,64 @@ Tarsp_coreW = """ ( @pt="ww" and (@wvorm="pv" or parent::node[@rel!="vc"] or %Ta Tarsp_BarenonfinW = """parent::node[@rel="vc" and parent::node[@cat="smain" and count(node)=1]]""" -Tarsp_Hwwi = """(( @pt="ww" and @rel="hd" and @wvorm="pv" and - %Tarsp_hww% and - ((parent::node[node[@cat="inf"and @rel="vc"]]) or - (parent::node[node[@pt="ww" and @rel="vc" and @wvorm="inf"]]) - ) - ) or - %robusthwwi% )""" +Tarsp_coreHwwi = """ ( @pt="ww" and @rel="hd" and @wvorm="pv" and + %Tarsp_hww% and + ((parent::node[node[@cat="inf"and @rel="vc" and node[@rel="hd" and @pt="ww"]]]) or + (parent::node[node[@pt="ww" and @rel="vc" and @wvorm="inf"]]) + ) + ) +""" + +Tarsp_Hwwi = """( %Tarsp_coreHwwi% or + %robusthwwi% + )""" + + +robusthwwi = """((not(%Tarsp_coreHwwi%) and @pt="ww" and %Tarsp_hww% and @wvorm="pv" and ancestor::node[@cat="top" and descendant::node[@pt="ww" and @wvorm="inf" ]])) + + """ + +oldrobusthwwi = """ (@cat="top" and + .//node[@pt="ww" and %Tarsp_hww% and @wvorm="pv" and (@rel="--" or @rel="dp")] and + .//node[@pt="ww" and @wvorm="inf" and (@rel="--" or @rel="dp")] + ) + +""" + -Tarsp_hehe = """ (@lemma="hè" and @end = ancestor::node[@cat="top"]/descendant::node[@lemma="hè"]/@begin)""" \ No newline at end of file +Tarsp_hehe = """ (@lemma="hè" and @end = ancestor::node[@cat="top"]/descendant::node[@lemma="hè"]/@begin)""" + +simplevcw = """ +( node[@rel="hd" and @pt="ww" and not(%Tarsp_kijkVU%)] and + node[%Tarsp_Basic_VC%] and + count(node) = 2 +) +""" + +vcvcw = """ +(node[@rel="vc" and @cat="inf" and %simplevcw%] and + count(node) = 1 +) +""" + +suvcw = """ +( node[@rel="su"] and + node[@rel="vc" and @cat="inf" and node[@rel="su"] and node[@rel="hd" and @pt="ww"] and count(node)=2] + and count(node) =2 +) +""" + +Tarsp_vcw = """ +( (@rel="--" or @rel="nucl") and (count(descendant::node[%realwordnode%]) = count(ancestor::node[@cat="top"]/descendant::node[%realwordnode%]) ) and + ( %simplevcw% or + %vcvcw% + ) +) +""" + +realwordnode = """ ((@pt="ww" or @pt="n" or @pt="adj" or @pt="bw" or @pt="vz" or @pt="vg") and not(%Tarsp_kijkVU%)) +""" + +horenaux = """(@lemma="horen" and + @pt="ww" and + ../node[@rel="ld" or @rel="mod"] and not(../node[@rel="obj1" or @rel="vc"]))""" \ No newline at end of file diff --git a/src/sastadev/data/macros/newrobusthwwi.txt b/src/sastadev/data/macros/newrobusthwwi.txt new file mode 100644 index 0000000..0f23972 --- /dev/null +++ b/src/sastadev/data/macros/newrobusthwwi.txt @@ -0,0 +1,13 @@ + +robusthwwi = """ (@cat="top" and + .//node[@pt="ww" and %Tarsp_hww% and @wvorm="pv" and (@rel="--" or @rel="dp")] and + .//node[@pt="ww" and @wvorm="inf" and (@rel="--" or @rel="dp")] + ) + +""" + + +robusthwwi = """//node[not(%Tarsp_hwwi%) and @pt="ww" and %Tarsp_hww%]/ancestor::node[@cat="top"]/descendant::node[@pt="ww" and @wvorm="inf" ] + ) + +""" \ No newline at end of file diff --git a/src/sastadev/data/macros/sastamacros1.txt b/src/sastadev/data/macros/sastamacros1.txt index 488f434..8138347 100644 --- a/src/sastadev/data/macros/sastamacros1.txt +++ b/src/sastadev/data/macros/sastamacros1.txt @@ -48,7 +48,7 @@ Tarsp_hww = """ @lemma = "zullen" or @lemma = "doen" or @lemma = "gaan" or - @lemma = "horen" or + (@lemma = "horen" and %horenaux%) or @lemma = "komen" or @lemma = "laten" or @lemma = "liggen" or @@ -64,7 +64,7 @@ Tarsp_obj1_sibling = """parent::node[ node[@rel="obj1"]]""" Tarsp_ld_sibling = """parent::node[ node[@rel="ld"]]""" Tarsp_onlymodR_sibling = """(parent::node[node[@rel="mod" and %Rpronoun%] and not(node[@rel="predc"])])""" -Tarsp_HwwZ = """(@pt="ww" and @rel="hd" and @wvorm="pv" and @pvagr!="mv" and @pvtijd!="verl" and +oldTarsp_HwwZ = """(@pt="ww" and @rel="hd" and @wvorm="pv" and @pvagr!="mv" and @pvtijd!="verl" and (( %Tarsp_hww% or @lemma = "hebben" @@ -75,6 +75,19 @@ Tarsp_HwwZ = """(@pt="ww" and @rel="hd" and @wvorm="pv" and @pvagr!="mv" and @pv ) """ + +Tarsp_HwwZ = """(not(%Tarsp_Hwwi%) and (@pt="ww" and @rel="hd" and @wvorm="pv" and @pvagr!="mv" and @pvtijd!="verl" and + (( + %Tarsp_hww% or + @lemma = "hebben" + ) and + not(%Tarsp_vc_sibling%)) or + (@lemma="zijn" and not(%Tarsp_vc_sibling%) and %Tarsp_ld_sibling% ) + + )) +""" + + vdhwws = """(@lemma="hebben" or @lemma="zijn" or @lemma="worden") """ @@ -88,13 +101,6 @@ Tarsp_Kop = """ ) """ -robusthwwi = """ (@cat="top" and - .//node[@pt="ww" and %Tarsp_hww% and @wvorm="pv" and (@rel="--" or @rel="dp")] and - .//node[@pt="ww" and @wvorm="inf" and (@rel="--" or @rel="dp")] - ) - -""" - robusthwwvd = """ (@cat="top" and .//node[@pt="ww" and %vdhwws% and @wvorm="pv" and (@rel="--" or @rel="dp")] and .//node[@pt="ww" and @wvorm="vd" and (@rel="--" or @rel="dp")] @@ -331,6 +337,7 @@ spec_noun = """ (@pt="spec" and (@pos="name" or starts-with(@frame,"proper_name" asta_numvrij = """(@pt="tw" and @positie="vrij" and @rel!="mwp" and @rel!="det" and @rel!="mod" )""" asta_noun = """ ((@pt="n" and not(%ASTA_filled_pause%) and not(%ASTA_numeral%)) or + (@lemma="112") or (@pt="ww" and @positie="nom") or (%monthname%) or @pos="name" ) @@ -531,4 +538,49 @@ Rpronounx = """(%Rpronoun% or @lemma="daarzo" or @lemma="hierzo") """ followedbydet = """(@end=ancestor::node[@cat="top"]/descendant::node[%det%]/@begin)""" -det = """(@pt="lid" or @lemma="dit" or @lemma="deze" or @lemma="die" or @lemma="dat" or (@pt="vnw" and @vwtype="bez") ) """ \ No newline at end of file +det = """(@pt="lid" or @lemma="dit" or @lemma="deze" or @lemma="die" or @lemma="dat" or (@pt="vnw" and @vwtype="bez") ) """ + + +vrwondplus = """(%whqsv1% or %basicvrwondplus% or %basicvrwondplusnosubj%)""" + +whqsv1 = """(@cat="whq") and node[@cat="sv1" and @rel="body"] and count(node)=1""" + +basicvrwondplus = """( + @cat="sv1" and @rel="--" and ancestor::node[@cat="top" and node[@lemma="?"]] and + node[@rel="hd" and (@lemma="zijn" or @lemma="doen" or @lemma="heten" or @lemma="moeten")] and + node[@rel="su" ] and + not(node[@rel="su" and node[@rel="mod"]]) and + not(node[(@rel="obj1" or @rel="predc" or @rel="obj2" or + @rel="vc" or @rel="ld" or @rel="pc" or @rel="se")]) and + not(node[@rel="hd" and @lemma="zijn"] and node[@rel="mod" and (@cat="pp" or @cat="cp")]) and + not(node[@rel="hd" and @lemma="zijn"] and node[@rel="mod" and %Rpronoun%]) and + not(node[@rel="mod" and @lemma="niet"] and + not(node[@rel="mod" and @lemma!="dan" and @lemma!="nou" and @lemma!="weer"]) + ) +)""" + +basicvrwondplusnosubj = """ +( + @cat="sv1" and @rel="--" and ancestor::node[@cat="top" and node[@lemma="?"]] and + node[@rel="hd" and @pt="ww" and @wvorm="pv" and @stype!="imparative"] and + not(node[@rel="vc"]) and + not(node[@cat="np" and node[@rel="mod"]]) and + not(node[@cat="np" and node[@rel="det" and + (@lemma = "dit" or @lemma="dat" or @lemma="die" or @lemma="het" or @lemma="de") ]]) and + not(node[@cat="conj"]) and + not(node[@rel="mod" and @cat="sv1"]) and + not(node[@rel="su" ]) and + not(node[@rel="mod" and @lemma!="dan" and @lemma!="nou" and @lemma!="weer" and @lemma!="er"]) and + (not(node[%intrmodalverb%] and node[@rel="obj1"])) + and count(node) <= 3 +) +""" + +intrmodalverb = """( @pt="ww" and + (@lemma="kunnen" or + @lemma="moeten" or + @lemma="mogen" or + @lemma="gaan" + ) + +) """ \ No newline at end of file diff --git a/src/sastadev/data/methods/ASTA_Index_Current.xlsx b/src/sastadev/data/methods/ASTA_Index_Current.xlsx index ba2a29f..c99e59c 100644 Binary files a/src/sastadev/data/methods/ASTA_Index_Current.xlsx and b/src/sastadev/data/methods/ASTA_Index_Current.xlsx differ diff --git a/src/sastadev/data/methods/ASTA_Index_Current_old.xlsx b/src/sastadev/data/methods/ASTA_Index_Current_old.xlsx new file mode 100644 index 0000000..ba2a29f Binary files /dev/null and b/src/sastadev/data/methods/ASTA_Index_Current_old.xlsx differ diff --git a/src/sastadev/data/methods/STAP_Index_Current.xlsx b/src/sastadev/data/methods/STAP_Index_Current.xlsx index 454805a..ac64309 100644 Binary files a/src/sastadev/data/methods/STAP_Index_Current.xlsx and b/src/sastadev/data/methods/STAP_Index_Current.xlsx differ diff --git a/src/sastadev/data/methods/TARSP Index Current.xlsx b/src/sastadev/data/methods/TARSP Index Current.xlsx deleted file mode 100644 index 59089f4..0000000 Binary files a/src/sastadev/data/methods/TARSP Index Current.xlsx and /dev/null differ diff --git a/src/sastadev/data/methods/TARSP_Index_Current.xlsx b/src/sastadev/data/methods/TARSP_Index_Current.xlsx new file mode 100644 index 0000000..204044e Binary files /dev/null and b/src/sastadev/data/methods/TARSP_Index_Current.xlsx differ diff --git a/src/sastadev/data/nochildwords/nochildwords.txt b/src/sastadev/data/nochildwords/nochildwords.txt new file mode 100644 index 0000000..5c20ccd --- /dev/null +++ b/src/sastadev/data/nochildwords/nochildwords.txt @@ -0,0 +1 @@ +tanen \ No newline at end of file diff --git a/src/sastadev/data/old_inflectioncorrection.tsv.txt b/src/sastadev/data/old_inflectioncorrection.tsv.txt new file mode 100644 index 0000000..d6f0983 --- /dev/null +++ b/src/sastadev/data/old_inflectioncorrection.tsv.txt @@ -0,0 +1,2697 @@ +gebakt gebakken Overgeneralisation +ebakt gebakken Overgeneralisation +bakt gebakken Overgeneralisation +gebakte gebakkene Overgeneralisation+ +ebakte gebakkene Overgeneralisation+Prefix ge without onset +ebakken gebakken Prefix ge without onset +bakken gebakken Lacking ge prefix +geband gebannen Overgeneralisation +eband gebannen Overgeneralisation+Prefix ge without onset +band gebannen Overgeneralisation+Lacking ge prefix +gebande gebannene Overgeneralisation+ +ebande gebannene Overgeneralisation+Prefix ge without onset +gebant gebannen Overgeneralisation +ebant gebannen Overgeneralisation +bant gebannen Overgeneralisation +ebannen gebannen Prefix ge without onset +bannen gebannen Lacking ge prefix +gebarst gebarsten Overgeneralisation +ebarst gebarsten Overgeneralisation +barst gebarsten Overgeneralisation +gebarste gebarstene Overgeneralisation+ +ebarste gebarstene Overgeneralisation+Prefix ge without onset +ebarsten gebarsten Prefix ge without onset +barsten gebarsten Lacking ge prefix +bederfde bedorvene Overgeneralisation +bederfden bedierven Overgeneralisation +bedierfde bedierf Irregular form plus regular suffix +bedierfden bedierven Irregular form plus regular suffix +bederfd bedorven Overgeneralisation +bederft bedorven Overgeneralisation +bederfen bedorven Wrong -en suffix +bedorfd bedorven Overgeneralisation +bedorft bedorven Overgeneralisation +bedriegde bedrogene Overgeneralisation +bedriegden bedrogen Overgeneralisation +bedroogde bedroog Irregular form plus regular suffix +bedroogden bedrogen Irregular form plus regular suffix +bedriegd bedrogen Overgeneralisation +bedriegt bedrogen Overgeneralisation +bedriegen bedrogen Wrong -en suffix +bedroogt bedrogen Overgeneralisation +beginde begonnene Overgeneralisation +beginden begonnen Overgeneralisation +begonde begon Irregular form plus regular suffix +begonden begonnen Irregular form plus regular suffix +begind begonnen Overgeneralisation +begint begonnen Overgeneralisation +beginnen begonnen Wrong -en suffix +begont begonnen Overgeneralisation +behangde behangene Overgeneralisation +behangden behingen Overgeneralisation +behingde behing Irregular form plus regular suffix +behingden behingen Irregular form plus regular suffix +behangd behangen Overgeneralisation +behangt behangen Overgeneralisation +bergde borg Overgeneralisation +bergden borgen Overgeneralisation +borgde borg Irregular form plus regular suffix +borgden borgen Irregular form plus regular suffix +gebergd geborgen Overgeneralisation+ +ebergd geborgen Overgeneralisation+Prefix ge without onset +bergd geborgen Overgeneralisation+Lacking ge prefix +gebergde geborgene Overgeneralisation+ +ebergde geborgene Overgeneralisation+Prefix ge without onset +gebergt geborgen Overgeneralisation +ebergt geborgen Overgeneralisation +bergt geborgen Overgeneralisation +gebergen geborgen Wrong -en suffix +ebergen geborgen Wrong -en suffix +bergen geborgen Wrong -en suffix +geborgd geborgen Overgeneralisation +geborgt geborgen Overgeneralisation +eborgen geborgen Prefix ge without onset +borgen geborgen Lacking ge prefix +beveelde bevolene Overgeneralisation +beveelden bevalen Overgeneralisation +bevalde beval Irregular form plus regular suffix +bevalden bevalen Irregular form plus regular suffix +beveeld bevolen Overgeneralisation +beveelt bevolen Overgeneralisation +bevelen bevolen Wrong -en suffix +bevoolt bevolen Overgeneralisation +bezwijkte bezwekene Overgeneralisation +bezwijkten bezweken Overgeneralisation +bezweekte bezweek Irregular form plus regular suffix +bezweekten bezweken Irregular form plus regular suffix +bezwijkt bezweken Overgeneralisation +bezwijken bezweken Wrong -en suffix +bezweekt bezweken Overgeneralisation +bidde bad Overgeneralisation +bidden gebeden Wrong -en suffix +badde bad Irregular form plus regular suffix +badden baden Irregular form plus regular suffix +gebid gebeden Overgeneralisation +ebid gebeden Overgeneralisation +bid gebeden Overgeneralisation +gebidde gebedene Overgeneralisation+ +ebidde gebedene Overgeneralisation+Prefix ge without onset +gebidden gebeden Wrong -en suffix +ebidden gebeden Wrong -en suffix +gebeed gebeden Overgeneralisation +ebeden gebeden Prefix ge without onset +beden gebeden Lacking ge prefix +biedde bood Overgeneralisation +biedden boden Overgeneralisation +boodde bood Irregular form plus regular suffix +boodden boden Irregular form plus regular suffix +gebied geboden Overgeneralisation +ebied geboden Overgeneralisation +bied geboden Overgeneralisation +gebiede gebodene Overgeneralisation+ +ebiede gebodene Overgeneralisation+Prefix ge without onset +gebieden geboden Wrong -en suffix +ebieden geboden Wrong -en suffix +bieden geboden Wrong -en suffix +geboodt geboden Overgeneralisation +gebood geboden Overgeneralisation +eboden geboden Prefix ge without onset +boden geboden Lacking ge prefix +bijtte beet Overgeneralisation +bijtten beten Overgeneralisation +beette beet Irregular form plus regular suffix +beetten beten Irregular form plus regular suffix +gebijt gebeten Overgeneralisation +ebijt gebeten Overgeneralisation +bijt gebeten Overgeneralisation +gebijte gebetene Overgeneralisation+ +ebijte gebetene Overgeneralisation+Prefix ge without onset +gebijten gebeten Wrong -en suffix +ebijten gebeten Wrong -en suffix +bijten gebeten Wrong -en suffix +gebeet gebeten Overgeneralisation +ebeten gebeten Prefix ge without onset +beten gebeten Lacking ge prefix +bindde bond Overgeneralisation +bindden bonden Overgeneralisation +bondde bond Irregular form plus regular suffix +bondden bonden Irregular form plus regular suffix +gebind gebonden Overgeneralisation +ebind gebonden Overgeneralisation +bind gebonden Overgeneralisation +gebinde gebondene Overgeneralisation+ +ebinde gebondene Overgeneralisation+Prefix ge without onset +gebinden gebonden Wrong -en suffix +ebinden gebonden Wrong -en suffix +binden gebonden Wrong -en suffix +gebond gebonden Overgeneralisation +ebonden gebonden Prefix ge without onset +bonden gebonden Lacking ge prefix +blaasde blies Overgeneralisation +blaasden bliezen Overgeneralisation +bliesde blies Irregular form plus regular suffix +bliesden bliezen Irregular form plus regular suffix +geblaasd geblazen Overgeneralisation +eblaasd geblazen Overgeneralisation+Prefix ge without onset +blaasd geblazen Overgeneralisation+Lacking ge prefix +geblaasde geblazene Overgeneralisation+ +eblaasde geblazene Overgeneralisation+Prefix ge without onset +geblaast geblazen Overgeneralisation +eblaast geblazen Overgeneralisation +blaast geblazen Overgeneralisation +geblasen geblazen Wrong -en suffix +eblasen geblazen Wrong -en suffix +blasen geblazen Wrong -en suffix +eblazen geblazen Prefix ge without onset +blazen geblazen Lacking ge prefix +blijkte bleek Overgeneralisation +blijkten bleken Overgeneralisation +bleekte bleek Irregular form plus regular suffix +bleekten bleken Irregular form plus regular suffix +geblijkt gebleken Overgeneralisation +eblijkt gebleken Overgeneralisation +blijkt gebleken Overgeneralisation +geblijkte geblekene Overgeneralisation+ +eblijkte geblekene Overgeneralisation+Prefix ge without onset +geblijken gebleken Wrong -en suffix +eblijken gebleken Wrong -en suffix +blijken gebleken Wrong -en suffix +gebleekt gebleken Overgeneralisation +ebleken gebleken Prefix ge without onset +bleken gebleken Lacking ge prefix +blijfde bleef Overgeneralisation +blijfden bleven Overgeneralisation +bleefde bleef Irregular form plus regular suffix +bleefden bleven Irregular form plus regular suffix +geblijfd gebleven Overgeneralisation+ +eblijfd gebleven Overgeneralisation+Prefix ge without onset +blijfd gebleven Overgeneralisation+Lacking ge prefix +geblijfde geblevene Overgeneralisation+ +eblijfde geblevene Overgeneralisation+Prefix ge without onset +geblijft gebleven Overgeneralisation +eblijft gebleven Overgeneralisation +blijft gebleven Overgeneralisation +geblijfen gebleven Wrong -en suffix +eblijfen gebleven Wrong -en suffix +blijfen gebleven Wrong -en suffix +gebleefd gebleven Overgeneralisation +gebleeft gebleven Overgeneralisation +ebleven gebleven Prefix ge without onset +bleven gebleven Lacking ge prefix +blinkte blonk Overgeneralisation +blinkten blonken Overgeneralisation +blonkte blonk Irregular form plus regular suffix +blonkten blonken Irregular form plus regular suffix +geblinkt geblonken Overgeneralisation +eblinkt geblonken Overgeneralisation +blinkt geblonken Overgeneralisation +geblinkte geblonkene Overgeneralisation+ +eblinkte geblonkene Overgeneralisation+Prefix ge without onset +geblinken geblonken Wrong -en suffix +eblinken geblonken Wrong -en suffix +blinken geblonken Wrong -en suffix +geblonkt geblonken Overgeneralisation +eblonken geblonken Prefix ge without onset +blonken geblonken Lacking ge prefix +gebraad gebraden Overgeneralisation +ebraad gebraden Overgeneralisation +braad gebraden Overgeneralisation +gebrade gebradene Overgeneralisation+ +ebrade gebradene Overgeneralisation+Prefix ge without onset +ebraden gebraden Prefix ge without onset +braden gebraden Lacking ge prefix +breekte brak Overgeneralisation +breekten braken Overgeneralisation +brakte brak Irregular form plus regular suffix +brakten braken Irregular form plus regular suffix +gebreekt gebroken Overgeneralisation +ebreekt gebroken Overgeneralisation +breekt gebroken Overgeneralisation +gebreekte gebrokene Overgeneralisation+ +ebreekte gebrokene Overgeneralisation+Prefix ge without onset +gebreken gebroken Wrong -en suffix +ebreken gebroken Wrong -en suffix +breken gebroken Wrong -en suffix +gebrookt gebroken Overgeneralisation +ebroken gebroken Prefix ge without onset +broken gebroken Lacking ge prefix +brengde bracht Overgeneralisation +brengden brachten Overgeneralisation +brachtde bracht Irregular form plus regular suffix +brachtden brachten Irregular form plus regular suffix +gebrengd gebracht Overgeneralisation+ +ebrengd gebracht Overgeneralisation+Prefix ge without onset +brengd gebracht Overgeneralisation+Lacking ge prefix +gebrengde gebrachte Overgeneralisation+ +ebrengde gebrachte Overgeneralisation+Prefix ge without onset +gebrengt gebracht Overgeneralisation +ebrengt gebracht Overgeneralisation +brengt gebracht Overgeneralisation +gebrengen gebracht Wrong -en suffix +ebrengen gebracht Wrong -en suffix +brengen gebracht Wrong -en suffix +ebracht gebracht Prefix ge without onset +bracht gebracht Lacking ge prefix +gebrouwd gebrouwen Overgeneralisation +ebrouwd gebrouwen Overgeneralisation+Prefix ge without onset +brouwd gebrouwen Overgeneralisation+Lacking ge prefix +gebrouwde gebrouwene Overgeneralisation+ +ebrouwde gebrouwene Overgeneralisation+Prefix ge without onset +gebrouwt gebrouwen Overgeneralisation +ebrouwt gebrouwen Overgeneralisation +brouwt gebrouwen Overgeneralisation +ebrouwen gebrouwen Prefix ge without onset +brouwen gebrouwen Lacking ge prefix +buigde boog Overgeneralisation +buigden bogen Overgeneralisation +boogde boog Irregular form plus regular suffix +boogden bogen Irregular form plus regular suffix +gebuigd gebogen Overgeneralisation+ +ebuigd gebogen Overgeneralisation+Prefix ge without onset +buigd gebogen Overgeneralisation+Lacking ge prefix +gebuigde gebogene Overgeneralisation+ +ebuigde gebogene Overgeneralisation+Prefix ge without onset +gebuigt gebogen Overgeneralisation +ebuigt gebogen Overgeneralisation +buigt gebogen Overgeneralisation +gebuigen gebogen Wrong -en suffix +ebuigen gebogen Wrong -en suffix +buigen gebogen Wrong -en suffix +geboogt gebogen Overgeneralisation +ebogen gebogen Prefix ge without onset +bogen gebogen Lacking ge prefix +denkte dacht Overgeneralisation +denkten dachten Overgeneralisation +dachtte dacht Irregular form plus regular suffix +dachtten dachten Irregular form plus regular suffix +gedenkt gedacht Overgeneralisation +edenkt gedacht Overgeneralisation +denkt gedacht Overgeneralisation +gedenkte gedachte Overgeneralisation+ +edenkte gedachte Overgeneralisation+Prefix ge without onset +gedenken gedacht Wrong -en suffix +edenken gedacht Wrong -en suffix +denken gedacht Wrong -en suffix +edacht gedacht Prefix ge without onset +dacht gedacht Lacking ge prefix +dingde dong Overgeneralisation +dingden dongen Overgeneralisation +dongde dong Irregular form plus regular suffix +dongden dongen Irregular form plus regular suffix +gedingd gedongen Overgeneralisation+ +edingd gedongen Overgeneralisation+Prefix ge without onset +dingd gedongen Overgeneralisation+Lacking ge prefix +gedingde gedongene Overgeneralisation+ +edingde gedongene Overgeneralisation+Prefix ge without onset +gedingt gedongen Overgeneralisation +edingt gedongen Overgeneralisation +dingt gedongen Overgeneralisation +gedingen gedongen Wrong -en suffix +edingen gedongen Wrong -en suffix +dingen gedongen Wrong -en suffix +gedongd gedongen Overgeneralisation +gedongt gedongen Overgeneralisation +edongen gedongen Prefix ge without onset +dongen gedongen Lacking ge prefix +doete deed Overgeneralisation +doeten deden Overgeneralisation +deedte deed Irregular form plus regular suffix +deedten deden Irregular form plus regular suffix +gedoet gedaan Overgeneralisation +edoet gedaan Overgeneralisation +doet gedaan Overgeneralisation +gedoete gedaane Overgeneralisation+ +edoete gedaane Overgeneralisation+Prefix ge without onset +gedoen gedaan Wrong -en suffix +edoen gedaan Wrong -en suffix +doen gedaan Wrong -en suffix +edaan gedaan Prefix ge without onset +daan gedaan Lacking ge prefix +draagde droeg Overgeneralisation +draagden droegen Overgeneralisation +droegde droeg Irregular form plus regular suffix +droegden droegen Irregular form plus regular suffix +gedraagd gedragen Overgeneralisation +edraagd gedragen Overgeneralisation+Prefix ge without onset +draagd gedragen Overgeneralisation+Lacking ge prefix +gedraagde gedragene Overgeneralisation+ +edraagde gedragene Overgeneralisation+Prefix ge without onset +gedraagt gedragen Overgeneralisation +edraagt gedragen Overgeneralisation +draagt gedragen Overgeneralisation +edragen gedragen Prefix ge without onset +dragen gedragen Lacking ge prefix +drijfde dreef Overgeneralisation +drijfden dreven Overgeneralisation +dreefde dreef Irregular form plus regular suffix +dreefden dreven Irregular form plus regular suffix +gedrijfd gedreven Overgeneralisation+ +edrijfd gedreven Overgeneralisation+Prefix ge without onset +drijfd gedreven Overgeneralisation+Lacking ge prefix +gedrijfde gedrevene Overgeneralisation+ +edrijfde gedrevene Overgeneralisation+Prefix ge without onset +gedrijft gedreven Overgeneralisation +edrijft gedreven Overgeneralisation +drijft gedreven Overgeneralisation +gedrijfen gedreven Wrong -en suffix +edrijfen gedreven Wrong -en suffix +drijfen gedreven Wrong -en suffix +gedreefd gedreven Overgeneralisation +gedreeft gedreven Overgeneralisation +edreven gedreven Prefix ge without onset +dreven gedreven Lacking ge prefix +dringde drong Overgeneralisation +dringden drongen Overgeneralisation +drongde drong Irregular form plus regular suffix +drongden drongen Irregular form plus regular suffix +gedringd gedrongen Overgeneralisation+ +edringd gedrongen Overgeneralisation+Prefix ge without onset +dringd gedrongen Overgeneralisation+Lacking ge prefix +gedringde gedrongene Overgeneralisation+ +edringde gedrongene Overgeneralisation+Prefix ge without onset +gedringt gedrongen Overgeneralisation +edringt gedrongen Overgeneralisation +dringt gedrongen Overgeneralisation +gedringen gedrongen Wrong -en suffix +edringen gedrongen Wrong -en suffix +dringen gedrongen Wrong -en suffix +gedrongd gedrongen Overgeneralisation +gedrongt gedrongen Overgeneralisation +edrongen gedrongen Prefix ge without onset +drongen gedrongen Lacking ge prefix +drinkte dronk Overgeneralisation +drinkten dronken Overgeneralisation +dronkte dronk Irregular form plus regular suffix +dronkten dronken Irregular form plus regular suffix +gedrinkt gedronken Overgeneralisation +edrinkt gedronken Overgeneralisation +drinkt gedronken Overgeneralisation +gedrinkte gedronkene Overgeneralisation+ +edrinkte gedronkene Overgeneralisation+Prefix ge without onset +gedrinken gedronken Wrong -en suffix +edrinken gedronken Wrong -en suffix +drinken gedronken Wrong -en suffix +gedronkt gedronken Overgeneralisation +edronken gedronken Prefix ge without onset +dronken gedronken Lacking ge prefix +druipte droop Overgeneralisation +druipten dropen Overgeneralisation +droopte droop Irregular form plus regular suffix +droopten dropen Irregular form plus regular suffix +gedruipt gedropen Overgeneralisation +edruipt gedropen Overgeneralisation +druipt gedropen Overgeneralisation +gedruipte gedropene Overgeneralisation+ +edruipte gedropene Overgeneralisation+Prefix ge without onset +gedruipen gedropen Wrong -en suffix +edruipen gedropen Wrong -en suffix +druipen gedropen Wrong -en suffix +gedroopt gedropen Overgeneralisation +edropen gedropen Prefix ge without onset +dropen gedropen Lacking ge prefix +duikte dook Overgeneralisation +duikten doken Overgeneralisation +dookte dook Irregular form plus regular suffix +dookten doken Irregular form plus regular suffix +geduikt gedoken Overgeneralisation +eduikt gedoken Overgeneralisation +duikt gedoken Overgeneralisation +geduikte gedokene Overgeneralisation+ +eduikte gedokene Overgeneralisation+Prefix ge without onset +geduiken gedoken Wrong -en suffix +eduiken gedoken Wrong -en suffix +duiken gedoken Wrong -en suffix +gedookt gedoken Overgeneralisation +edoken gedoken Prefix ge without onset +doken gedoken Lacking ge prefix +dwingde dwong Overgeneralisation +dwingden dwongen Overgeneralisation +dwongde dwong Irregular form plus regular suffix +dwongden dwongen Irregular form plus regular suffix +gedwingd gedwongen Overgeneralisation+ +edwingd gedwongen Overgeneralisation+Prefix ge without onset +dwingd gedwongen Overgeneralisation+Lacking ge prefix +gedwingde gedwongene Overgeneralisation+ +edwingde gedwongene Overgeneralisation+Prefix ge without onset +gedwingt gedwongen Overgeneralisation +edwingt gedwongen Overgeneralisation +dwingt gedwongen Overgeneralisation +gedwingen gedwongen Wrong -en suffix +edwingen gedwongen Wrong -en suffix +dwingen gedwongen Wrong -en suffix +gedwongd gedwongen Overgeneralisation +gedwongt gedwongen Overgeneralisation +edwongen gedwongen Prefix ge without onset +dwongen gedwongen Lacking ge prefix +eette at Overgeneralisation +eetten aten Overgeneralisation +atte at Irregular form plus regular suffix +atten aten Irregular form plus regular suffix +geeet gegeten Overgeneralisation+ +eeet gegeten Overgeneralisation+Prefix ge without onset +eet gegeten Overgeneralisation +geete gegetene Overgeneralisation+ +eete gegetene Overgeneralisation+Prefix ge without onset +geëet gegeten Overgeneralisation +eëet gegeten Overgeneralisation +geëten gegeten Wrong -en suffix +eëten gegeten Wrong -en suffix +eten gegeten Wrong -en suffix +gegeet gegeten Overgeneralisation +egeten gegeten Prefix ge without onset +geten gegeten Lacking ge prefix +fluitte floot Overgeneralisation +fluitten floten Overgeneralisation +flootte floot Irregular form plus regular suffix +flootten floten Irregular form plus regular suffix +gefluit gefloten Overgeneralisation +efluit gefloten Overgeneralisation +fluit gefloten Overgeneralisation +gefluite geflotene Overgeneralisation+ +efluite geflotene Overgeneralisation+Prefix ge without onset +gefluiten gefloten Wrong -en suffix +efluiten gefloten Wrong -en suffix +fluiten gefloten Wrong -en suffix +gefloot gefloten Overgeneralisation +efloten gefloten Prefix ge without onset +floten gefloten Lacking ge prefix +gade ging Overgeneralisation +gaden gingen Overgeneralisation +gingde ging Irregular form plus regular suffix +gingden gingen Irregular form plus regular suffix +gegaad gegaan Overgeneralisation+ +egaad gegaan Overgeneralisation+Prefix ge without onset +gaad gegaan Overgeneralisation+Lacking ge prefix +gegade gegaane Overgeneralisation+ +egade gegaane Overgeneralisation+Prefix ge without onset +gegaat gegaan Overgeneralisation +egaat gegaan Overgeneralisation +gaat gegaan Overgeneralisation +egaan gegaan Prefix ge without onset +gaan gegaan Lacking ge prefix +geldde gold Overgeneralisation +geldden golden Overgeneralisation +goldde gold Irregular form plus regular suffix +goldden golden Irregular form plus regular suffix +gegeld gegolden Overgeneralisation +egeld gegolden Overgeneralisation +geld gegolden Overgeneralisation +gegelde gegoldene Overgeneralisation+ +egelde gegoldene Overgeneralisation+Prefix ge without onset +gegelden gegolden Wrong -en suffix +egelden gegolden Wrong -en suffix +gelden gegolden Wrong -en suffix +gegold gegolden Overgeneralisation +egolden gegolden Prefix ge without onset +golden gegolden Lacking ge prefix +geneesde genezene Overgeneralisation +geneesden genazen Overgeneralisation +genasde genas Irregular form plus regular suffix +genasden genazen Irregular form plus regular suffix +geneesd genezen Overgeneralisation +geneest genezen Overgeneralisation +genesen genezen Wrong -en suffix +enezen genezen Prefix ge without onset +nezen genezen Lacking ge prefix +geniette genoot Overgeneralisation +genietten genoten Overgeneralisation +genootte genoot Irregular form plus regular suffix +genootten genoten Irregular form plus regular suffix +geniet genoten Overgeneralisation +geniete genotene Overgeneralisation +genieten genoten Wrong -en suffix +genoot genoten Overgeneralisation +enoten genoten Prefix ge without onset +noten genoten Lacking ge prefix +geefde gaf Overgeneralisation +geefden gaven Overgeneralisation +gafde gaf Irregular form plus regular suffix +gafden gaven Irregular form plus regular suffix +gegeefd gegeven Overgeneralisation +egeefd gegeven Overgeneralisation+Prefix ge without onset +geefd gegeven Overgeneralisation+Lacking ge prefix +gegeefde gegevene Overgeneralisation+ +egeefde gegevene Overgeneralisation+Prefix ge without onset +gegeeft gegeven Overgeneralisation +egeeft gegeven Overgeneralisation +geeft gegeven Overgeneralisation +gegefen gegeven Wrong -en suffix +egefen gegeven Wrong -en suffix +gefen gegeven Wrong -en suffix +egeven gegeven Prefix ge without onset +geven gegeven Lacking ge prefix +giette goot Overgeneralisation +gietten goten Overgeneralisation +gootte goot Irregular form plus regular suffix +gootten goten Irregular form plus regular suffix +gegiet gegoten Overgeneralisation +egiet gegoten Overgeneralisation +giet gegoten Overgeneralisation +gegiete gegotene Overgeneralisation+ +egiete gegotene Overgeneralisation+Prefix ge without onset +gegieten gegoten Wrong -en suffix +egieten gegoten Wrong -en suffix +gieten gegoten Wrong -en suffix +gegoot gegoten Overgeneralisation +egoten gegoten Prefix ge without onset +goten gegoten Lacking ge prefix +glijdde gleed Overgeneralisation +glijdden gleden Overgeneralisation +gleedde gleed Irregular form plus regular suffix +gleedden gleden Irregular form plus regular suffix +geglijd gegleden Overgeneralisation +eglijd gegleden Overgeneralisation +glijd gegleden Overgeneralisation +geglijde gegledene Overgeneralisation+ +eglijde gegledene Overgeneralisation+Prefix ge without onset +geglijden gegleden Wrong -en suffix +eglijden gegleden Wrong -en suffix +glijden gegleden Wrong -en suffix +gegleed gegleden Overgeneralisation +egleden gegleden Prefix ge without onset +gleden gegleden Lacking ge prefix +glimde glom Overgeneralisation +glimden glommen Overgeneralisation +glomde glom Irregular form plus regular suffix +glomden glommen Irregular form plus regular suffix +geglimd geglommen Overgeneralisation+ +eglimd geglommen Overgeneralisation+Prefix ge without onset +glimd geglommen Overgeneralisation+Lacking ge prefix +geglimde geglommene Overgeneralisation+ +eglimde geglommene Overgeneralisation+Prefix ge without onset +geglimt geglommen Overgeneralisation +eglimt geglommen Overgeneralisation +glimt geglommen Overgeneralisation +geglimmen geglommen Wrong -en suffix +eglimmen geglommen Wrong -en suffix +glimmen geglommen Wrong -en suffix +geglomt geglommen Overgeneralisation +eglommen geglommen Prefix ge without onset +glommen geglommen Lacking ge prefix +graafde groef Overgeneralisation +graafden groeven Overgeneralisation +groefde groef Irregular form plus regular suffix +groefden groeven Irregular form plus regular suffix +gegraafd gegraven Overgeneralisation +egraafd gegraven Overgeneralisation+Prefix ge without onset +graafd gegraven Overgeneralisation+Lacking ge prefix +gegraafde gegravene Overgeneralisation+ +egraafde gegravene Overgeneralisation+Prefix ge without onset +gegraaft gegraven Overgeneralisation +egraaft gegraven Overgeneralisation +graaft gegraven Overgeneralisation +gegrafen gegraven Wrong -en suffix +egrafen gegraven Wrong -en suffix +grafen gegraven Wrong -en suffix +egraven gegraven Prefix ge without onset +graven gegraven Lacking ge prefix +grijpte greep Overgeneralisation +grijpten grepen Overgeneralisation +greepte greep Irregular form plus regular suffix +greepten grepen Irregular form plus regular suffix +gegrijpt gegrepen Overgeneralisation +egrijpt gegrepen Overgeneralisation +grijpt gegrepen Overgeneralisation +gegrijpte gegrepene Overgeneralisation+ +egrijpte gegrepene Overgeneralisation+Prefix ge without onset +gegrijpen gegrepen Wrong -en suffix +egrijpen gegrepen Wrong -en suffix +grijpen gegrepen Wrong -en suffix +gegreept gegrepen Overgeneralisation +egrepen gegrepen Prefix ge without onset +grepen gegrepen Lacking ge prefix +hangde hing Overgeneralisation +hangden hingen Overgeneralisation +hingde hing Irregular form plus regular suffix +hingden hingen Irregular form plus regular suffix +gehangd gehangen Overgeneralisation +ehangd gehangen Overgeneralisation+Prefix ge without onset +hangd gehangen Overgeneralisation+Lacking ge prefix +gehangde gehangene Overgeneralisation+ +ehangde gehangene Overgeneralisation+Prefix ge without onset +gehangt gehangen Overgeneralisation +ehangt gehangen Overgeneralisation +hangt gehangen Overgeneralisation +ehangen gehangen Prefix ge without onset +hangen gehangen Lacking ge prefix +hebde had Overgeneralisation +hebden hadden Overgeneralisation +hadde had Irregular form plus regular suffix +gehebd gehad Overgeneralisation+ +ehebd gehad Overgeneralisation+Prefix ge without onset +hebd gehad Overgeneralisation+Lacking ge prefix +gehebde gehade Overgeneralisation+ +ehebde gehade Overgeneralisation+Prefix ge without onset +gehebt gehad Overgeneralisation +ehebt gehad Overgeneralisation +hebt gehad Overgeneralisation +gehebben gehad Wrong -en suffix +ehebben gehad Wrong -en suffix +hebben gehad Wrong -en suffix +ehad gehad Prefix ge without onset +had gehad Lacking ge prefix +hefte hief Overgeneralisation +heften hieven Overgeneralisation +hiefte hief Irregular form plus regular suffix +hieften hieven Irregular form plus regular suffix +geheft geheven Overgeneralisation +eheft geheven Overgeneralisation +heft geheven Overgeneralisation +gehefte gehevene Overgeneralisation+ +ehefte gehevene Overgeneralisation+Prefix ge without onset +geheffen geheven Wrong -en suffix +eheffen geheven Wrong -en suffix +heffen geheven Wrong -en suffix +geheefd geheven Overgeneralisation +geheeft geheven Overgeneralisation +eheven geheven Prefix ge without onset +heven geheven Lacking ge prefix +helpte hielp Overgeneralisation +helpten hielpen Overgeneralisation +hielpte hielp Irregular form plus regular suffix +hielpten hielpen Irregular form plus regular suffix +gehelpt geholpen Overgeneralisation +ehelpt geholpen Overgeneralisation +helpt geholpen Overgeneralisation +gehelpte geholpene Overgeneralisation+ +ehelpte geholpene Overgeneralisation+Prefix ge without onset +gehelpen geholpen Wrong -en suffix +ehelpen geholpen Wrong -en suffix +helpen geholpen Wrong -en suffix +geholpt geholpen Overgeneralisation +eholpen geholpen Prefix ge without onset +holpen geholpen Lacking ge prefix +geheet geheten Overgeneralisation +eheet geheten Overgeneralisation +heet geheten Overgeneralisation +gehete gehetene Overgeneralisation+ +ehete gehetene Overgeneralisation+Prefix ge without onset +eheten geheten Prefix ge without onset +heten geheten Lacking ge prefix +hijste hees Overgeneralisation +hijsten hesen Overgeneralisation +heeste hees Irregular form plus regular suffix +heesten hesen Irregular form plus regular suffix +gehijst gehesen Overgeneralisation +ehijst gehesen Overgeneralisation +hijst gehesen Overgeneralisation +gehijste gehesene Overgeneralisation+ +ehijste gehesene Overgeneralisation+Prefix ge without onset +gehijsen gehesen Wrong -en suffix +ehijsen gehesen Wrong -en suffix +hijsen gehesen Wrong -en suffix +geheest gehesen Overgeneralisation +ehesen gehesen Prefix ge without onset +hesen gehesen Lacking ge prefix +gehoefd gehoeven Overgeneralisation +ehoefd gehoeven Overgeneralisation+Prefix ge without onset +hoefd gehoeven Overgeneralisation+Lacking ge prefix +gehoefde gehoevene Overgeneralisation+ +ehoefde gehoevene Overgeneralisation+Prefix ge without onset +gehoeft gehoeven Overgeneralisation +ehoeft gehoeven Overgeneralisation +hoeft gehoeven Overgeneralisation +gehoefen gehoeven Wrong -en suffix +ehoefen gehoeven Wrong -en suffix +hoefen gehoeven Wrong -en suffix +ehoeven gehoeven Prefix ge without onset +hoeven gehoeven Lacking ge prefix +houdde hield Overgeneralisation +houdden hielden Overgeneralisation +hieldde hield Irregular form plus regular suffix +hieldden hielden Irregular form plus regular suffix +gehoud gehouden Overgeneralisation +ehoud gehouden Overgeneralisation +houd gehouden Overgeneralisation +gehoude gehoudene Overgeneralisation+ +ehoude gehoudene Overgeneralisation+Prefix ge without onset +ehouden gehouden Prefix ge without onset +houden gehouden Lacking ge prefix +houwde hieuw Overgeneralisation +houwden hieuwen Overgeneralisation +hieuwde hieuw Irregular form plus regular suffix +hieuwden hieuwen Irregular form plus regular suffix +gehouwd gehouwen Overgeneralisation +ehouwd gehouwen Overgeneralisation+Prefix ge without onset +houwd gehouwen Overgeneralisation+Lacking ge prefix +gehouwde gehouwene Overgeneralisation+ +ehouwde gehouwene Overgeneralisation+Prefix ge without onset +gehouwt gehouwen Overgeneralisation +ehouwt gehouwen Overgeneralisation +houwt gehouwen Overgeneralisation +ehouwen gehouwen Prefix ge without onset +houwen gehouwen Lacking ge prefix +ejaagd gejaagd Prefix ge without onset +jaagd gejaagd Lacking ge prefix +ejaagde gejaagde Overgeneralisation+Prefix ge without onset +gejaagt gejaagd Overgeneralisation +ejaagt gejaagd Overgeneralisation +jaagt gejaagd Overgeneralisation +gejagen gejaagd Wrong -en suffix +ejagen gejaagd Wrong -en suffix +jagen gejaagd Wrong -en suffix +kiesde koos Overgeneralisation +kiesden kozen Overgeneralisation +koosde koos Irregular form plus regular suffix +koosden kozen Irregular form plus regular suffix +gekiesd gekozen Overgeneralisation+ +ekiesd gekozen Overgeneralisation+Prefix ge without onset +kiesd gekozen Overgeneralisation+Lacking ge prefix +gekiesde gekozene Overgeneralisation+ +ekiesde gekozene Overgeneralisation+Prefix ge without onset +gekiest gekozen Overgeneralisation +ekiest gekozen Overgeneralisation +kiest gekozen Overgeneralisation +gekiesen gekozen Wrong -en suffix +ekiesen gekozen Wrong -en suffix +kiesen gekozen Wrong -en suffix +gekoost gekozen Overgeneralisation +ekozen gekozen Prefix ge without onset +kozen gekozen Lacking ge prefix +kijkte keek Overgeneralisation +kijkten keken Overgeneralisation +keekte keek Irregular form plus regular suffix +keekten keken Irregular form plus regular suffix +gekijkt gekeken Overgeneralisation +ekijkt gekeken Overgeneralisation +kijkt gekeken Overgeneralisation +gekijkte gekekene Overgeneralisation+ +ekijkte gekekene Overgeneralisation+Prefix ge without onset +gekijken gekeken Wrong -en suffix +ekijken gekeken Wrong -en suffix +kijken gekeken Wrong -en suffix +gekeekt gekeken Overgeneralisation +ekeken gekeken Prefix ge without onset +keken gekeken Lacking ge prefix +klimde klom Overgeneralisation +klimden klommen Overgeneralisation +klomde klom Irregular form plus regular suffix +klomden klommen Irregular form plus regular suffix +geklimd geklommen Overgeneralisation+ +eklimd geklommen Overgeneralisation+Prefix ge without onset +klimd geklommen Overgeneralisation+Lacking ge prefix +geklimde geklommene Overgeneralisation+ +eklimde geklommene Overgeneralisation+Prefix ge without onset +geklimt geklommen Overgeneralisation +eklimt geklommen Overgeneralisation +klimt geklommen Overgeneralisation +geklimmen geklommen Wrong -en suffix +eklimmen geklommen Wrong -en suffix +klimmen geklommen Wrong -en suffix +geklomt geklommen Overgeneralisation +eklommen geklommen Prefix ge without onset +klommen geklommen Lacking ge prefix +klinkte klonk Overgeneralisation +klinkten klonken Overgeneralisation +klonkte klonk Irregular form plus regular suffix +klonkten klonken Irregular form plus regular suffix +geklinkt geklonken Overgeneralisation +eklinkt geklonken Overgeneralisation +klinkt geklonken Overgeneralisation +geklinkte geklonkene Overgeneralisation+ +eklinkte geklonkene Overgeneralisation+Prefix ge without onset +geklinken geklonken Wrong -en suffix +eklinken geklonken Wrong -en suffix +klinken geklonken Wrong -en suffix +geklonkt geklonken Overgeneralisation +eklonken geklonken Prefix ge without onset +klonken geklonken Lacking ge prefix +kluifde kloof Overgeneralisation +kluifden kloven Overgeneralisation +kloofde kloof Irregular form plus regular suffix +kloofden kloven Irregular form plus regular suffix +gekluifd gekloven Overgeneralisation+ +ekluifd gekloven Overgeneralisation+Prefix ge without onset +kluifd gekloven Overgeneralisation+Lacking ge prefix +gekluifde geklovene Overgeneralisation+ +ekluifde geklovene Overgeneralisation+Prefix ge without onset +gekluift gekloven Overgeneralisation +ekluift gekloven Overgeneralisation +kluift gekloven Overgeneralisation +gekluifen gekloven Wrong -en suffix +ekluifen gekloven Wrong -en suffix +kluifen gekloven Wrong -en suffix +geklooft gekloven Overgeneralisation +ekloven gekloven Prefix ge without onset +kloven gekloven Lacking ge prefix +knijpte kneep Overgeneralisation +knijpten knepen Overgeneralisation +kneepte kneep Irregular form plus regular suffix +kneepten knepen Irregular form plus regular suffix +geknijpt geknepen Overgeneralisation +eknijpt geknepen Overgeneralisation +knijpt geknepen Overgeneralisation +geknijpte geknepene Overgeneralisation+ +eknijpte geknepene Overgeneralisation+Prefix ge without onset +geknijpen geknepen Wrong -en suffix +eknijpen geknepen Wrong -en suffix +knijpen geknepen Wrong -en suffix +gekneept geknepen Overgeneralisation +eknepen geknepen Prefix ge without onset +knepen geknepen Lacking ge prefix +koopte kocht Overgeneralisation +koopten kochten Overgeneralisation +kochtte kocht Irregular form plus regular suffix +kochtten kochten Irregular form plus regular suffix +gekoopt gekocht Overgeneralisation +ekoopt gekocht Overgeneralisation +koopt gekocht Overgeneralisation +gekoopte gekochte Overgeneralisation+ +ekoopte gekochte Overgeneralisation+Prefix ge without onset +gekopen gekocht Wrong -en suffix +ekopen gekocht Wrong -en suffix +kopen gekocht Wrong -en suffix +ekocht gekocht Prefix ge without onset +kocht gekocht Lacking ge prefix +krijgde kreeg Overgeneralisation +krijgden kregen Overgeneralisation +kreegde kreeg Irregular form plus regular suffix +kreegden kregen Irregular form plus regular suffix +gekrijgd gekregen Overgeneralisation+ +ekrijgd gekregen Overgeneralisation+Prefix ge without onset +krijgd gekregen Overgeneralisation+Lacking ge prefix +gekrijgde gekregene Overgeneralisation+ +ekrijgde gekregene Overgeneralisation+Prefix ge without onset +gekrijgt gekregen Overgeneralisation +ekrijgt gekregen Overgeneralisation +krijgt gekregen Overgeneralisation +gekrijgen gekregen Wrong -en suffix +ekrijgen gekregen Wrong -en suffix +krijgen gekregen Wrong -en suffix +gekreegd gekregen Overgeneralisation +gekreegt gekregen Overgeneralisation +ekregen gekregen Prefix ge without onset +kregen gekregen Lacking ge prefix +krimpte kromp Overgeneralisation +krimpten krompen Overgeneralisation +krompte kromp Irregular form plus regular suffix +krompten krompen Irregular form plus regular suffix +gekrimpt gekrompen Overgeneralisation +ekrimpt gekrompen Overgeneralisation +krimpt gekrompen Overgeneralisation +gekrimpte gekrompene Overgeneralisation+ +ekrimpte gekrompene Overgeneralisation+Prefix ge without onset +gekrimpen gekrompen Wrong -en suffix +ekrimpen gekrompen Wrong -en suffix +krimpen gekrompen Wrong -en suffix +gekrompt gekrompen Overgeneralisation +ekrompen gekrompen Prefix ge without onset +krompen gekrompen Lacking ge prefix +kruipte kroop Overgeneralisation +kruipten kropen Overgeneralisation +kroopte kroop Irregular form plus regular suffix +kroopten kropen Irregular form plus regular suffix +gekruipt gekropen Overgeneralisation +ekruipt gekropen Overgeneralisation +kruipt gekropen Overgeneralisation +gekruipte gekropene Overgeneralisation+ +ekruipte gekropene Overgeneralisation+Prefix ge without onset +gekruipen gekropen Wrong -en suffix +ekruipen gekropen Wrong -en suffix +kruipen gekropen Wrong -en suffix +gekroopt gekropen Overgeneralisation +ekropen gekropen Prefix ge without onset +kropen gekropen Lacking ge prefix +kwijtte kweet Overgeneralisation +kwijtten kweten Overgeneralisation +kweette kweet Irregular form plus regular suffix +kweetten kweten Irregular form plus regular suffix +gekwijt gekweten Overgeneralisation +ekwijt gekweten Overgeneralisation +kwijt gekweten Overgeneralisation +gekwijte gekwetene Overgeneralisation+ +ekwijte gekwetene Overgeneralisation+Prefix ge without onset +gekwijten gekweten Wrong -en suffix +ekwijten gekweten Wrong -en suffix +kwijten gekweten Wrong -en suffix +gekweet gekweten Overgeneralisation +ekweten gekweten Prefix ge without onset +kweten gekweten Lacking ge prefix +lachde lachte Overgeneralisation +lachden lachten Overgeneralisation +gelachd gelachen Overgeneralisation +elachd gelachen Overgeneralisation+Prefix ge without onset +lachd gelachen Overgeneralisation+Lacking ge prefix +gelachde gelachene Overgeneralisation+ +elachde gelachene Overgeneralisation+Prefix ge without onset +gelacht gelachen Overgeneralisation +elacht gelachen Overgeneralisation +lacht gelachen Overgeneralisation +elachen gelachen Prefix ge without onset +lachen gelachen Lacking ge prefix +gelaad geladen Overgeneralisation +elaad geladen Overgeneralisation +laad geladen Overgeneralisation +gelade geladene Overgeneralisation+ +elade geladene Overgeneralisation+Prefix ge without onset +eladen geladen Prefix ge without onset +laden geladen Lacking ge prefix +laatte liet Overgeneralisation +laatten lieten Overgeneralisation +liette liet Irregular form plus regular suffix +lietten lieten Irregular form plus regular suffix +gelaat gelaten Overgeneralisation +elaat gelaten Overgeneralisation +laat gelaten Overgeneralisation +gelate gelatene Overgeneralisation+ +elate gelatene Overgeneralisation+Prefix ge without onset +elaten gelaten Prefix ge without onset +laten gelaten Lacking ge prefix +leesde las Overgeneralisation +leesden lazen Overgeneralisation +lasde las Irregular form plus regular suffix +lasden lazen Irregular form plus regular suffix +geleesd gelezen Overgeneralisation +eleesd gelezen Overgeneralisation+Prefix ge without onset +leesd gelezen Overgeneralisation+Lacking ge prefix +geleesde gelezene Overgeneralisation+ +eleesde gelezene Overgeneralisation+Prefix ge without onset +geleest gelezen Overgeneralisation +eleest gelezen Overgeneralisation +leest gelezen Overgeneralisation +gelesen gelezen Wrong -en suffix +elesen gelezen Wrong -en suffix +lesen gelezen Wrong -en suffix +elezen gelezen Prefix ge without onset +lezen gelezen Lacking ge prefix +liegde loog Overgeneralisation +liegden logen Overgeneralisation +loogde loog Irregular form plus regular suffix +loogden logen Irregular form plus regular suffix +geliegd gelogen Overgeneralisation+ +eliegd gelogen Overgeneralisation+Prefix ge without onset +liegd gelogen Overgeneralisation+Lacking ge prefix +geliegde gelogene Overgeneralisation+ +eliegde gelogene Overgeneralisation+Prefix ge without onset +geliegt gelogen Overgeneralisation +eliegt gelogen Overgeneralisation +liegt gelogen Overgeneralisation +geliegen gelogen Wrong -en suffix +eliegen gelogen Wrong -en suffix +liegen gelogen Wrong -en suffix +geloogt gelogen Overgeneralisation +elogen gelogen Prefix ge without onset +logen gelogen Lacking ge prefix +ligde lag Overgeneralisation +ligden lagen Overgeneralisation +lagde lag Irregular form plus regular suffix +lagden lagen Irregular form plus regular suffix +geligd gelegen Overgeneralisation+ +eligd gelegen Overgeneralisation+Prefix ge without onset +ligd gelegen Overgeneralisation+Lacking ge prefix +geligde gelegene Overgeneralisation+ +eligde gelegene Overgeneralisation+Prefix ge without onset +geligt gelegen Overgeneralisation +eligt gelegen Overgeneralisation +ligt gelegen Overgeneralisation +geliggen gelegen Wrong -en suffix +eliggen gelegen Wrong -en suffix +liggen gelegen Wrong -en suffix +geleegd gelegen Overgeneralisation +geleegt gelegen Overgeneralisation +elegen gelegen Prefix ge without onset +legen gelegen Lacking ge prefix +lijdde leed Overgeneralisation +lijdden leden Overgeneralisation +leedde leed Irregular form plus regular suffix +leedden leden Irregular form plus regular suffix +gelijd geleden Overgeneralisation +elijd geleden Overgeneralisation +lijd geleden Overgeneralisation +gelijde geledene Overgeneralisation+ +elijde geledene Overgeneralisation+Prefix ge without onset +gelijden geleden Wrong -en suffix +elijden geleden Wrong -en suffix +lijden geleden Wrong -en suffix +geleed geleden Overgeneralisation +eleden geleden Prefix ge without onset +leden geleden Lacking ge prefix +lijkte leek Overgeneralisation +lijkten leken Overgeneralisation +leekte leek Irregular form plus regular suffix +leekten leken Irregular form plus regular suffix +gelijkt geleken Overgeneralisation +elijkt geleken Overgeneralisation +lijkt geleken Overgeneralisation +gelijkte gelekene Overgeneralisation+ +elijkte gelekene Overgeneralisation+Prefix ge without onset +gelijken geleken Wrong -en suffix +elijken geleken Wrong -en suffix +lijken geleken Wrong -en suffix +geleekt geleken Overgeneralisation +eleken geleken Prefix ge without onset +leken geleken Lacking ge prefix +loopte liep Overgeneralisation +loopten liepen Overgeneralisation +liepte liep Irregular form plus regular suffix +liepten liepen Irregular form plus regular suffix +geloopt gelopen Overgeneralisation +eloopt gelopen Overgeneralisation +loopt gelopen Overgeneralisation +geloopte gelopene Overgeneralisation+ +eloopte gelopene Overgeneralisation+Prefix ge without onset +elopen gelopen Prefix ge without onset +lopen gelopen Lacking ge prefix +gemaald gemalen Overgeneralisation +emaald gemalen Overgeneralisation+Prefix ge without onset +maald gemalen Overgeneralisation+Lacking ge prefix +gemaalde gemalene Overgeneralisation+ +emaalde gemalene Overgeneralisation+Prefix ge without onset +gemaalt gemalen Overgeneralisation +emaalt gemalen Overgeneralisation +maalt gemalen Overgeneralisation +emalen gemalen Prefix ge without onset +malen gemalen Lacking ge prefix +emelkt gemelkt Prefix ge without onset +melkt gemelkt Lacking ge prefix +emelkte gemelkte Overgeneralisation+Prefix ge without onset +gemelken gemelkt Wrong -en suffix +emelken gemelkt Wrong -en suffix +melken gemelkt Wrong -en suffix +meette mat Overgeneralisation +meetten maten Overgeneralisation +matte mat Irregular form plus regular suffix +matten maten Irregular form plus regular suffix +gemeet gemeten Overgeneralisation +emeet gemeten Overgeneralisation +meet gemeten Overgeneralisation +gemete gemetene Overgeneralisation+ +emete gemetene Overgeneralisation+Prefix ge without onset +emeten gemeten Prefix ge without onset +meten gemeten Lacking ge prefix +mijdde meed Overgeneralisation +mijdden meden Overgeneralisation +meedde meed Irregular form plus regular suffix +meedden meden Irregular form plus regular suffix +gemijd gemeden Overgeneralisation +emijd gemeden Overgeneralisation +mijd gemeden Overgeneralisation +gemijde gemedene Overgeneralisation+ +emijde gemedene Overgeneralisation+Prefix ge without onset +gemijden gemeden Wrong -en suffix +emijden gemeden Wrong -en suffix +mijden gemeden Wrong -en suffix +gemeed gemeden Overgeneralisation +emeden gemeden Prefix ge without onset +meden gemeden Lacking ge prefix +moette moest Overgeneralisation +moetten moesten Overgeneralisation +moestte moest Irregular form plus regular suffix +moestten moesten Irregular form plus regular suffix +gemoet gemoeten Overgeneralisation +emoet gemoeten Overgeneralisation +moet gemoeten Overgeneralisation +gemoete gemoetene Overgeneralisation+ +emoete gemoetene Overgeneralisation+Prefix ge without onset +emoeten gemoeten Prefix ge without onset +moeten gemoeten Lacking ge prefix +neemde nam Overgeneralisation +neemden namen Overgeneralisation +namde nam Irregular form plus regular suffix +namden namen Irregular form plus regular suffix +geneemd genomen Overgeneralisation+ +eneemd genomen Overgeneralisation+Prefix ge without onset +neemd genomen Overgeneralisation+Lacking ge prefix +geneemde genomene Overgeneralisation+ +eneemde genomene Overgeneralisation+Prefix ge without onset +geneemt genomen Overgeneralisation +eneemt genomen Overgeneralisation +neemt genomen Overgeneralisation +genemen genomen Wrong -en suffix +enemen genomen Wrong -en suffix +nemen genomen Wrong -en suffix +genoomt genomen Overgeneralisation +enomen genomen Prefix ge without onset +nomen genomen Lacking ge prefix +nijgde neeg Overgeneralisation +nijgden negen Overgeneralisation +neegde neeg Irregular form plus regular suffix +neegden negen Irregular form plus regular suffix +genijgd genegen Overgeneralisation+ +enijgd genegen Overgeneralisation+Prefix ge without onset +nijgd genegen Overgeneralisation+Lacking ge prefix +genijgde genegene Overgeneralisation+ +enijgde genegene Overgeneralisation+Prefix ge without onset +genijgt genegen Overgeneralisation +enijgt genegen Overgeneralisation +nijgt genegen Overgeneralisation +genijgen genegen Wrong -en suffix +enijgen genegen Wrong -en suffix +nijgen genegen Wrong -en suffix +geneegd genegen Overgeneralisation +geneegt genegen Overgeneralisation +enegen genegen Prefix ge without onset +negen genegen Lacking ge prefix +ontginde ontgonnene Overgeneralisation +ontginden ontgonnen Overgeneralisation +ontgonde ontgon Irregular form plus regular suffix +ontgonden ontgonnen Irregular form plus regular suffix +ontgind ontgonnen Overgeneralisation +ontgint ontgonnen Overgeneralisation +ontginnen ontgonnen Wrong -en suffix +ontgont ontgonnen Overgeneralisation +ontluikte ontlokene Overgeneralisation +ontluikten ontloken Overgeneralisation +ontlookte ontlook Irregular form plus regular suffix +ontlookten ontloken Irregular form plus regular suffix +ontluikt ontloken Overgeneralisation +ontluiken ontloken Wrong -en suffix +ontlookt ontloken Overgeneralisation +pluisde ploos Overgeneralisation +pluisden plozen Overgeneralisation +ploosde ploos Irregular form plus regular suffix +ploosden plozen Irregular form plus regular suffix +gepluisd geplozen Overgeneralisation+ +epluisd geplozen Overgeneralisation+Prefix ge without onset +pluisd geplozen Overgeneralisation+Lacking ge prefix +gepluisde geplozene Overgeneralisation+ +epluisde geplozene Overgeneralisation+Prefix ge without onset +gepluist geplozen Overgeneralisation +epluist geplozen Overgeneralisation +pluist geplozen Overgeneralisation +gepluisen geplozen Wrong -en suffix +epluisen geplozen Wrong -en suffix +pluisen geplozen Wrong -en suffix +geploost geplozen Overgeneralisation +eplozen geplozen Prefix ge without onset +plozen geplozen Lacking ge prefix +prijsde prees Overgeneralisation +prijsden prezen Overgeneralisation +preesde prees Irregular form plus regular suffix +preesden prezen Irregular form plus regular suffix +geprijsd geprezen Overgeneralisation+ +eprijsd geprezen Overgeneralisation+Prefix ge without onset +prijsd geprezen Overgeneralisation+Lacking ge prefix +geprijsde geprezene Overgeneralisation+ +eprijsde geprezene Overgeneralisation+Prefix ge without onset +geprijst geprezen Overgeneralisation +eprijst geprezen Overgeneralisation +prijst geprezen Overgeneralisation +geprijsen geprezen Wrong -en suffix +eprijsen geprezen Wrong -en suffix +prijsen geprezen Wrong -en suffix +gepreesd geprezen Overgeneralisation +gepreest geprezen Overgeneralisation +eprezen geprezen Prefix ge without onset +prezen geprezen Lacking ge prefix +geraad geraden Overgeneralisation +eraad geraden Overgeneralisation +raad geraden Overgeneralisation +gerade geradene Overgeneralisation+ +erade geradene Overgeneralisation+Prefix ge without onset +eraden geraden Prefix ge without onset +raden geraden Lacking ge prefix +verraad verraden Overgeneralisation +verrade verradene Overgeneralisation +rijdde reed Overgeneralisation +rijdden reden Overgeneralisation +reedde reed Irregular form plus regular suffix +reedden reden Irregular form plus regular suffix +gerijd gereden Overgeneralisation +erijd gereden Overgeneralisation +rijd gereden Overgeneralisation +gerijde geredene Overgeneralisation+ +erijde geredene Overgeneralisation+Prefix ge without onset +gerijden gereden Wrong -en suffix +erijden gereden Wrong -en suffix +rijden gereden Wrong -en suffix +gereed gereden Overgeneralisation +ereden gereden Prefix ge without onset +reden gereden Lacking ge prefix +rijgde reeg Overgeneralisation +rijgden regen Overgeneralisation +reegde reeg Irregular form plus regular suffix +reegden regen Irregular form plus regular suffix +gerijgd geregen Overgeneralisation+ +erijgd geregen Overgeneralisation+Prefix ge without onset +rijgd geregen Overgeneralisation+Lacking ge prefix +gerijgde geregene Overgeneralisation+ +erijgde geregene Overgeneralisation+Prefix ge without onset +gerijgt geregen Overgeneralisation +erijgt geregen Overgeneralisation +rijgt geregen Overgeneralisation +gerijgen geregen Wrong -en suffix +erijgen geregen Wrong -en suffix +rijgen geregen Wrong -en suffix +gereegd geregen Overgeneralisation +gereegt geregen Overgeneralisation +eregen geregen Prefix ge without onset +regen geregen Lacking ge prefix +rijtte reet Overgeneralisation +rijtten reten Overgeneralisation +reette reet Irregular form plus regular suffix +reetten reten Irregular form plus regular suffix +gerijt gereten Overgeneralisation +erijt gereten Overgeneralisation +rijt gereten Overgeneralisation +gerijte geretene Overgeneralisation+ +erijte geretene Overgeneralisation+Prefix ge without onset +gerijten gereten Wrong -en suffix +erijten gereten Wrong -en suffix +rijten gereten Wrong -en suffix +gereet gereten Overgeneralisation +ereten gereten Prefix ge without onset +reten gereten Lacking ge prefix +rijsde rees Overgeneralisation +rijsden rezen Overgeneralisation +reesde rees Irregular form plus regular suffix +reesden rezen Irregular form plus regular suffix +gerijsd Gerezen Overgeneralisation+ +erijsd Gerezen Overgeneralisation+Prefix ge without onset +rijsd Gerezen Overgeneralisation+Lacking ge prefix +gerijsde Gerezene Overgeneralisation+ +erijsde Gerezene Overgeneralisation+Prefix ge without onset +gerijst Gerezen Overgeneralisation +erijst Gerezen Overgeneralisation +rijst Gerezen Overgeneralisation +gerijsen Gerezen Wrong -en suffix +erijsen Gerezen Wrong -en suffix +rijsen Gerezen Wrong -en suffix +geGereesd Gerezen Overgeneralisation +geGereest Gerezen Overgeneralisation +roepte riep Overgeneralisation +roepten riepen Overgeneralisation +riepte riep Irregular form plus regular suffix +riepten riepen Irregular form plus regular suffix +geroept geroepen Overgeneralisation +eroept geroepen Overgeneralisation +roept geroepen Overgeneralisation +geroepte geroepene Overgeneralisation+ +eroepte geroepene Overgeneralisation+Prefix ge without onset +eroepen geroepen Prefix ge without onset +roepen geroepen Lacking ge prefix +ruikte rook Overgeneralisation +ruikten roken Overgeneralisation +rookte rook Irregular form plus regular suffix +rookten roken Irregular form plus regular suffix +geruikt geroken Overgeneralisation +eruikt geroken Overgeneralisation +ruikt geroken Overgeneralisation +geruikte gerokene Overgeneralisation+ +eruikte gerokene Overgeneralisation+Prefix ge without onset +geruiken geroken Wrong -en suffix +eruiken geroken Wrong -en suffix +ruiken geroken Wrong -en suffix +gerookt geroken Overgeneralisation +eroken geroken Prefix ge without onset +roken geroken Lacking ge prefix +gescheid gescheiden Overgeneralisation +escheid gescheiden Overgeneralisation +scheid gescheiden Overgeneralisation +gescheide gescheidene Overgeneralisation+ +escheide gescheidene Overgeneralisation+Prefix ge without onset +escheiden gescheiden Prefix ge without onset +scheiden gescheiden Lacking ge prefix +scheldde schold Overgeneralisation +scheldden scholden Overgeneralisation +scholdde schold Irregular form plus regular suffix +scholdden scholden Irregular form plus regular suffix +gescheld gescholden Overgeneralisation +escheld gescholden Overgeneralisation +scheld gescholden Overgeneralisation +geschelde gescholdene Overgeneralisation+ +eschelde gescholdene Overgeneralisation+Prefix ge without onset +geschelden gescholden Wrong -en suffix +eschelden gescholden Wrong -en suffix +schelden gescholden Wrong -en suffix +geschold gescholden Overgeneralisation +escholden gescholden Prefix ge without onset +scholden gescholden Lacking ge prefix +schendde schond Overgeneralisation +schendden schonden Overgeneralisation +schondde schond Irregular form plus regular suffix +schondden schonden Irregular form plus regular suffix +geschend geschonden Overgeneralisation +eschend geschonden Overgeneralisation +schend geschonden Overgeneralisation +geschende geschondene Overgeneralisation+ +eschende geschondene Overgeneralisation+Prefix ge without onset +geschenden geschonden Wrong -en suffix +eschenden geschonden Wrong -en suffix +schenden geschonden Wrong -en suffix +geschond geschonden Overgeneralisation +eschonden geschonden Prefix ge without onset +schonden geschonden Lacking ge prefix +schenkte schonk Overgeneralisation +schenkten schonken Overgeneralisation +schonkte schonk Irregular form plus regular suffix +schonkten schonken Irregular form plus regular suffix +geschenkt geschonken Overgeneralisation +eschenkt geschonken Overgeneralisation +schenkt geschonken Overgeneralisation +geschenkte geschonkene Overgeneralisation+ +eschenkte geschonkene Overgeneralisation+Prefix ge without onset +geschenken geschonken Wrong -en suffix +eschenken geschonken Wrong -en suffix +schenken geschonken Wrong -en suffix +geschonkt geschonken Overgeneralisation +eschonken geschonken Prefix ge without onset +schonken geschonken Lacking ge prefix +schepte shiep Overgeneralisation +schepten schiepen Overgeneralisation +shiepte shiep Irregular form plus regular suffix +shiepten schiepen Irregular form plus regular suffix +geschept geschapen Overgeneralisation +eschept geschapen Overgeneralisation +schept geschapen Overgeneralisation +geschepte geschapene Overgeneralisation+ +eschepte geschapene Overgeneralisation+Prefix ge without onset +gescheppen geschapen Wrong -en suffix +escheppen geschapen Wrong -en suffix +scheppen geschapen Wrong -en suffix +geschaapt geschapen Overgeneralisation +eschapen geschapen Prefix ge without onset +schapen geschapen Lacking ge prefix +gescheerd geschoren Overgeneralisation+ +escheerd geschoren Overgeneralisation+Prefix ge without onset +scheerd geschoren Overgeneralisation+Lacking ge prefix +gescheerde geschorene Overgeneralisation+ +escheerde geschorene Overgeneralisation+Prefix ge without onset +gescheert geschoren Overgeneralisation +escheert geschoren Overgeneralisation +scheert geschoren Overgeneralisation +gescheren geschoren Wrong -en suffix +escheren geschoren Wrong -en suffix +scheren geschoren Wrong -en suffix +geschoort geschoren Overgeneralisation +eschoren geschoren Prefix ge without onset +schoren geschoren Lacking ge prefix +schiette schoot Overgeneralisation +schietten schoten Overgeneralisation +schootte schoot Irregular form plus regular suffix +schootten schoten Irregular form plus regular suffix +geschiet geschoten Overgeneralisation +eschiet geschoten Overgeneralisation +schiet geschoten Overgeneralisation +geschiete geschotene Overgeneralisation+ +eschiete geschotene Overgeneralisation+Prefix ge without onset +geschieten geschoten Wrong -en suffix +eschieten geschoten Wrong -en suffix +schieten geschoten Wrong -en suffix +geschoot geschoten Overgeneralisation +eschoten geschoten Prefix ge without onset +schoten geschoten Lacking ge prefix +schijnde scheen Overgeneralisation +schijnden schenen Overgeneralisation +scheende scheen Irregular form plus regular suffix +scheenden schenen Irregular form plus regular suffix +geschijnd geschenen Overgeneralisation+ +eschijnd geschenen Overgeneralisation+Prefix ge without onset +schijnd geschenen Overgeneralisation+Lacking ge prefix +geschijnde geschenene Overgeneralisation+ +eschijnde geschenene Overgeneralisation+Prefix ge without onset +geschijnt geschenen Overgeneralisation +eschijnt geschenen Overgeneralisation +schijnt geschenen Overgeneralisation +geschijnen geschenen Wrong -en suffix +eschijnen geschenen Wrong -en suffix +schijnen geschenen Wrong -en suffix +gescheend geschenen Overgeneralisation +gescheent geschenen Overgeneralisation +eschenen geschenen Prefix ge without onset +schenen geschenen Lacking ge prefix +schijtte scheet Overgeneralisation +schijtten scheten Overgeneralisation +scheette scheet Irregular form plus regular suffix +scheetten scheten Irregular form plus regular suffix +geschijt gescheten Overgeneralisation +eschijt gescheten Overgeneralisation +schijt gescheten Overgeneralisation +geschijte geschetene Overgeneralisation+ +eschijte geschetene Overgeneralisation+Prefix ge without onset +geschijten gescheten Wrong -en suffix +eschijten gescheten Wrong -en suffix +schijten gescheten Wrong -en suffix +gescheet gescheten Overgeneralisation +escheten gescheten Prefix ge without onset +scheten gescheten Lacking ge prefix +schrijfde schreef Overgeneralisation +schrijfden schreven Overgeneralisation +schreefde schreef Irregular form plus regular suffix +schreefden schreven Irregular form plus regular suffix +geschrijfd geschreven Overgeneralisation+ +eschrijfd geschreven Overgeneralisation+Prefix ge without onset +schrijfd geschreven Overgeneralisation+Lacking ge prefix +geschrijfde geschrevene Overgeneralisation+ +eschrijfde geschrevene Overgeneralisation+Prefix ge without onset +geschrijft geschreven Overgeneralisation +eschrijft geschreven Overgeneralisation +schrijft geschreven Overgeneralisation +geschrijfen geschreven Wrong -en suffix +eschrijfen geschreven Wrong -en suffix +schrijfen geschreven Wrong -en suffix +geschreefd geschreven Overgeneralisation +geschreeft geschreven Overgeneralisation +eschreven geschreven Prefix ge without onset +schreven geschreven Lacking ge prefix +schrikte schrok Overgeneralisation +schrikten schrokken Overgeneralisation +schrokte schrok Irregular form plus regular suffix +schrokten schrokken Irregular form plus regular suffix +geschrikt geschrokken Overgeneralisation +eschrikt geschrokken Overgeneralisation +schrikt geschrokken Overgeneralisation +geschrikte geschrokkene Overgeneralisation+ +eschrikte geschrokkene Overgeneralisation+Prefix ge without onset +geschrikken geschrokken Wrong -en suffix +eschrikken geschrokken Wrong -en suffix +schrikken geschrokken Wrong -en suffix +geschrokt geschrokken Overgeneralisation +eschrokken geschrokken Prefix ge without onset +schrokken geschrokken Lacking ge prefix +eschuild geschuild Prefix ge without onset +schuild geschuild Lacking ge prefix +eschuilde geschuilde Overgeneralisation+Prefix ge without onset +geschuilt geschuild Overgeneralisation +eschuilt geschuild Overgeneralisation +schuilt geschuild Overgeneralisation +geschuilen geschuild Wrong -en suffix +eschuilen geschuild Wrong -en suffix +schuilen geschuild Wrong -en suffix +schuifde schoof Overgeneralisation +schuifden schoven Overgeneralisation +schoofde schoof Irregular form plus regular suffix +schoofden schoven Irregular form plus regular suffix +geschuifd geschoven Overgeneralisation+ +eschuifd geschoven Overgeneralisation+Prefix ge without onset +schuifd geschoven Overgeneralisation+Lacking ge prefix +geschuifde geschovene Overgeneralisation+ +eschuifde geschovene Overgeneralisation+Prefix ge without onset +geschuift geschoven Overgeneralisation +eschuift geschoven Overgeneralisation +schuift geschoven Overgeneralisation +geschuifen geschoven Wrong -en suffix +eschuifen geschoven Wrong -en suffix +schuifen geschoven Wrong -en suffix +geschooft geschoven Overgeneralisation +eschoven geschoven Prefix ge without onset +schoven geschoven Lacking ge prefix +slade sloeg Overgeneralisation +sladen sloegen Overgeneralisation +sloegde sloeg Irregular form plus regular suffix +sloegden sloegen Irregular form plus regular suffix +geslaad geslagen Overgeneralisation+ +eslaad geslagen Overgeneralisation+Prefix ge without onset +slaad geslagen Overgeneralisation+Lacking ge prefix +geslade geslagene Overgeneralisation+ +eslade geslagene Overgeneralisation+Prefix ge without onset +geslaat geslagen Overgeneralisation +eslaat geslagen Overgeneralisation +slaat geslagen Overgeneralisation +geslaan geslagen Wrong -en suffix +eslaan geslagen Wrong -en suffix +slaan geslagen Wrong -en suffix +geslaagd geslagen Overgeneralisation +geslaagt geslagen Overgeneralisation +eslagen geslagen Prefix ge without onset +slagen geslagen Lacking ge prefix +slaapte sliep Overgeneralisation +slaapten sliepen Overgeneralisation +sliepte sliep Irregular form plus regular suffix +sliepten sliepen Irregular form plus regular suffix +geslaapt geslapen Overgeneralisation +eslaapt geslapen Overgeneralisation +slaapt geslapen Overgeneralisation +geslaapte geslapene Overgeneralisation+ +eslaapte geslapene Overgeneralisation+Prefix ge without onset +eslapen geslapen Prefix ge without onset +slapen geslapen Lacking ge prefix +slijpte sleep Overgeneralisation +slijpten slepen Overgeneralisation +sleepte sleep Irregular form plus regular suffix +sleepten slepen Irregular form plus regular suffix +geslijpt geslepen Overgeneralisation +eslijpt geslepen Overgeneralisation +slijpt geslepen Overgeneralisation +geslijpte geslepene Overgeneralisation+ +eslijpte geslepene Overgeneralisation+Prefix ge without onset +geslijpen geslepen Wrong -en suffix +eslijpen geslepen Wrong -en suffix +slijpen geslepen Wrong -en suffix +gesleept geslepen Overgeneralisation +eslepen geslepen Prefix ge without onset +slepen geslepen Lacking ge prefix +slijtte sleet Overgeneralisation +slijtten sleten Overgeneralisation +sleette sleet Irregular form plus regular suffix +sleetten sleten Irregular form plus regular suffix +geslijt gesleten Overgeneralisation +eslijt gesleten Overgeneralisation +slijt gesleten Overgeneralisation +geslijte gesletene Overgeneralisation+ +eslijte gesletene Overgeneralisation+Prefix ge without onset +geslijten gesleten Wrong -en suffix +eslijten gesleten Wrong -en suffix +slijten gesleten Wrong -en suffix +gesleet gesleten Overgeneralisation +esleten gesleten Prefix ge without onset +sleten gesleten Lacking ge prefix +slinkte slonk Overgeneralisation +slinkten slonken Overgeneralisation +slonkte slonk Irregular form plus regular suffix +slonkten slonken Irregular form plus regular suffix +geslinkt Geslonken Overgeneralisation +eslinkt Geslonken Overgeneralisation +slinkt Geslonken Overgeneralisation +geslinkte Geslonkene Overgeneralisation+ +eslinkte Geslonkene Overgeneralisation+Prefix ge without onset +geslinken Geslonken Wrong -en suffix +eslinken Geslonken Wrong -en suffix +slinken Geslonken Wrong -en suffix +geGeslonkt Geslonken Overgeneralisation +sluipte sloop Overgeneralisation +sluipten slopen Overgeneralisation +sloopte sloop Irregular form plus regular suffix +sloopten slopen Irregular form plus regular suffix +gesluipt geslopen Overgeneralisation +esluipt geslopen Overgeneralisation +sluipt geslopen Overgeneralisation +gesluipte geslopene Overgeneralisation+ +esluipte geslopene Overgeneralisation+Prefix ge without onset +gesluipen geslopen Wrong -en suffix +esluipen geslopen Wrong -en suffix +sluipen geslopen Wrong -en suffix +gesloopt geslopen Overgeneralisation +eslopen geslopen Prefix ge without onset +slopen geslopen Lacking ge prefix +sluitte sloot Overgeneralisation +sluitten sloten Overgeneralisation +slootte sloot Irregular form plus regular suffix +slootten sloten Irregular form plus regular suffix +gesluit gesloten Overgeneralisation +esluit gesloten Overgeneralisation +sluit gesloten Overgeneralisation +gesluite geslotene Overgeneralisation+ +esluite geslotene Overgeneralisation+Prefix ge without onset +gesluiten gesloten Wrong -en suffix +esluiten gesloten Wrong -en suffix +sluiten gesloten Wrong -en suffix +gesloot gesloten Overgeneralisation +esloten gesloten Prefix ge without onset +sloten gesloten Lacking ge prefix +smeltte smolt Overgeneralisation +smeltten smolten Overgeneralisation +smoltte smolt Irregular form plus regular suffix +smoltten smolten Irregular form plus regular suffix +gesmelt gesmolten Overgeneralisation +esmelt gesmolten Overgeneralisation +smelt gesmolten Overgeneralisation +gesmelte gesmoltene Overgeneralisation+ +esmelte gesmoltene Overgeneralisation+Prefix ge without onset +gesmelten gesmolten Wrong -en suffix +esmelten gesmolten Wrong -en suffix +smelten gesmolten Wrong -en suffix +gesmolt gesmolten Overgeneralisation +esmolten gesmolten Prefix ge without onset +smolten gesmolten Lacking ge prefix +smijtte smeet Overgeneralisation +smijtten smeten Overgeneralisation +smeette smeet Irregular form plus regular suffix +smeetten smeten Irregular form plus regular suffix +gesmijt gesmeten Overgeneralisation +esmijt gesmeten Overgeneralisation +smijt gesmeten Overgeneralisation +gesmijte gesmetene Overgeneralisation+ +esmijte gesmetene Overgeneralisation+Prefix ge without onset +gesmijten gesmeten Wrong -en suffix +esmijten gesmeten Wrong -en suffix +smijten gesmeten Wrong -en suffix +gesmeet gesmeten Overgeneralisation +esmeten gesmeten Prefix ge without onset +smeten gesmeten Lacking ge prefix +snijdde sneed Overgeneralisation +snijdden sneden Overgeneralisation +sneedde sneed Irregular form plus regular suffix +sneedden sneden Irregular form plus regular suffix +gesnijd gesneden Overgeneralisation +esnijd gesneden Overgeneralisation +snijd gesneden Overgeneralisation +gesnijde gesnedene Overgeneralisation+ +esnijde gesnedene Overgeneralisation+Prefix ge without onset +gesnijden gesneden Wrong -en suffix +esnijden gesneden Wrong -en suffix +snijden gesneden Wrong -en suffix +gesneed gesneden Overgeneralisation +esneden gesneden Prefix ge without onset +sneden gesneden Lacking ge prefix +snuitte snoot Overgeneralisation +snuitten snoten Overgeneralisation +snootte snoot Irregular form plus regular suffix +snootten snoten Irregular form plus regular suffix +gesnuit gesnoten Overgeneralisation +esnuit gesnoten Overgeneralisation +snuit gesnoten Overgeneralisation +gesnuite gesnotene Overgeneralisation+ +esnuite gesnotene Overgeneralisation+Prefix ge without onset +gesnuiten gesnoten Wrong -en suffix +esnuiten gesnoten Wrong -en suffix +snuiten gesnoten Wrong -en suffix +gesnoot gesnoten Overgeneralisation +esnoten gesnoten Prefix ge without onset +snoten gesnoten Lacking ge prefix +snuifde snoof Overgeneralisation +snuifden snoven Overgeneralisation +snoofde snoof Irregular form plus regular suffix +snoofden snoven Irregular form plus regular suffix +gesnuifd gesnoven Overgeneralisation+ +esnuifd gesnoven Overgeneralisation+Prefix ge without onset +snuifd gesnoven Overgeneralisation+Lacking ge prefix +gesnuifde gesnovene Overgeneralisation+ +esnuifde gesnovene Overgeneralisation+Prefix ge without onset +gesnuift gesnoven Overgeneralisation +esnuift gesnoven Overgeneralisation +snuift gesnoven Overgeneralisation +gesnuifen gesnoven Wrong -en suffix +esnuifen gesnoven Wrong -en suffix +snuifen gesnoven Wrong -en suffix +gesnooft gesnoven Overgeneralisation +esnoven gesnoven Prefix ge without onset +snoven gesnoven Lacking ge prefix +gespand gespannen Overgeneralisation +espand gespannen Overgeneralisation+Prefix ge without onset +spand gespannen Overgeneralisation+Lacking ge prefix +gespande gespannene Overgeneralisation+ +espande gespannene Overgeneralisation+Prefix ge without onset +gespant gespannen Overgeneralisation +espant gespannen Overgeneralisation +spant gespannen Overgeneralisation +espannen gespannen Prefix ge without onset +spannen gespannen Lacking ge prefix +spijtte speet Overgeneralisation +spijtten speten Overgeneralisation +speette speet Irregular form plus regular suffix +speetten speten Irregular form plus regular suffix +gespijt gespeten Overgeneralisation +espijt gespeten Overgeneralisation +spijt gespeten Overgeneralisation +gespijte gespetene Overgeneralisation+ +espijte gespetene Overgeneralisation+Prefix ge without onset +gespijten gespeten Wrong -en suffix +espijten gespeten Wrong -en suffix +spijten gespeten Wrong -en suffix +gespeet gespeten Overgeneralisation +espeten gespeten Prefix ge without onset +speten gespeten Lacking ge prefix +spinde spon Overgeneralisation +spinden sponnen Overgeneralisation +sponde spon Irregular form plus regular suffix +sponden sponnen Irregular form plus regular suffix +gespind gesponnen Overgeneralisation+ +espind gesponnen Overgeneralisation+Prefix ge without onset +spind gesponnen Overgeneralisation+Lacking ge prefix +gespinde gesponnene Overgeneralisation+ +espinde gesponnene Overgeneralisation+Prefix ge without onset +gespint gesponnen Overgeneralisation +espint gesponnen Overgeneralisation +spint gesponnen Overgeneralisation +gespinnen gesponnen Wrong -en suffix +espinnen gesponnen Wrong -en suffix +spinnen gesponnen Wrong -en suffix +gespont gesponnen Overgeneralisation +esponnen gesponnen Prefix ge without onset +sponnen gesponnen Lacking ge prefix +splijtte spleet Overgeneralisation +splijtten spleten Overgeneralisation +spleette spleet Irregular form plus regular suffix +spleetten spleten Irregular form plus regular suffix +gesplijt gespleten Overgeneralisation +esplijt gespleten Overgeneralisation +splijt gespleten Overgeneralisation +gesplijte gespletene Overgeneralisation+ +esplijte gespletene Overgeneralisation+Prefix ge without onset +gesplijten gespleten Wrong -en suffix +esplijten gespleten Wrong -en suffix +splijten gespleten Wrong -en suffix +gespleet gespleten Overgeneralisation +espleten gespleten Prefix ge without onset +spleten gespleten Lacking ge prefix +spreekte sprak Overgeneralisation +spreekten spraken Overgeneralisation +sprakte sprak Irregular form plus regular suffix +sprakten spraken Irregular form plus regular suffix +gespreekt gesproken Overgeneralisation +espreekt gesproken Overgeneralisation +spreekt gesproken Overgeneralisation +gespreekte gesprokene Overgeneralisation+ +espreekte gesprokene Overgeneralisation+Prefix ge without onset +gespreken gesproken Wrong -en suffix +espreken gesproken Wrong -en suffix +spreken gesproken Wrong -en suffix +gesprookt gesproken Overgeneralisation +esproken gesproken Prefix ge without onset +sproken gesproken Lacking ge prefix +springde sprong Overgeneralisation +springden sprongen Overgeneralisation +sprongde sprong Irregular form plus regular suffix +sprongden sprongen Irregular form plus regular suffix +gespringd gesprongen Overgeneralisation+ +espringd gesprongen Overgeneralisation+Prefix ge without onset +springd gesprongen Overgeneralisation+Lacking ge prefix +gespringde gesprongene Overgeneralisation+ +espringde gesprongene Overgeneralisation+Prefix ge without onset +gespringt gesprongen Overgeneralisation +espringt gesprongen Overgeneralisation +springt gesprongen Overgeneralisation +gespringen gesprongen Wrong -en suffix +espringen gesprongen Wrong -en suffix +springen gesprongen Wrong -en suffix +gesprongd gesprongen Overgeneralisation +gesprongt gesprongen Overgeneralisation +esprongen gesprongen Prefix ge without onset +sprongen gesprongen Lacking ge prefix +spruitte sproot Overgeneralisation +spruitten sproten Overgeneralisation +sprootte sproot Irregular form plus regular suffix +sprootten sproten Irregular form plus regular suffix +gespruit gesproten Overgeneralisation +espruit gesproten Overgeneralisation +spruit gesproten Overgeneralisation +gespruite gesprotene Overgeneralisation+ +espruite gesprotene Overgeneralisation+Prefix ge without onset +gespruiten gesproten Wrong -en suffix +espruiten gesproten Wrong -en suffix +spruiten gesproten Wrong -en suffix +gesproot gesproten Overgeneralisation +esproten gesproten Prefix ge without onset +sproten gesproten Lacking ge prefix +spuitte spoot Overgeneralisation +spuitten spoten Overgeneralisation +spootte spoot Irregular form plus regular suffix +spootten spoten Irregular form plus regular suffix +gespuit gespoten Overgeneralisation +espuit gespoten Overgeneralisation +spuit gespoten Overgeneralisation +gespuite gespotene Overgeneralisation+ +espuite gespotene Overgeneralisation+Prefix ge without onset +gespuiten gespoten Wrong -en suffix +espuiten gespoten Wrong -en suffix +spuiten gespoten Wrong -en suffix +gespoot gespoten Overgeneralisation +espoten gespoten Prefix ge without onset +spoten gespoten Lacking ge prefix +state stond Overgeneralisation +staten stonden Overgeneralisation +stondte stond Irregular form plus regular suffix +stondten stonden Irregular form plus regular suffix +gestat gestaan Overgeneralisation+ +estat gestaan Overgeneralisation+Prefix ge without onset +stat gestaan Overgeneralisation+Lacking ge prefix +gestatte gestaane Overgeneralisation+ +estatte gestaane Overgeneralisation+Prefix ge without onset +gestaat gestaan Overgeneralisation +estaat gestaan Overgeneralisation +staat gestaan Overgeneralisation +estaan gestaan Prefix ge without onset +staan gestaan Lacking ge prefix +steekte stak Overgeneralisation +steekten staken Overgeneralisation +stakte stak Irregular form plus regular suffix +stakten staken Irregular form plus regular suffix +gesteekt gestoken Overgeneralisation +esteekt gestoken Overgeneralisation +steekt gestoken Overgeneralisation +gesteekte gestokene Overgeneralisation+ +esteekte gestokene Overgeneralisation+Prefix ge without onset +gesteken gestoken Wrong -en suffix +esteken gestoken Wrong -en suffix +steken gestoken Wrong -en suffix +gestookt gestoken Overgeneralisation +estoken gestoken Prefix ge without onset +stoken gestoken Lacking ge prefix +steelde stal Overgeneralisation +steelden stalen Overgeneralisation +stalde stal Irregular form plus regular suffix +stalden stalen Irregular form plus regular suffix +gesteeld gestolen Overgeneralisation+ +esteeld gestolen Overgeneralisation+Prefix ge without onset +steeld gestolen Overgeneralisation+Lacking ge prefix +gesteelde gestolene Overgeneralisation+ +esteelde gestolene Overgeneralisation+Prefix ge without onset +gesteelt gestolen Overgeneralisation +esteelt gestolen Overgeneralisation +steelt gestolen Overgeneralisation +gestelen gestolen Wrong -en suffix +estelen gestolen Wrong -en suffix +stelen gestolen Wrong -en suffix +gestoolt gestolen Overgeneralisation +estolen gestolen Prefix ge without onset +stolen gestolen Lacking ge prefix +sterfde stierf Overgeneralisation +sterfden stierven Overgeneralisation +stierfde stierf Irregular form plus regular suffix +stierfden stierven Irregular form plus regular suffix +gesterfd gestorven Overgeneralisation+ +esterfd gestorven Overgeneralisation+Prefix ge without onset +sterfd gestorven Overgeneralisation+Lacking ge prefix +gesterfde gestorvene Overgeneralisation+ +esterfde gestorvene Overgeneralisation+Prefix ge without onset +gesterft gestorven Overgeneralisation +esterft gestorven Overgeneralisation +sterft gestorven Overgeneralisation +gesterfen gestorven Wrong -en suffix +esterfen gestorven Wrong -en suffix +sterfen gestorven Wrong -en suffix +gestorfd gestorven Overgeneralisation +gestorft gestorven Overgeneralisation +estorven gestorven Prefix ge without onset +storven gestorven Lacking ge prefix +stijgde steeg Overgeneralisation +stijgden stegen Overgeneralisation +steegde steeg Irregular form plus regular suffix +steegden stegen Irregular form plus regular suffix +gestijgd gestegen Overgeneralisation+ +estijgd gestegen Overgeneralisation+Prefix ge without onset +stijgd gestegen Overgeneralisation+Lacking ge prefix +gestijgde gestegene Overgeneralisation+ +estijgde gestegene Overgeneralisation+Prefix ge without onset +gestijgt gestegen Overgeneralisation +estijgt gestegen Overgeneralisation +stijgt gestegen Overgeneralisation +gestijgen gestegen Wrong -en suffix +estijgen gestegen Wrong -en suffix +stijgen gestegen Wrong -en suffix +gesteegd gestegen Overgeneralisation +gesteegt gestegen Overgeneralisation +estegen gestegen Prefix ge without onset +stegen gestegen Lacking ge prefix +stijfde steef Overgeneralisation +stijfden steven Overgeneralisation +steefde steef Irregular form plus regular suffix +steefden steven Irregular form plus regular suffix +gestijfd gesteven Overgeneralisation+ +estijfd gesteven Overgeneralisation+Prefix ge without onset +stijfd gesteven Overgeneralisation+Lacking ge prefix +gestijfde gestevene Overgeneralisation+ +estijfde gestevene Overgeneralisation+Prefix ge without onset +gestijft gesteven Overgeneralisation +estijft gesteven Overgeneralisation +stijft gesteven Overgeneralisation +gestijfen gesteven Wrong -en suffix +estijfen gesteven Wrong -en suffix +stijfen gesteven Wrong -en suffix +gesteefd gesteven Overgeneralisation +gesteeft gesteven Overgeneralisation +esteven gesteven Prefix ge without onset +steven gesteven Lacking ge prefix +stinkte stonk Overgeneralisation +stinkten stonken Overgeneralisation +stonkte stonk Irregular form plus regular suffix +stonkten stonken Irregular form plus regular suffix +gestinkt gestonken Overgeneralisation +estinkt gestonken Overgeneralisation +stinkt gestonken Overgeneralisation +gestinkte gestonkene Overgeneralisation+ +estinkte gestonkene Overgeneralisation+Prefix ge without onset +gestinken gestonken Wrong -en suffix +estinken gestonken Wrong -en suffix +stinken gestonken Wrong -en suffix +gestonkt gestonken Overgeneralisation +estonken gestonken Prefix ge without onset +stonken gestonken Lacking ge prefix +gestoot gestoten Overgeneralisation +estoot gestoten Overgeneralisation +stoot gestoten Overgeneralisation +gestote gestotene Overgeneralisation+ +estote gestotene Overgeneralisation+Prefix ge without onset +estoten gestoten Prefix ge without onset +stoten gestoten Lacking ge prefix +strijdde streed Overgeneralisation +strijdden streden Overgeneralisation +streedde streed Irregular form plus regular suffix +streedden streden Irregular form plus regular suffix +gestrijd gestreden Overgeneralisation +estrijd gestreden Overgeneralisation +strijd gestreden Overgeneralisation +gestrijde gestredene Overgeneralisation+ +estrijde gestredene Overgeneralisation+Prefix ge without onset +gestrijden gestreden Wrong -en suffix +estrijden gestreden Wrong -en suffix +strijden gestreden Wrong -en suffix +gestreed gestreden Overgeneralisation +estreden gestreden Prefix ge without onset +streden gestreden Lacking ge prefix +strijkte streek Overgeneralisation +strijkten streken Overgeneralisation +streekte streek Irregular form plus regular suffix +streekten streken Irregular form plus regular suffix +gestrijkt gestreken Overgeneralisation +estrijkt gestreken Overgeneralisation +strijkt gestreken Overgeneralisation +gestrijkte gestrekene Overgeneralisation+ +estrijkte gestrekene Overgeneralisation+Prefix ge without onset +gestrijken gestreken Wrong -en suffix +estrijken gestreken Wrong -en suffix +strijken gestreken Wrong -en suffix +gestreekt gestreken Overgeneralisation +estreken gestreken Prefix ge without onset +streken gestreken Lacking ge prefix +stuifde stoof Overgeneralisation +stuifden stoven Overgeneralisation +stoofde stoof Irregular form plus regular suffix +stoofden stoven Irregular form plus regular suffix +gestuifd gestoventoven Overgeneralisation+ +estuifd gestoventoven Overgeneralisation+Prefix ge without onset +stuifd gestoventoven Overgeneralisation+Lacking ge prefix +gestuifde gestoventovene Overgeneralisation+ +estuifde gestoventovene Overgeneralisation+Prefix ge without onset +gestuift gestoventoven Overgeneralisation +estuift gestoventoven Overgeneralisation +stuift gestoventoven Overgeneralisation +gestuifen gestoventoven Wrong -en suffix +estuifen gestoventoven Wrong -en suffix +stuifen gestoventoven Wrong -en suffix +gestoventooft gestoventoven Overgeneralisation +estoventoven gestoventoven Prefix ge without onset +stoventoven gestoventoven Lacking ge prefix +treedde trad Overgeneralisation +treedden traden Overgeneralisation +tradde trad Irregular form plus regular suffix +tradden traden Irregular form plus regular suffix +getreed getreden Overgeneralisation +etreed getreden Overgeneralisation +treed getreden Overgeneralisation +getrede getredene Overgeneralisation+ +etrede getredene Overgeneralisation+Prefix ge without onset +etreden getreden Prefix ge without onset +treden getreden Lacking ge prefix +trefte trof Overgeneralisation +treften troffen Overgeneralisation +trofte trof Irregular form plus regular suffix +troften troffen Irregular form plus regular suffix +getreft getroffen Overgeneralisation +etreft getroffen Overgeneralisation +treft getroffen Overgeneralisation +getrefte getroffene Overgeneralisation+ +etrefte getroffene Overgeneralisation+Prefix ge without onset +getreffen getroffen Wrong -en suffix +etreffen getroffen Wrong -en suffix +treffen getroffen Wrong -en suffix +getroft getroffen Overgeneralisation +etroffen getroffen Prefix ge without onset +troffen getroffen Lacking ge prefix +trekte trok Overgeneralisation +trekten trokken Overgeneralisation +trokte trok Irregular form plus regular suffix +trokten trokken Irregular form plus regular suffix +getrekt getrokken Overgeneralisation +etrekt getrokken Overgeneralisation +trekt getrokken Overgeneralisation +getrekte getrokkene Overgeneralisation+ +etrekte getrokkene Overgeneralisation+Prefix ge without onset +getrekken getrokken Wrong -en suffix +etrekken getrokken Wrong -en suffix +trekken getrokken Wrong -en suffix +getrokt getrokken Overgeneralisation +etrokken getrokken Prefix ge without onset +trokken getrokken Lacking ge prefix +valde viel Overgeneralisation +valden vielen Overgeneralisation +vielde viel Irregular form plus regular suffix +vielden vielen Irregular form plus regular suffix +gevald gevallen Overgeneralisation +evald gevallen Overgeneralisation+Prefix ge without onset +vald gevallen Overgeneralisation+Lacking ge prefix +gevalde gevallene Overgeneralisation+ +evalde gevallene Overgeneralisation+Prefix ge without onset +gevalt gevallen Overgeneralisation +evalt gevallen Overgeneralisation +valt gevallen Overgeneralisation +evallen gevallen Prefix ge without onset +vallen gevallen Lacking ge prefix +vangde ving Overgeneralisation +vangden vingen Overgeneralisation +vingde ving Irregular form plus regular suffix +vingden vingen Irregular form plus regular suffix +gevangd gevangen Overgeneralisation +evangd gevangen Overgeneralisation+Prefix ge without onset +vangd gevangen Overgeneralisation+Lacking ge prefix +gevangde gevangene Overgeneralisation+ +evangde gevangene Overgeneralisation+Prefix ge without onset +gevangt gevangen Overgeneralisation +evangt gevangen Overgeneralisation +vangt gevangen Overgeneralisation +evangen gevangen Prefix ge without onset +vangen gevangen Lacking ge prefix +vaarde voer Overgeneralisation +vaarden voeren Overgeneralisation +voerde voer Irregular form plus regular suffix +voerden voeren Irregular form plus regular suffix +gevaard gevaren Overgeneralisation +evaard gevaren Overgeneralisation+Prefix ge without onset +vaard gevaren Overgeneralisation+Lacking ge prefix +gevaarde gevarene Overgeneralisation+ +evaarde gevarene Overgeneralisation+Prefix ge without onset +gevaart gevaren Overgeneralisation +evaart gevaren Overgeneralisation +vaart gevaren Overgeneralisation +evaren gevaren Prefix ge without onset +varen gevaren Lacking ge prefix +vechtte vocht Overgeneralisation +vechtten vochten Overgeneralisation +vochtte vocht Irregular form plus regular suffix +vochtten vochten Irregular form plus regular suffix +gevecht gevochten Overgeneralisation +evecht gevochten Overgeneralisation +vecht gevochten Overgeneralisation +gevechte gevochtene Overgeneralisation+ +evechte gevochtene Overgeneralisation+Prefix ge without onset +gevechten gevochten Wrong -en suffix +evechten gevochten Wrong -en suffix +vechten gevochten Wrong -en suffix +gevocht gevochten Overgeneralisation +evochten gevochten Prefix ge without onset +vochten gevochten Lacking ge prefix +verdriette verdroot Overgeneralisation +verdrietten verdroten Overgeneralisation +verdrootte verdroot Irregular form plus regular suffix +verdrootten verdroten Irregular form plus regular suffix +verdriet verdroten Overgeneralisation +verdriete verdrotene Overgeneralisation +verdrieten verdroten Wrong -en suffix +verdroot verdroten Overgeneralisation +verdwijnde verdwenene Overgeneralisation +verdwijnden verdwenen Overgeneralisation +verdweende verdween Irregular form plus regular suffix +verdweenden verdwenen Irregular form plus regular suffix +verdwijnd verdwenen Overgeneralisation +verdwijnt verdwenen Overgeneralisation +verdwijnen verdwenen Wrong -en suffix +verdweend verdwenen Overgeneralisation +verdweent verdwenen Overgeneralisation +vergeette vergat Overgeneralisation +vergeetten vergaten Overgeneralisation +vergatte vergat Irregular form plus regular suffix +vergatten vergaten Irregular form plus regular suffix +vergeet vergeten Overgeneralisation +vergete vergetene Overgeneralisation +verliesde verlorene Overgeneralisation +verliesden verloren Overgeneralisation +verloorde verloor Irregular form plus regular suffix +verloorden verloren Irregular form plus regular suffix +verliesd verloren Overgeneralisation +verliest verloren Overgeneralisation +verliesen verloren Wrong -en suffix +verloort verloren Overgeneralisation +vindde vond Overgeneralisation +vindden vonden Overgeneralisation +vondde vond Irregular form plus regular suffix +vondden vonden Irregular form plus regular suffix +gevind gevonden Overgeneralisation +evind gevonden Overgeneralisation +vind gevonden Overgeneralisation +gevinde gevondene Overgeneralisation+ +evinde gevondene Overgeneralisation+Prefix ge without onset +gevinden gevonden Wrong -en suffix +evinden gevonden Wrong -en suffix +vinden gevonden Wrong -en suffix +gevond gevonden Overgeneralisation +evonden gevonden Prefix ge without onset +vonden gevonden Lacking ge prefix +vlechtte vlocht Overgeneralisation +vlechtten vlochten Overgeneralisation +vlochtte vlocht Irregular form plus regular suffix +vlochtten vlochten Irregular form plus regular suffix +gevlecht gevlochten Overgeneralisation +evlecht gevlochten Overgeneralisation +vlecht gevlochten Overgeneralisation +gevlechte gevlochtene Overgeneralisation+ +evlechte gevlochtene Overgeneralisation+Prefix ge without onset +gevlechten gevlochten Wrong -en suffix +evlechten gevlochten Wrong -en suffix +vlechten gevlochten Wrong -en suffix +gevlocht gevlochten Overgeneralisation +evlochten gevlochten Prefix ge without onset +vlochten gevlochten Lacking ge prefix +vliegde vloog Overgeneralisation +vliegden vlogen Overgeneralisation +vloogde vloog Irregular form plus regular suffix +vloogden vlogen Irregular form plus regular suffix +gevliegd gevlogen Overgeneralisation+ +evliegd gevlogen Overgeneralisation+Prefix ge without onset +vliegd gevlogen Overgeneralisation+Lacking ge prefix +gevliegde gevlogene Overgeneralisation+ +evliegde gevlogene Overgeneralisation+Prefix ge without onset +gevliegt gevlogen Overgeneralisation +evliegt gevlogen Overgeneralisation +vliegt gevlogen Overgeneralisation +gevliegen gevlogen Wrong -en suffix +evliegen gevlogen Wrong -en suffix +vliegen gevlogen Wrong -en suffix +gevloogt gevlogen Overgeneralisation +evlogen gevlogen Prefix ge without onset +vlogen gevlogen Lacking ge prefix +gevouwd gevouwen Overgeneralisation +evouwd gevouwen Overgeneralisation+Prefix ge without onset +vouwd gevouwen Overgeneralisation+Lacking ge prefix +gevouwde gevouwene Overgeneralisation+ +evouwde gevouwene Overgeneralisation+Prefix ge without onset +gevouwt gevouwen Overgeneralisation +evouwt gevouwen Overgeneralisation +vouwt gevouwen Overgeneralisation +evouwen gevouwen Prefix ge without onset +vouwen gevouwen Lacking ge prefix +vraagde vroeg Overgeneralisation +vraagden vroegen Overgeneralisation +vroegde vroeg Irregular form plus regular suffix +vroegden vroegen Irregular form plus regular suffix +evraagd gevraagd Prefix ge without onset +vraagd gevraagd Lacking ge prefix +evraagde gevraagde Overgeneralisation+Prefix ge without onset +gevraagt gevraagd Overgeneralisation +evraagt gevraagd Overgeneralisation +vraagt gevraagd Overgeneralisation +gevragen gevraagd Wrong -en suffix +evragen gevraagd Wrong -en suffix +vragen gevraagd Wrong -en suffix +vreette vrat Overgeneralisation +vreetten vraten Overgeneralisation +vratte vrat Irregular form plus regular suffix +vratten vraten Irregular form plus regular suffix +gevreet gevreten Overgeneralisation +evreet gevreten Overgeneralisation +vreet gevreten Overgeneralisation +gevrete gevretene Overgeneralisation+ +evrete gevretene Overgeneralisation+Prefix ge without onset +evreten gevreten Prefix ge without onset +vreten gevreten Lacking ge prefix +vriesde vroor Overgeneralisation +vriesden vroren Overgeneralisation +vroorde vroor Irregular form plus regular suffix +vroorden vroren Irregular form plus regular suffix +gevriesd gevroren Overgeneralisation+ +evriesd gevroren Overgeneralisation+Prefix ge without onset +vriesd gevroren Overgeneralisation+Lacking ge prefix +gevriesde gevrorene Overgeneralisation+ +evriesde gevrorene Overgeneralisation+Prefix ge without onset +gevriest gevroren Overgeneralisation +evriest gevroren Overgeneralisation +vriest gevroren Overgeneralisation +gevriesen gevroren Wrong -en suffix +evriesen gevroren Wrong -en suffix +vriesen gevroren Wrong -en suffix +gevroort gevroren Overgeneralisation +evroren gevroren Prefix ge without onset +vroren gevroren Lacking ge prefix +vriijde vrijde Overgeneralisation +vriijden vrijden Overgeneralisation +gevriijd gevrijd Overgeneralisation+ +evriijd gevrijd Overgeneralisation+Prefix ge without onset +vriijd gevrijd Overgeneralisation+Lacking ge prefix +gevriijde gevrijde Overgeneralisation+ +evriijde gevrijde Overgeneralisation+Prefix ge without onset +gevriijt gevrijd Overgeneralisation +evriijt gevrijd Overgeneralisation +vriijt gevrijd Overgeneralisation +gevrijen gevrijd Wrong -en suffix +evrijen gevrijd Wrong -en suffix +vrijen gevrijd Wrong -en suffix +evrijd gevrijd Prefix ge without onset +vrijd gevrijd Lacking ge prefix +gewast gewassen Overgeneralisation +ewast gewassen Overgeneralisation +wast gewassen Overgeneralisation +gewaste gewassene Overgeneralisation+ +ewaste gewassene Overgeneralisation+Prefix ge without onset +ewassen gewassen Prefix ge without onset +wassen gewassen Lacking ge prefix +weegde woog Overgeneralisation +weegden wogen Overgeneralisation +woogde woog Irregular form plus regular suffix +woogden wogen Irregular form plus regular suffix +geweegd gewogen Overgeneralisation+ +eweegd gewogen Overgeneralisation+Prefix ge without onset +weegd gewogen Overgeneralisation+Lacking ge prefix +geweegde gewogene Overgeneralisation+ +eweegde gewogene Overgeneralisation+Prefix ge without onset +geweegt gewogen Overgeneralisation +eweegt gewogen Overgeneralisation +weegt gewogen Overgeneralisation +gewegen gewogen Wrong -en suffix +ewegen gewogen Wrong -en suffix +wegen gewogen Wrong -en suffix +gewoogt gewogen Overgeneralisation +ewogen gewogen Prefix ge without onset +wogen gewogen Lacking ge prefix +werpte wierp Overgeneralisation +werpten wierpen Overgeneralisation +wierpte wierp Irregular form plus regular suffix +wierpten wierpen Irregular form plus regular suffix +gewerpt geworpen Overgeneralisation +ewerpt geworpen Overgeneralisation +werpt geworpen Overgeneralisation +gewerpte geworpene Overgeneralisation+ +ewerpte geworpene Overgeneralisation+Prefix ge without onset +gewerpen geworpen Wrong -en suffix +ewerpen geworpen Wrong -en suffix +werpen geworpen Wrong -en suffix +geworpt geworpen Overgeneralisation +eworpen geworpen Prefix ge without onset +worpen geworpen Lacking ge prefix +werfde wierf Overgeneralisation +werfden wierven Overgeneralisation +wierfde wierf Irregular form plus regular suffix +wierfden wierven Irregular form plus regular suffix +gewerfd geworven Overgeneralisation+ +ewerfd geworven Overgeneralisation+Prefix ge without onset +werfd geworven Overgeneralisation+Lacking ge prefix +gewerfde geworvene Overgeneralisation+ +ewerfde geworvene Overgeneralisation+Prefix ge without onset +gewerft geworven Overgeneralisation +ewerft geworven Overgeneralisation +werft geworven Overgeneralisation +gewerfen geworven Wrong -en suffix +ewerfen geworven Wrong -en suffix +werfen geworven Wrong -en suffix +geworfd geworven Overgeneralisation +geworft geworven Overgeneralisation +eworven geworven Prefix ge without onset +worven geworven Lacking ge prefix +weette weet Irregular form plus regular suffix +weetten weten Irregular form plus regular suffix +wistte wist Irregular form plus regular suffix +wistten wisten Irregular form plus regular suffix +geweet geweten Overgeneralisation +eweet geweten Overgeneralisation +weet geweten Overgeneralisation +gewete gewetene Overgeneralisation+ +ewete gewetene Overgeneralisation+Prefix ge without onset +eweten geweten Prefix ge without onset +weten geweten Lacking ge prefix +geweefd geweven Overgeneralisation +eweefd geweven Overgeneralisation+Prefix ge without onset +weefd geweven Overgeneralisation+Lacking ge prefix +geweefde gewevene Overgeneralisation+ +eweefde gewevene Overgeneralisation+Prefix ge without onset +geweeft geweven Overgeneralisation +eweeft geweven Overgeneralisation +weeft geweven Overgeneralisation +gewefen geweven Wrong -en suffix +ewefen geweven Wrong -en suffix +wefen geweven Wrong -en suffix +eweven geweven Prefix ge without onset +weven geweven Lacking ge prefix +wijkte week Overgeneralisation +wijkten weken Overgeneralisation +weekte week Irregular form plus regular suffix +weekten weken Irregular form plus regular suffix +gewijkt geweken Overgeneralisation +ewijkt geweken Overgeneralisation +wijkt geweken Overgeneralisation +gewijkte gewekene Overgeneralisation+ +ewijkte gewekene Overgeneralisation+Prefix ge without onset +gewijken geweken Wrong -en suffix +ewijken geweken Wrong -en suffix +wijken geweken Wrong -en suffix +geweekt geweken Overgeneralisation +eweken geweken Prefix ge without onset +weken geweken Lacking ge prefix +wijtte weet Overgeneralisation +wijtten weten Overgeneralisation +gewijt geweten Overgeneralisation +ewijt geweten Overgeneralisation +wijt geweten Overgeneralisation +gewijte gewetene Overgeneralisation+ +ewijte gewetene Overgeneralisation+Prefix ge without onset +gewijten geweten Wrong -en suffix +ewijten geweten Wrong -en suffix +wijten geweten Wrong -en suffix +wijsde wees Overgeneralisation +wijsden wezen Overgeneralisation +weesde wees Irregular form plus regular suffix +weesden wezen Irregular form plus regular suffix +gewijsd gewezen Overgeneralisation+ +ewijsd gewezen Overgeneralisation+Prefix ge without onset +wijsd gewezen Overgeneralisation+Lacking ge prefix +gewijsde gewezene Overgeneralisation+ +ewijsde gewezene Overgeneralisation+Prefix ge without onset +gewijst gewezen Overgeneralisation +ewijst gewezen Overgeneralisation +wijst gewezen Overgeneralisation +gewijsen gewezen Wrong -en suffix +ewijsen gewezen Wrong -en suffix +wijsen gewezen Wrong -en suffix +geweesd gewezen Overgeneralisation +geweest gewezen Overgeneralisation +ewezen gewezen Prefix ge without onset +wezen gewezen Lacking ge prefix +windde wond Overgeneralisation +windden wonden Overgeneralisation +wondde wond Irregular form plus regular suffix +wondden wonden Irregular form plus regular suffix +gewind gewonnen Overgeneralisation+ +ewind gewonnen Overgeneralisation+Prefix ge without onset +wind gewonnen Overgeneralisation+Lacking ge prefix +gewinde gewonnene Overgeneralisation+ +ewinde gewonnene Overgeneralisation+Prefix ge without onset +gewinden gewonden Wrong -en suffix +ewinden gewonden Wrong -en suffix +winden wonnen Overgeneralisation +gewond gewonden Overgeneralisation +ewonden gewonden Prefix ge without onset +wonden wonnen Irregular form plus regular suffix +winde won Overgeneralisation +wonde won Irregular form plus regular suffix +gewint gewonnen Overgeneralisation +ewint gewonnen Overgeneralisation +wint gewonnen Overgeneralisation +gewinnen gewonnen Wrong -en suffix +ewinnen gewonnen Wrong -en suffix +winnen gewonnen Wrong -en suffix +gewont gewonnen Overgeneralisation +ewonnen gewonnen Prefix ge without onset +wonnen gewonnen Lacking ge prefix +wordde werd Overgeneralisation +wordden werden Overgeneralisation +werdde werd Irregular form plus regular suffix +werdden werden Irregular form plus regular suffix +geword geworden Overgeneralisation +eword geworden Overgeneralisation +word geworden Overgeneralisation +geworde gewordene Overgeneralisation+ +eworde gewordene Overgeneralisation+Prefix ge without onset +eworden geworden Prefix ge without onset +worden geworden Lacking ge prefix +wrijfde wreef Overgeneralisation +wrijfden wreven Overgeneralisation +wreefde wreef Irregular form plus regular suffix +wreefden wreven Irregular form plus regular suffix +gewrijfd gewreven Overgeneralisation+ +ewrijfd gewreven Overgeneralisation+Prefix ge without onset +wrijfd gewreven Overgeneralisation+Lacking ge prefix +gewrijfde gewrevene Overgeneralisation+ +ewrijfde gewrevene Overgeneralisation+Prefix ge without onset +gewrijft gewreven Overgeneralisation +ewrijft gewreven Overgeneralisation +wrijft gewreven Overgeneralisation +gewrijfen gewreven Wrong -en suffix +ewrijfen gewreven Wrong -en suffix +wrijfen gewreven Wrong -en suffix +gewreefd gewreven Overgeneralisation +gewreeft gewreven Overgeneralisation +ewreven gewreven Prefix ge without onset +wreven gewreven Lacking ge prefix +wringde wrong Overgeneralisation +wringden wrongen Overgeneralisation +wrongde wrong Irregular form plus regular suffix +wrongden wrongen Irregular form plus regular suffix +gewringd gewrongen Overgeneralisation+ +ewringd gewrongen Overgeneralisation+Prefix ge without onset +wringd gewrongen Overgeneralisation+Lacking ge prefix +gewringde gewrongene Overgeneralisation+ +ewringde gewrongene Overgeneralisation+Prefix ge without onset +gewringt gewrongen Overgeneralisation +ewringt gewrongen Overgeneralisation +wringt gewrongen Overgeneralisation +gewringen gewrongen Wrong -en suffix +ewringen gewrongen Wrong -en suffix +wringen gewrongen Wrong -en suffix +gewrongd gewrongen Overgeneralisation +gewrongt gewrongen Overgeneralisation +ewrongen gewrongen Prefix ge without onset +wrongen gewrongen Lacking ge prefix +zegde zei Overgeneralisation +zegden zeiden Overgeneralisation +zeide zei Irregular form plus regular suffix +ezegd gezegd Prefix ge without onset +zegd gezegd Lacking ge prefix +ezegde gezegde Overgeneralisation+Prefix ge without onset +gezegt gezegd Overgeneralisation +ezegt gezegd Overgeneralisation +zegt gezegd Overgeneralisation +gezeggen gezegd Wrong -en suffix +ezeggen gezegd Wrong -en suffix +zeggen gezegd Wrong -en suffix +zendde zond Overgeneralisation +zendden zonden Overgeneralisation +zondde zond Irregular form plus regular suffix +zondden zonden Irregular form plus regular suffix +gezend gezonden Overgeneralisation +ezend gezonden Overgeneralisation +zend gezonden Overgeneralisation +gezende gezondene Overgeneralisation+ +ezende gezondene Overgeneralisation+Prefix ge without onset +gezenden gezonden Wrong -en suffix +ezenden gezonden Wrong -en suffix +zenden gezonden Wrong -en suffix +gezond gezonden Overgeneralisation +ezonden gezonden Prefix ge without onset +zonden zonnen Irregular form plus regular suffix +zijgde zeeg Overgeneralisation +zijgden zegen Overgeneralisation +zeegde zeeg Irregular form plus regular suffix +zeegden zegen Irregular form plus regular suffix +gezijgd gezegen Overgeneralisation+ +ezijgd gezegen Overgeneralisation+Prefix ge without onset +zijgd gezegen Overgeneralisation+Lacking ge prefix +gezijgde gezegene Overgeneralisation+ +ezijgde gezegene Overgeneralisation+Prefix ge without onset +gezijgt gezegen Overgeneralisation +ezijgt gezegen Overgeneralisation +zijgt gezegen Overgeneralisation +gezijgen gezegen Wrong -en suffix +ezijgen gezegen Wrong -en suffix +zijgen gezegen Wrong -en suffix +gezeegd gezegen Overgeneralisation +gezeegt gezegen Overgeneralisation +ezegen gezegen Prefix ge without onset +zegen gezegen Lacking ge prefix +zijde was Overgeneralisation +zijden waren Overgeneralisation +wasde was Irregular form plus regular suffix +wasden waren Irregular form plus regular suffix +gezijd geweest Overgeneralisation+ +ezijd geweest Overgeneralisation+Prefix ge without onset +zijd geweest Overgeneralisation+Lacking ge prefix +gezijde geweeste Overgeneralisation+ +ezijde geweeste Overgeneralisation+Prefix ge without onset +gezijt geweest Overgeneralisation +ezijt geweest Overgeneralisation +zijt geweest Overgeneralisation +gezijjen geweest Wrong -en suffix +ezijjen geweest Wrong -en suffix +zijjen geweest Wrong -en suffix +eweest geweest Prefix ge without onset +weest geweest Lacking ge prefix +zingde zong Overgeneralisation +zingden zongen Overgeneralisation +zongde zong Irregular form plus regular suffix +zongden zongen Irregular form plus regular suffix +gezingd gezongen Overgeneralisation+ +ezingd gezongen Overgeneralisation+Prefix ge without onset +zingd gezongen Overgeneralisation+Lacking ge prefix +gezingde gezongene Overgeneralisation+ +ezingde gezongene Overgeneralisation+Prefix ge without onset +gezingt gezongen Overgeneralisation +ezingt gezongen Overgeneralisation +zingt gezongen Overgeneralisation +gezingen gezongen Wrong -en suffix +ezingen gezongen Wrong -en suffix +zingen gezongen Wrong -en suffix +gezongd gezongen Overgeneralisation +gezongt gezongen Overgeneralisation +ezongen gezongen Prefix ge without onset +zongen gezongen Lacking ge prefix +zinkte zonk Overgeneralisation +zinkten zonken Overgeneralisation +zonkte zonk Irregular form plus regular suffix +zonkten zonken Irregular form plus regular suffix +gezinkt gezonken Overgeneralisation +ezinkt gezonken Overgeneralisation +zinkt gezonken Overgeneralisation +gezinkte gezonkene Overgeneralisation+ +ezinkte gezonkene Overgeneralisation+Prefix ge without onset +gezinken gezonken Wrong -en suffix +ezinken gezonken Wrong -en suffix +zinken gezonken Wrong -en suffix +gezonkt gezonken Overgeneralisation +ezonken gezonken Prefix ge without onset +zonken gezonken Lacking ge prefix +zinde zon Overgeneralisation +zinden zonnen Overgeneralisation +zonde zon Irregular form plus regular suffix +gezind gezonnen Overgeneralisation+ +ezind gezonnen Overgeneralisation+Prefix ge without onset +zind gezonnen Overgeneralisation+Lacking ge prefix +gezinde gezonnene Overgeneralisation+ +ezinde gezonnene Overgeneralisation+Prefix ge without onset +gezint gezonnen Overgeneralisation +ezint gezonnen Overgeneralisation +zint gezonnen Overgeneralisation +gezinnen gezonnen Wrong -en suffix +ezinnen gezonnen Wrong -en suffix +zinnen gezonnen Wrong -en suffix +gezont gezonnen Overgeneralisation +ezonnen gezonnen Prefix ge without onset +zonnen gezonnen Lacking ge prefix +zitte zat Overgeneralisation +zitten gezeten Wrong -en suffix +zatte zat Irregular form plus regular suffix +zatten zaten Irregular form plus regular suffix +gezit gezeten Overgeneralisation +ezit gezeten Overgeneralisation +zit gezeten Overgeneralisation +gezitte gezetene Overgeneralisation+ +ezitte gezetene Overgeneralisation+Prefix ge without onset +gezitten gezeten Wrong -en suffix +ezitten gezeten Wrong -en suffix +gezeet gezeten Overgeneralisation +ezeten gezeten Prefix ge without onset +zeten gezeten Lacking ge prefix +zoekte zocht Overgeneralisation +zoekten zochten Overgeneralisation +zochtte zocht Irregular form plus regular suffix +zochtten zochten Irregular form plus regular suffix +gezoekt gezocht Overgeneralisation +ezoekt gezocht Overgeneralisation +zoekt gezocht Overgeneralisation +gezoekte gezochte Overgeneralisation+ +ezoekte gezochte Overgeneralisation+Prefix ge without onset +gezoeken gezocht Wrong -en suffix +ezoeken gezocht Wrong -en suffix +zoeken gezocht Wrong -en suffix +ezocht gezocht Prefix ge without onset +zocht gezocht Lacking ge prefix +zuigde zoog Overgeneralisation +zuigden zogen Overgeneralisation +zoogde zoog Irregular form plus regular suffix +zoogden zogen Irregular form plus regular suffix +gezuigd gezogen Overgeneralisation+ +ezuigd gezogen Overgeneralisation+Prefix ge without onset +zuigd gezogen Overgeneralisation+Lacking ge prefix +gezuigde gezogene Overgeneralisation+ +ezuigde gezogene Overgeneralisation+Prefix ge without onset +gezuigt gezogen Overgeneralisation +ezuigt gezogen Overgeneralisation +zuigt gezogen Overgeneralisation +gezuigen gezogen Wrong -en suffix +ezuigen gezogen Wrong -en suffix +zuigen gezogen Wrong -en suffix +gezoogt gezogen Overgeneralisation +ezogen gezogen Prefix ge without onset +zogen gezogen Lacking ge prefix +zuipte zoop Overgeneralisation +zuipten zopen Overgeneralisation +zoopte zoop Irregular form plus regular suffix +zoopten zopen Irregular form plus regular suffix +gezuipt gezopen Overgeneralisation +ezuipt gezopen Overgeneralisation +zuipt gezopen Overgeneralisation +gezuipte gezopene Overgeneralisation+ +ezuipte gezopene Overgeneralisation+Prefix ge without onset +gezuipen gezopen Wrong -en suffix +ezuipen gezopen Wrong -en suffix +zuipen gezopen Wrong -en suffix +gezoopt gezopen Overgeneralisation +ezopen gezopen Prefix ge without onset +zopen gezopen Lacking ge prefix +zwelgde zwolg Overgeneralisation +zwelgden zwolgen Overgeneralisation +zwolgde zwolg Irregular form plus regular suffix +zwolgden zwolgen Irregular form plus regular suffix +gezwelgd gezwolgen Overgeneralisation+ +ezwelgd gezwolgen Overgeneralisation+Prefix ge without onset +zwelgd gezwolgen Overgeneralisation+Lacking ge prefix +gezwelgde gezwolgene Overgeneralisation+ +ezwelgde gezwolgene Overgeneralisation+Prefix ge without onset +gezwelgt gezwolgen Overgeneralisation +ezwelgt gezwolgen Overgeneralisation +zwelgt gezwolgen Overgeneralisation +gezwelgen gezwolgen Wrong -en suffix +ezwelgen gezwolgen Wrong -en suffix +zwelgen gezwolgen Wrong -en suffix +gezwolgd gezwolgen Overgeneralisation +gezwolgt gezwolgen Overgeneralisation +ezwolgen gezwolgen Prefix ge without onset +zwolgen gezwolgen Lacking ge prefix +zwelde zwol Overgeneralisation +zwelden zwollen Overgeneralisation +zwolde zwol Irregular form plus regular suffix +zwolden zwollen Irregular form plus regular suffix +gezweld gezwollen Overgeneralisation+ +ezweld gezwollen Overgeneralisation+Prefix ge without onset +zweld gezwollen Overgeneralisation+Lacking ge prefix +gezwelde gezwollene Overgeneralisation+ +ezwelde gezwollene Overgeneralisation+Prefix ge without onset +gezwelt gezwollen Overgeneralisation +ezwelt gezwollen Overgeneralisation +zwelt gezwollen Overgeneralisation +gezwellen gezwollen Wrong -en suffix +ezwellen gezwollen Wrong -en suffix +zwellen gezwollen Wrong -en suffix +gezwolt gezwollen Overgeneralisation +ezwollen gezwollen Prefix ge without onset +zwollen gezwollen Lacking ge prefix +zwemde zwom Overgeneralisation +zwemden zwommen Overgeneralisation +zwomde zwom Irregular form plus regular suffix +zwomden zwommen Irregular form plus regular suffix +gezwemd gezwommen Overgeneralisation+ +ezwemd gezwommen Overgeneralisation+Prefix ge without onset +zwemd gezwommen Overgeneralisation+Lacking ge prefix +gezwemde gezwommene Overgeneralisation+ +ezwemde gezwommene Overgeneralisation+Prefix ge without onset +gezwemt gezwommen Overgeneralisation +ezwemt gezwommen Overgeneralisation +zwemt gezwommen Overgeneralisation +gezwemmen gezwommen Wrong -en suffix +ezwemmen gezwommen Wrong -en suffix +zwemmen gezwommen Wrong -en suffix +gezwomt gezwommen Overgeneralisation +ezwommen gezwommen Prefix ge without onset +zwommen gezwommen Lacking ge prefix +zweerde zwoer Overgeneralisation +zweerden zwoeren Overgeneralisation +zwoerde zwoer Irregular form plus regular suffix +zwoerden zwoeren Irregular form plus regular suffix +gezweerd gezworen Overgeneralisation+ +ezweerd gezworen Overgeneralisation+Prefix ge without onset +zweerd gezworen Overgeneralisation+Lacking ge prefix +gezweerde gezworene Overgeneralisation+ +ezweerde gezworene Overgeneralisation+Prefix ge without onset +gezweert gezworen Overgeneralisation +ezweert gezworen Overgeneralisation +zweert gezworen Overgeneralisation +gezweren gezworen Wrong -en suffix +ezweren gezworen Wrong -en suffix +zweren gezworen Wrong -en suffix +gezwoort gezworen Overgeneralisation +ezworen gezworen Prefix ge without onset +zworen gezworen Lacking ge prefix +zwerfde zwierf Overgeneralisation +zwerfden zwierven Overgeneralisation +zwierfde zwierf Irregular form plus regular suffix +zwierfden zwierven Irregular form plus regular suffix +gezwerfd gezworven Overgeneralisation+ +ezwerfd gezworven Overgeneralisation+Prefix ge without onset +zwerfd gezworven Overgeneralisation+Lacking ge prefix +gezwerfde gezworvene Overgeneralisation+ +ezwerfde gezworvene Overgeneralisation+Prefix ge without onset +gezwerft gezworven Overgeneralisation +ezwerft gezworven Overgeneralisation +zwerft gezworven Overgeneralisation +gezwerfen gezworven Wrong -en suffix +ezwerfen gezworven Wrong -en suffix +zwerfen gezworven Wrong -en suffix +gezworfd gezworven Overgeneralisation +gezworft gezworven Overgeneralisation +ezworven gezworven Prefix ge without onset +zworven gezworven Lacking ge prefix +zwijgde zweeg Overgeneralisation +zwijgden zwegen Overgeneralisation +zweegde zweeg Irregular form plus regular suffix +zweegden zwegen Irregular form plus regular suffix +gezwijgd gezwegen Overgeneralisation+ +ezwijgd gezwegen Overgeneralisation+Prefix ge without onset +zwijgd gezwegen Overgeneralisation+Lacking ge prefix +gezwijgde gezwegene Overgeneralisation+ +ezwijgde gezwegene Overgeneralisation+Prefix ge without onset +gezwijgt gezwegen Overgeneralisation +ezwijgt gezwegen Overgeneralisation +zwijgt gezwegen Overgeneralisation +gezwijgen gezwegen Wrong -en suffix +ezwijgen gezwegen Wrong -en suffix +zwijgen gezwegen Wrong -en suffix +gezweegd gezwegen Overgeneralisation +gezweegt gezwegen Overgeneralisation +ezwegen gezwegen Prefix ge without onset +zwegen gezwegen Lacking ge prefix diff --git a/src/sastadev/data/top3000/Woordenlijsten Current.xlsx b/src/sastadev/data/top3000/Woordenlijsten Current.xlsx index 7b7ac56..02f7e75 100644 Binary files a/src/sastadev/data/top3000/Woordenlijsten Current.xlsx and b/src/sastadev/data/top3000/Woordenlijsten Current.xlsx differ diff --git a/src/sastadev/data/wordsunknowntoalpino/wordsunknowntoalpino.txt b/src/sastadev/data/wordsunknowntoalpino/wordsunknowntoalpino.txt new file mode 100644 index 0000000..03936fe --- /dev/null +++ b/src/sastadev/data/wordsunknowntoalpino/wordsunknowntoalpino.txt @@ -0,0 +1,9 @@ +gymmen trainen +gymt traint +gym train +gegymd getraind +gymmend trainend +gymmende trainende +gymmenden trainenden +gymde trainde +gymden trainden diff --git a/src/sastadev/deregularise.py b/src/sastadev/deregularise.py index 934ef6b..08509aa 100644 --- a/src/sastadev/deregularise.py +++ b/src/sastadev/deregularise.py @@ -6,7 +6,7 @@ It provides: * functions for generating a list of overgeneralised forms, with their corrections and a characterisation of the error made. The main function for this is *makeparadigm*. -Generating these forms and string them in a file is done by the module *deregularise_test* +Generating these forms and string them in a file is done by the module *update_inflectioncorrection* .. autofunction:: deregularise::makeparadigm @@ -14,12 +14,14 @@ .. autofunction:: deregularise::correctinflection -The module initialises the dictionary *correction* by reading in the file with the name contained in the constant *correctionfilename* +The module initialises the dictionary *correction* by reading in the file with the name contained in the constant *correctionfullname* + + .. autodata:: deregularise::correctionfullname + +which uses the constsnt *correctionfilename* .. autodata:: deregularise::correctionfilename - **Remark** The generation of the corrections and the module's testing should be - separated. **Remark** The function does not work perfectly yet for certain past participles ( *ge* added incorrectly, and for some forms is yields a correct form (past participle @@ -47,6 +49,7 @@ overgen = 'Overgeneralisation' noge = 'Lacking ge prefix' nog = 'Prefix ge without onset' +sege = 'prefix ge pronounced as se' wrongovergen = 'Wrong Overgeneralisation' wrongen = 'Wrong -en suffix' nolabel = 'Correct' @@ -63,11 +66,17 @@ metaarr['ge'] = '' metaarr[''] = noge metaarr['e'] = nog +metaarr['se'] = sege -#: The constant *correctionfilename* contains the name of the file that contains the -#: corrections. This file is generated by the module deregularise_test. +#: The constant *correctionfilename* contains the file name of the file that contains the +#: corrections. This file is generated by the module update_*inflectioncorrection*. correctionfilename = 'inflectioncorrection.tsv.txt' +#: The constant *correctionfullname* contains the full name (path + filename) of the file that contains the +#: corrections. This file is generated by the module update_*inflectioncorrection*. +correctionfullname = os.path.join( + settings.SD_DIR, 'data', correctionfilename) + v_prefixes = ['her', 'ver', 'ont', 'be'] separable_prefixes = ['aan', 'aaneen', 'aantoe', 'achter', 'achteraan', 'achterna', 'achterom', 'achterop', 'achterover', 'achteruit', 'adem', 'ader', 'af', 'auto', 'bakzeil', 'beet', 'bekend', 'belang', 'bellen', 'betreft', @@ -390,8 +399,8 @@ def makewrongenpastpart(stem, stemFS, takesge, prefix='ge'): def makewrongpastpart(stem, stemFS, takesge, prefix='ge'): metalabel = wrongovergen - if stem[-1] in tkofschip or stem[-2:] in tkofschip: - result = stemFS + 't' + if stem[-1] in tkofschip or stem[-2:] in tkofschip: + result = stemFS + 'd' elif CV(stem): result = stem + stem[-1] + 't' elif stem[-1] not in 'd': @@ -409,7 +418,7 @@ def makewrongpastpart(stem, stemFS, takesge, prefix='ge'): result = finaldegemination(result) if takesge: metalabel = plussym.join([metalabel, metaarr[prefix]]) - return result, overgen + return result, metalabel def getcorrections(thestr: str, correction: Dict[str, Tuple[str, str]]) -> List[Tuple[str, str]]: @@ -557,6 +566,10 @@ def makeparadigm(word, forms): zeropastparticiple, metalabel = makepastpart(stem, stemFS, takesge, prefix='') triples.append((zeropastparticiple, metalabel, goodpastpart)) + sepastparticiple, metalabel = makepastpart(stem, stemFS, takesge, prefix='se') + triples.append((sepastparticiple, metalabel, goodpastpart)) + + # perfect participle with e pastpartwithe, metalabel = makepastpartwithe(stem, stemFS, takesge) triples.append((pastpartwithe, metalabel, goodpastpartwithe)) @@ -564,6 +577,9 @@ def makeparadigm(word, forms): epastpartwithe, metalabel = makepastpartwithe(stem, stemFS, takesge, prefix='e') triples.append((epastpartwithe, metalabel, goodpastpartwithe)) + sepastpartwithe, metalabel = makepastpartwithe(stem, stemFS, takesge, prefix='se') + triples.append((sepastpartwithe, metalabel, goodpastpartwithe)) + # put off temporarily because past tense are more important # zeropastpartwithe, metalabel = makepastpartwithe(stem, stemFS, takesge, prefix='') # triples.append((zeropastpartwithe, metalabel, goodpastpartwithe)) @@ -629,10 +645,11 @@ def makeparadigm(word, forms): #: reading from the file with the name in the constant *correctionfilename* upon #: initialisation of the module *deregularise* correction: Dict[str, Tuple[str, str]] = {} -correctionfile = open(os.path.join(settings.SD_DIR, 'data', correctionfilename), 'r', encoding='utf8') -myreader = csv.reader(correctionfile, delimiter=tab) -for row in myreader: - wrong = row[0] - good = row[1] - meta = row[2] - correction[wrong] = good, meta + +with open(correctionfullname, 'r', encoding='utf8') as correctionfile: + myreader = csv.reader(correctionfile, delimiter=tab) + for row in myreader: + wrong = row[0] + good = row[1] + meta = row[2] + correction[wrong] = good, meta diff --git a/src/sastadev/external_functions.py b/src/sastadev/external_functions.py index db8f0bd..8e7fb5b 100644 --- a/src/sastadev/external_functions.py +++ b/src/sastadev/external_functions.py @@ -16,7 +16,8 @@ from typing import Callable, Dict from sastadev.allresults import QueryFunction -from sastadev.asta_queries import asta_bijzin, asta_delpv, asta_lex, asta_noun +from sastadev.asta_queries import (asta_bijzin, asta_delpv, asta_lemma, + asta_lex, asta_noun, astalemmafunction) from sastadev.astaforms import astaform from sastadev.ASTApostfunctions import (KMcount, countwordsandcutoff, finietheidsindex, getalllemmas, @@ -26,7 +27,7 @@ from sastadev.compounds import getcompounds from sastadev.dedup import correct, mlux, onvolledig, samplesize from sastadev.imperatives import wond4, wond5plus, wondx, wx, wxy, wxyz, wxyz5 -from sastadev.methods import allok +from sastadev.methods import allok, astalemmafilter from sastadev.queryfunctions import VzN, vobij, voslashbij, xneg_neg, xneg_x from sastadev.stapforms import makestapform from sastadev.STAPpostfunctions import GL5LVU, GLVU, BB_totaal @@ -73,7 +74,8 @@ def oldgetfname(f: Callable) -> str: theastafunctions = [samplesize, mlux, neologisme, onvolledig, correct, wordcountperutt, countwordsandcutoff, astaform, KMcount, finietheidsindex, getnounlemmas, getlexlemmas, getalllemmas, asta_noun, - asta_bijzin, asta_lex, asta_delpv, allok, sempar, phonpar, neologisme] + asta_bijzin, asta_lex, asta_delpv, allok, sempar, phonpar, astalemmafilter, asta_lemma, + astalemmafunction] thefunctions = thetarspfunctions + thestapfunctions + theastafunctions diff --git a/src/sastadev/imperatives.py b/src/sastadev/imperatives.py index bb1f9ee..cbd87e2 100644 --- a/src/sastadev/imperatives.py +++ b/src/sastadev/imperatives.py @@ -3,12 +3,15 @@ from sastadev.sastatypes import SynTree from sastadev.Sziplus import getnodecount from sastadev.treebankfunctions import getattval +from sastadev.expandquery import expandmacros noimplemmas = {'hoeven', 'moeten', 'mogen', 'kunnen', 'hebben', 'willen', 'hebben', 'zitten'} noimpwords = {'ben', 'bent', 'is', 'zijn'} impmodlemmas = {'eens', 'maar'} +kijkVUxpath = expandmacros('.//node[%Tarsp_kijkVU%]') + impquery = ''' .//node[@cat="sv1" and not(node[@rel="su"]) and @@ -140,12 +143,20 @@ def wx(syntree: SynTree) -> List[SynTree]: The function *wx* finds nodes for imperative clauses with 1 or 2 nodes. it uses the function *impwi* to achieve that. ''' - results = impwi(syntree, {1, 2}) + kijkvuresults = syntree.xpath(kijkVUxpath) + if kijkvuresults == []: + results = impwi(syntree, {1, 2}) + else: + results = [] return results def wxy(syntree): - results = impwi(syntree, {3}) + kijkvuresults = syntree.xpath(kijkVUxpath) + if kijkvuresults == []: + results = impwi(syntree, {3}) + else: + results = [] return results diff --git a/src/sastadev/inflectioncorrection.tsv.txt b/src/sastadev/inflectioncorrection.tsv.txt new file mode 100644 index 0000000..5e23bee --- /dev/null +++ b/src/sastadev/inflectioncorrection.tsv.txt @@ -0,0 +1,3054 @@ +gebakt gebakken Overgeneralisation +ebakt gebakken Overgeneralisation +bakt gebakken Overgeneralisation +sebakt gebakken Overgeneralisation+prefix ge pronounced as se +gebakte gebakkene Overgeneralisation+ +ebakte gebakkene Overgeneralisation+Prefix ge without onset +sebakte gebakkene Overgeneralisation+prefix ge pronounced as se +ebakken gebakken Prefix ge without onset +bakken gebakken Lacking ge prefix +geband gebannen Overgeneralisation +eband gebannen Overgeneralisation+Prefix ge without onset +band gebannen Overgeneralisation+Lacking ge prefix +seband gebannen Overgeneralisation+prefix ge pronounced as se +gebande gebannene Overgeneralisation+ +ebande gebannene Overgeneralisation+Prefix ge without onset +sebande gebannene Overgeneralisation+prefix ge pronounced as se +gebant gebannen Overgeneralisation +ebant gebannen Overgeneralisation +bant gebannen Overgeneralisation +ebannen gebannen Prefix ge without onset +bannen gebannen Lacking ge prefix +gebarst gebarsten Overgeneralisation +ebarst gebarsten Overgeneralisation +barst gebarsten Overgeneralisation +sebarst gebarsten Overgeneralisation+prefix ge pronounced as se +gebarste gebarstene Overgeneralisation+ +ebarste gebarstene Overgeneralisation+Prefix ge without onset +sebarste gebarstene Overgeneralisation+prefix ge pronounced as se +ebarsten gebarsten Prefix ge without onset +barsten gebarsten Lacking ge prefix +bederfde bedorvene Overgeneralisation +bederfden bedierven Overgeneralisation +bedierfde bedierf Irregular form plus regular suffix +bedierfden bedierven Irregular form plus regular suffix +bederfd bedorven Overgeneralisation +bederft bedorven Overgeneralisation +bederfen bedorven Wrong -en suffix +bedorfd bedorven Overgeneralisation +bedorft bedorven Overgeneralisation +bedriegde bedrogene Overgeneralisation +bedriegden bedrogen Overgeneralisation +bedroogde bedroog Irregular form plus regular suffix +bedroogden bedrogen Irregular form plus regular suffix +bedriegd bedrogen Overgeneralisation +bedriegt bedrogen Overgeneralisation +bedriegen bedrogen Wrong -en suffix +bedroogt bedrogen Overgeneralisation +beginde begonnene Overgeneralisation +beginden begonnen Overgeneralisation +begonde begon Irregular form plus regular suffix +begonden begonnen Irregular form plus regular suffix +begind begonnen Overgeneralisation +begint begonnen Overgeneralisation +beginnen begonnen Wrong -en suffix +begont begonnen Overgeneralisation +behangde behangene Overgeneralisation +behangden behingen Overgeneralisation +behingde behing Irregular form plus regular suffix +behingden behingen Irregular form plus regular suffix +behangd behangen Overgeneralisation +behangt behangen Overgeneralisation +bergde borg Overgeneralisation +bergden borgen Overgeneralisation +borgde borg Irregular form plus regular suffix +borgden borgen Irregular form plus regular suffix +gebergd geborgen Overgeneralisation+ +ebergd geborgen Overgeneralisation+Prefix ge without onset +bergd geborgen Overgeneralisation+Lacking ge prefix +sebergd geborgen Overgeneralisation+prefix ge pronounced as se +gebergde geborgene Overgeneralisation+ +ebergde geborgene Overgeneralisation+Prefix ge without onset +sebergde geborgene Overgeneralisation+prefix ge pronounced as se +gebergt geborgen Overgeneralisation +ebergt geborgen Overgeneralisation +bergt geborgen Overgeneralisation +gebergen geborgen Wrong -en suffix +ebergen geborgen Wrong -en suffix +bergen geborgen Wrong -en suffix +geborgd geborgen Overgeneralisation +geborgt geborgen Overgeneralisation +eborgen geborgen Prefix ge without onset +borgen geborgen Lacking ge prefix +beveelde bevolene Overgeneralisation +beveelden bevalen Overgeneralisation +bevalde beval Irregular form plus regular suffix +bevalden bevalen Irregular form plus regular suffix +beveeld bevolen Overgeneralisation +beveelt bevolen Overgeneralisation +bevelen bevolen Wrong -en suffix +bevoolt bevolen Overgeneralisation +bezwijkte bezwekene Overgeneralisation +bezwijkten bezweken Overgeneralisation +bezweekte bezweek Irregular form plus regular suffix +bezweekten bezweken Irregular form plus regular suffix +bezwijkt bezweken Overgeneralisation +bezwijken bezweken Wrong -en suffix +bezweekt bezweken Overgeneralisation +bidde bad Overgeneralisation +bidden gebeden Wrong -en suffix +badde bad Irregular form plus regular suffix +badden baden Irregular form plus regular suffix +gebid gebeden Overgeneralisation +ebid gebeden Overgeneralisation +bid gebeden Overgeneralisation +sebid gebeden Overgeneralisation+prefix ge pronounced as se +gebidde gebedene Overgeneralisation+ +ebidde gebedene Overgeneralisation+Prefix ge without onset +sebidde gebedene Overgeneralisation+prefix ge pronounced as se +gebidden gebeden Wrong -en suffix +ebidden gebeden Wrong -en suffix +gebeed gebeden Overgeneralisation +ebeden gebeden Prefix ge without onset +beden gebeden Lacking ge prefix +biedde bood Overgeneralisation +biedden boden Overgeneralisation +boodde bood Irregular form plus regular suffix +boodden boden Irregular form plus regular suffix +gebied geboden Overgeneralisation +ebied geboden Overgeneralisation +bied geboden Overgeneralisation +sebied geboden Overgeneralisation+prefix ge pronounced as se +gebiede gebodene Overgeneralisation+ +ebiede gebodene Overgeneralisation+Prefix ge without onset +sebiede gebodene Overgeneralisation+prefix ge pronounced as se +gebieden geboden Wrong -en suffix +ebieden geboden Wrong -en suffix +bieden geboden Wrong -en suffix +geboodt geboden Overgeneralisation +gebood geboden Overgeneralisation +eboden geboden Prefix ge without onset +boden geboden Lacking ge prefix +bijtte beet Overgeneralisation +bijtten beten Overgeneralisation +beette beet Irregular form plus regular suffix +beetten beten Irregular form plus regular suffix +gebijt gebeten Overgeneralisation +ebijt gebeten Overgeneralisation +bijt gebeten Overgeneralisation +sebijt gebeten Overgeneralisation+prefix ge pronounced as se +gebijte gebetene Overgeneralisation+ +ebijte gebetene Overgeneralisation+Prefix ge without onset +sebijte gebetene Overgeneralisation+prefix ge pronounced as se +gebijten gebeten Wrong -en suffix +ebijten gebeten Wrong -en suffix +bijten gebeten Wrong -en suffix +gebeet gebeten Overgeneralisation +ebeten gebeten Prefix ge without onset +beten gebeten Lacking ge prefix +bindde bond Overgeneralisation +bindden bonden Overgeneralisation +bondde bond Irregular form plus regular suffix +bondden bonden Irregular form plus regular suffix +gebind gebonden Overgeneralisation +ebind gebonden Overgeneralisation +bind gebonden Overgeneralisation +sebind gebonden Overgeneralisation+prefix ge pronounced as se +gebinde gebondene Overgeneralisation+ +ebinde gebondene Overgeneralisation+Prefix ge without onset +sebinde gebondene Overgeneralisation+prefix ge pronounced as se +gebinden gebonden Wrong -en suffix +ebinden gebonden Wrong -en suffix +binden gebonden Wrong -en suffix +gebond gebonden Overgeneralisation +ebonden gebonden Prefix ge without onset +bonden gebonden Lacking ge prefix +blaasde blies Overgeneralisation +blaasden bliezen Overgeneralisation +bliesde blies Irregular form plus regular suffix +bliesden bliezen Irregular form plus regular suffix +geblaasd geblazen Overgeneralisation +eblaasd geblazen Overgeneralisation+Prefix ge without onset +blaasd geblazen Overgeneralisation+Lacking ge prefix +seblaasd geblazen Overgeneralisation+prefix ge pronounced as se +geblaasde geblazene Overgeneralisation+ +eblaasde geblazene Overgeneralisation+Prefix ge without onset +seblaasde geblazene Overgeneralisation+prefix ge pronounced as se +geblaast geblazen Overgeneralisation +eblaast geblazen Overgeneralisation +blaast geblazen Overgeneralisation +geblasen geblazen Wrong -en suffix +eblasen geblazen Wrong -en suffix +blasen geblazen Wrong -en suffix +eblazen geblazen Prefix ge without onset +blazen geblazen Lacking ge prefix +blijkte bleek Overgeneralisation +blijkten bleken Overgeneralisation +bleekte bleek Irregular form plus regular suffix +bleekten bleken Irregular form plus regular suffix +geblijkt gebleken Overgeneralisation +eblijkt gebleken Overgeneralisation +blijkt gebleken Overgeneralisation +seblijkt gebleken Overgeneralisation+prefix ge pronounced as se +geblijkte geblekene Overgeneralisation+ +eblijkte geblekene Overgeneralisation+Prefix ge without onset +seblijkte geblekene Overgeneralisation+prefix ge pronounced as se +geblijken gebleken Wrong -en suffix +eblijken gebleken Wrong -en suffix +blijken gebleken Wrong -en suffix +gebleekt gebleken Overgeneralisation +ebleken gebleken Prefix ge without onset +bleken gebleken Lacking ge prefix +blijfde bleef Overgeneralisation +blijfden bleven Overgeneralisation +bleefde bleef Irregular form plus regular suffix +bleefden bleven Irregular form plus regular suffix +geblijfd gebleven Overgeneralisation+ +eblijfd gebleven Overgeneralisation+Prefix ge without onset +blijfd gebleven Overgeneralisation+Lacking ge prefix +seblijfd gebleven Overgeneralisation+prefix ge pronounced as se +geblijfde geblevene Overgeneralisation+ +eblijfde geblevene Overgeneralisation+Prefix ge without onset +seblijfde geblevene Overgeneralisation+prefix ge pronounced as se +geblijft gebleven Overgeneralisation +eblijft gebleven Overgeneralisation +blijft gebleven Overgeneralisation +geblijfen gebleven Wrong -en suffix +eblijfen gebleven Wrong -en suffix +blijfen gebleven Wrong -en suffix +gebleefd gebleven Overgeneralisation +gebleeft gebleven Overgeneralisation +ebleven gebleven Prefix ge without onset +bleven gebleven Lacking ge prefix +blinkte blonk Overgeneralisation +blinkten blonken Overgeneralisation +blonkte blonk Irregular form plus regular suffix +blonkten blonken Irregular form plus regular suffix +geblinkt geblonken Overgeneralisation +eblinkt geblonken Overgeneralisation +blinkt geblonken Overgeneralisation +seblinkt geblonken Overgeneralisation+prefix ge pronounced as se +geblinkte geblonkene Overgeneralisation+ +eblinkte geblonkene Overgeneralisation+Prefix ge without onset +seblinkte geblonkene Overgeneralisation+prefix ge pronounced as se +geblinken geblonken Wrong -en suffix +eblinken geblonken Wrong -en suffix +blinken geblonken Wrong -en suffix +geblonkt geblonken Overgeneralisation +eblonken geblonken Prefix ge without onset +blonken geblonken Lacking ge prefix +gebraad gebraden Overgeneralisation +ebraad gebraden Overgeneralisation +braad gebraden Overgeneralisation +sebraad gebraden Overgeneralisation+prefix ge pronounced as se +gebrade gebradene Overgeneralisation+ +ebrade gebradene Overgeneralisation+Prefix ge without onset +sebrade gebradene Overgeneralisation+prefix ge pronounced as se +ebraden gebraden Prefix ge without onset +braden gebraden Lacking ge prefix +breekte brak Overgeneralisation +breekten braken Overgeneralisation +brakte brak Irregular form plus regular suffix +brakten braken Irregular form plus regular suffix +gebreekt gebroken Overgeneralisation +ebreekt gebroken Overgeneralisation +breekt gebroken Overgeneralisation +sebreekt gebroken Overgeneralisation+prefix ge pronounced as se +gebreekte gebrokene Overgeneralisation+ +ebreekte gebrokene Overgeneralisation+Prefix ge without onset +sebreekte gebrokene Overgeneralisation+prefix ge pronounced as se +gebreken gebroken Wrong -en suffix +ebreken gebroken Wrong -en suffix +breken gebroken Wrong -en suffix +gebrookt gebroken Overgeneralisation +ebroken gebroken Prefix ge without onset +broken gebroken Lacking ge prefix +brengde bracht Overgeneralisation +brengden brachten Overgeneralisation +brachtde bracht Irregular form plus regular suffix +brachtden brachten Irregular form plus regular suffix +gebrengd gebracht Overgeneralisation+ +ebrengd gebracht Overgeneralisation+Prefix ge without onset +brengd gebracht Overgeneralisation+Lacking ge prefix +sebrengd gebracht Overgeneralisation+prefix ge pronounced as se +gebrengde gebrachte Overgeneralisation+ +ebrengde gebrachte Overgeneralisation+Prefix ge without onset +sebrengde gebrachte Overgeneralisation+prefix ge pronounced as se +gebrengt gebracht Overgeneralisation +ebrengt gebracht Overgeneralisation +brengt gebracht Overgeneralisation +gebrengen gebracht Wrong -en suffix +ebrengen gebracht Wrong -en suffix +brengen gebracht Wrong -en suffix +ebracht gebracht Prefix ge without onset +bracht gebracht Lacking ge prefix +gebrouwd gebrouwen Overgeneralisation +ebrouwd gebrouwen Overgeneralisation+Prefix ge without onset +brouwd gebrouwen Overgeneralisation+Lacking ge prefix +sebrouwd gebrouwen Overgeneralisation+prefix ge pronounced as se +gebrouwde gebrouwene Overgeneralisation+ +ebrouwde gebrouwene Overgeneralisation+Prefix ge without onset +sebrouwde gebrouwene Overgeneralisation+prefix ge pronounced as se +gebrouwt gebrouwen Overgeneralisation +ebrouwt gebrouwen Overgeneralisation +brouwt gebrouwen Overgeneralisation +ebrouwen gebrouwen Prefix ge without onset +brouwen gebrouwen Lacking ge prefix +buigde boog Overgeneralisation +buigden bogen Overgeneralisation +boogde boog Irregular form plus regular suffix +boogden bogen Irregular form plus regular suffix +gebuigd gebogen Overgeneralisation+ +ebuigd gebogen Overgeneralisation+Prefix ge without onset +buigd gebogen Overgeneralisation+Lacking ge prefix +sebuigd gebogen Overgeneralisation+prefix ge pronounced as se +gebuigde gebogene Overgeneralisation+ +ebuigde gebogene Overgeneralisation+Prefix ge without onset +sebuigde gebogene Overgeneralisation+prefix ge pronounced as se +gebuigt gebogen Overgeneralisation +ebuigt gebogen Overgeneralisation +buigt gebogen Overgeneralisation +gebuigen gebogen Wrong -en suffix +ebuigen gebogen Wrong -en suffix +buigen gebogen Wrong -en suffix +geboogt gebogen Overgeneralisation +ebogen gebogen Prefix ge without onset +bogen gebogen Lacking ge prefix +denkte dacht Overgeneralisation +denkten dachten Overgeneralisation +dachtte dacht Irregular form plus regular suffix +dachtten dachten Irregular form plus regular suffix +gedenkt gedacht Overgeneralisation +edenkt gedacht Overgeneralisation +denkt gedacht Overgeneralisation +sedenkt gedacht Overgeneralisation+prefix ge pronounced as se +gedenkte gedachte Overgeneralisation+ +edenkte gedachte Overgeneralisation+Prefix ge without onset +sedenkte gedachte Overgeneralisation+prefix ge pronounced as se +gedenken gedacht Wrong -en suffix +edenken gedacht Wrong -en suffix +denken gedacht Wrong -en suffix +edacht gedacht Prefix ge without onset +dacht gedacht Lacking ge prefix +dingde dong Overgeneralisation +dingden dongen Overgeneralisation +dongde dong Irregular form plus regular suffix +dongden dongen Irregular form plus regular suffix +gedingd gedongen Overgeneralisation+ +edingd gedongen Overgeneralisation+Prefix ge without onset +dingd gedongen Overgeneralisation+Lacking ge prefix +sedingd gedongen Overgeneralisation+prefix ge pronounced as se +gedingde gedongene Overgeneralisation+ +edingde gedongene Overgeneralisation+Prefix ge without onset +sedingde gedongene Overgeneralisation+prefix ge pronounced as se +gedingt gedongen Overgeneralisation +edingt gedongen Overgeneralisation +dingt gedongen Overgeneralisation +gedingen gedongen Wrong -en suffix +edingen gedongen Wrong -en suffix +dingen gedongen Wrong -en suffix +gedongd gedongen Overgeneralisation +gedongt gedongen Overgeneralisation +edongen gedongen Prefix ge without onset +dongen gedongen Lacking ge prefix +doete deed Overgeneralisation +doeten deden Overgeneralisation +deedte deed Irregular form plus regular suffix +deedten deden Irregular form plus regular suffix +gedoet gedaan Overgeneralisation +edoet gedaan Overgeneralisation +doet gedaan Overgeneralisation +sedoet gedaan Overgeneralisation+prefix ge pronounced as se +gedoete gedaane Overgeneralisation+ +edoete gedaane Overgeneralisation+Prefix ge without onset +sedoete gedaane Overgeneralisation+prefix ge pronounced as se +gedoen gedaan Wrong -en suffix +edoen gedaan Wrong -en suffix +doen gedaan Wrong -en suffix +edaan gedaan Prefix ge without onset +daan gedaan Lacking ge prefix +draagde droeg Overgeneralisation +draagden droegen Overgeneralisation +droegde droeg Irregular form plus regular suffix +droegden droegen Irregular form plus regular suffix +gedraagd gedragen Overgeneralisation +edraagd gedragen Overgeneralisation+Prefix ge without onset +draagd gedragen Overgeneralisation+Lacking ge prefix +sedraagd gedragen Overgeneralisation+prefix ge pronounced as se +gedraagde gedragene Overgeneralisation+ +edraagde gedragene Overgeneralisation+Prefix ge without onset +sedraagde gedragene Overgeneralisation+prefix ge pronounced as se +gedraagt gedragen Overgeneralisation +edraagt gedragen Overgeneralisation +draagt gedragen Overgeneralisation +edragen gedragen Prefix ge without onset +dragen gedragen Lacking ge prefix +drijfde dreef Overgeneralisation +drijfden dreven Overgeneralisation +dreefde dreef Irregular form plus regular suffix +dreefden dreven Irregular form plus regular suffix +gedrijfd gedreven Overgeneralisation+ +edrijfd gedreven Overgeneralisation+Prefix ge without onset +drijfd gedreven Overgeneralisation+Lacking ge prefix +sedrijfd gedreven Overgeneralisation+prefix ge pronounced as se +gedrijfde gedrevene Overgeneralisation+ +edrijfde gedrevene Overgeneralisation+Prefix ge without onset +sedrijfde gedrevene Overgeneralisation+prefix ge pronounced as se +gedrijft gedreven Overgeneralisation +edrijft gedreven Overgeneralisation +drijft gedreven Overgeneralisation +gedrijfen gedreven Wrong -en suffix +edrijfen gedreven Wrong -en suffix +drijfen gedreven Wrong -en suffix +gedreefd gedreven Overgeneralisation +gedreeft gedreven Overgeneralisation +edreven gedreven Prefix ge without onset +dreven gedreven Lacking ge prefix +dringde drong Overgeneralisation +dringden drongen Overgeneralisation +drongde drong Irregular form plus regular suffix +drongden drongen Irregular form plus regular suffix +gedringd gedrongen Overgeneralisation+ +edringd gedrongen Overgeneralisation+Prefix ge without onset +dringd gedrongen Overgeneralisation+Lacking ge prefix +sedringd gedrongen Overgeneralisation+prefix ge pronounced as se +gedringde gedrongene Overgeneralisation+ +edringde gedrongene Overgeneralisation+Prefix ge without onset +sedringde gedrongene Overgeneralisation+prefix ge pronounced as se +gedringt gedrongen Overgeneralisation +edringt gedrongen Overgeneralisation +dringt gedrongen Overgeneralisation +gedringen gedrongen Wrong -en suffix +edringen gedrongen Wrong -en suffix +dringen gedrongen Wrong -en suffix +gedrongd gedrongen Overgeneralisation +gedrongt gedrongen Overgeneralisation +edrongen gedrongen Prefix ge without onset +drongen gedrongen Lacking ge prefix +drinkte dronk Overgeneralisation +drinkten dronken Overgeneralisation +dronkte dronk Irregular form plus regular suffix +dronkten dronken Irregular form plus regular suffix +gedrinkt gedronken Overgeneralisation +edrinkt gedronken Overgeneralisation +drinkt gedronken Overgeneralisation +sedrinkt gedronken Overgeneralisation+prefix ge pronounced as se +gedrinkte gedronkene Overgeneralisation+ +edrinkte gedronkene Overgeneralisation+Prefix ge without onset +sedrinkte gedronkene Overgeneralisation+prefix ge pronounced as se +gedrinken gedronken Wrong -en suffix +edrinken gedronken Wrong -en suffix +drinken gedronken Wrong -en suffix +gedronkt gedronken Overgeneralisation +edronken gedronken Prefix ge without onset +dronken gedronken Lacking ge prefix +druipte droop Overgeneralisation +druipten dropen Overgeneralisation +droopte droop Irregular form plus regular suffix +droopten dropen Irregular form plus regular suffix +gedruipt gedropen Overgeneralisation +edruipt gedropen Overgeneralisation +druipt gedropen Overgeneralisation +sedruipt gedropen Overgeneralisation+prefix ge pronounced as se +gedruipte gedropene Overgeneralisation+ +edruipte gedropene Overgeneralisation+Prefix ge without onset +sedruipte gedropene Overgeneralisation+prefix ge pronounced as se +gedruipen gedropen Wrong -en suffix +edruipen gedropen Wrong -en suffix +druipen gedropen Wrong -en suffix +gedroopt gedropen Overgeneralisation +edropen gedropen Prefix ge without onset +dropen gedropen Lacking ge prefix +duikte dook Overgeneralisation +duikten doken Overgeneralisation +dookte dook Irregular form plus regular suffix +dookten doken Irregular form plus regular suffix +geduikt gedoken Overgeneralisation +eduikt gedoken Overgeneralisation +duikt gedoken Overgeneralisation +seduikt gedoken Overgeneralisation+prefix ge pronounced as se +geduikte gedokene Overgeneralisation+ +eduikte gedokene Overgeneralisation+Prefix ge without onset +seduikte gedokene Overgeneralisation+prefix ge pronounced as se +geduiken gedoken Wrong -en suffix +eduiken gedoken Wrong -en suffix +duiken gedoken Wrong -en suffix +gedookt gedoken Overgeneralisation +edoken gedoken Prefix ge without onset +doken gedoken Lacking ge prefix +dwingde dwong Overgeneralisation +dwingden dwongen Overgeneralisation +dwongde dwong Irregular form plus regular suffix +dwongden dwongen Irregular form plus regular suffix +gedwingd gedwongen Overgeneralisation+ +edwingd gedwongen Overgeneralisation+Prefix ge without onset +dwingd gedwongen Overgeneralisation+Lacking ge prefix +sedwingd gedwongen Overgeneralisation+prefix ge pronounced as se +gedwingde gedwongene Overgeneralisation+ +edwingde gedwongene Overgeneralisation+Prefix ge without onset +sedwingde gedwongene Overgeneralisation+prefix ge pronounced as se +gedwingt gedwongen Overgeneralisation +edwingt gedwongen Overgeneralisation +dwingt gedwongen Overgeneralisation +gedwingen gedwongen Wrong -en suffix +edwingen gedwongen Wrong -en suffix +dwingen gedwongen Wrong -en suffix +gedwongd gedwongen Overgeneralisation +gedwongt gedwongen Overgeneralisation +edwongen gedwongen Prefix ge without onset +dwongen gedwongen Lacking ge prefix +eette at Overgeneralisation +eetten aten Overgeneralisation +atte at Irregular form plus regular suffix +atten aten Irregular form plus regular suffix +geeet gegeten Overgeneralisation+ +eeet gegeten Overgeneralisation+Prefix ge without onset +eet gegeten Overgeneralisation +seeet gegeten Overgeneralisation+prefix ge pronounced as se +geete gegetene Overgeneralisation+ +eete gegetene Overgeneralisation+Prefix ge without onset +seete gegetene Overgeneralisation+prefix ge pronounced as se +geëet gegeten Overgeneralisation +eëet gegeten Overgeneralisation +geëten gegeten Wrong -en suffix +eëten gegeten Wrong -en suffix +eten gegeten Wrong -en suffix +gegeet gegeten Overgeneralisation +egeten gegeten Prefix ge without onset +geten gegeten Lacking ge prefix +fluitte floot Overgeneralisation +fluitten floten Overgeneralisation +flootte floot Irregular form plus regular suffix +flootten floten Irregular form plus regular suffix +gefluit gefloten Overgeneralisation +efluit gefloten Overgeneralisation +fluit gefloten Overgeneralisation +sefluit gefloten Overgeneralisation+prefix ge pronounced as se +gefluite geflotene Overgeneralisation+ +efluite geflotene Overgeneralisation+Prefix ge without onset +sefluite geflotene Overgeneralisation+prefix ge pronounced as se +gefluiten gefloten Wrong -en suffix +efluiten gefloten Wrong -en suffix +fluiten gefloten Wrong -en suffix +gefloot gefloten Overgeneralisation +efloten gefloten Prefix ge without onset +floten gefloten Lacking ge prefix +gade ging Overgeneralisation +gaden gingen Overgeneralisation +gingde ging Irregular form plus regular suffix +gingden gingen Irregular form plus regular suffix +gegaad gegaan Overgeneralisation+ +egaad gegaan Overgeneralisation+Prefix ge without onset +gaad gegaan Overgeneralisation+Lacking ge prefix +segaad gegaan Overgeneralisation+prefix ge pronounced as se +gegade gegaane Overgeneralisation+ +egade gegaane Overgeneralisation+Prefix ge without onset +segade gegaane Overgeneralisation+prefix ge pronounced as se +gegaat gegaan Overgeneralisation +egaat gegaan Overgeneralisation +gaat gegaan Overgeneralisation +egaan gegaan Prefix ge without onset +gaan gegaan Lacking ge prefix +geldde gold Overgeneralisation +geldden golden Overgeneralisation +goldde gold Irregular form plus regular suffix +goldden golden Irregular form plus regular suffix +gegeld gegolden Overgeneralisation +egeld gegolden Overgeneralisation +geld gegolden Overgeneralisation +segeld gegolden Overgeneralisation+prefix ge pronounced as se +gegelde gegoldene Overgeneralisation+ +egelde gegoldene Overgeneralisation+Prefix ge without onset +segelde gegoldene Overgeneralisation+prefix ge pronounced as se +gegelden gegolden Wrong -en suffix +egelden gegolden Wrong -en suffix +gelden gegolden Wrong -en suffix +gegold gegolden Overgeneralisation +egolden gegolden Prefix ge without onset +golden gegolden Lacking ge prefix +geneesde genezene Overgeneralisation +geneesden genazen Overgeneralisation +genasde genas Irregular form plus regular suffix +genasden genazen Irregular form plus regular suffix +geneesd genezen Overgeneralisation +geneest genezen Overgeneralisation +genesen genezen Wrong -en suffix +enezen genezen Prefix ge without onset +nezen genezen Lacking ge prefix +geniette genoot Overgeneralisation +genietten genoten Overgeneralisation +genootte genoot Irregular form plus regular suffix +genootten genoten Irregular form plus regular suffix +geniet genoten Overgeneralisation +geniete genotene Overgeneralisation +genieten genoten Wrong -en suffix +genoot genoten Overgeneralisation +enoten genoten Prefix ge without onset +noten genoten Lacking ge prefix +geefde gaf Overgeneralisation +geefden gaven Overgeneralisation +gafde gaf Irregular form plus regular suffix +gafden gaven Irregular form plus regular suffix +gegeefd gegeven Overgeneralisation +egeefd gegeven Overgeneralisation+Prefix ge without onset +geefd gegeven Overgeneralisation+Lacking ge prefix +segeefd gegeven Overgeneralisation+prefix ge pronounced as se +gegeefde gegevene Overgeneralisation+ +egeefde gegevene Overgeneralisation+Prefix ge without onset +segeefde gegevene Overgeneralisation+prefix ge pronounced as se +gegeeft gegeven Overgeneralisation +egeeft gegeven Overgeneralisation +geeft gegeven Overgeneralisation +gegefen gegeven Wrong -en suffix +egefen gegeven Wrong -en suffix +gefen gegeven Wrong -en suffix +egeven gegeven Prefix ge without onset +geven gegeven Lacking ge prefix +giette goot Overgeneralisation +gietten goten Overgeneralisation +gootte goot Irregular form plus regular suffix +gootten goten Irregular form plus regular suffix +gegiet gegoten Overgeneralisation +egiet gegoten Overgeneralisation +giet gegoten Overgeneralisation +segiet gegoten Overgeneralisation+prefix ge pronounced as se +gegiete gegotene Overgeneralisation+ +egiete gegotene Overgeneralisation+Prefix ge without onset +segiete gegotene Overgeneralisation+prefix ge pronounced as se +gegieten gegoten Wrong -en suffix +egieten gegoten Wrong -en suffix +gieten gegoten Wrong -en suffix +gegoot gegoten Overgeneralisation +egoten gegoten Prefix ge without onset +goten gegoten Lacking ge prefix +glijdde gleed Overgeneralisation +glijdden gleden Overgeneralisation +gleedde gleed Irregular form plus regular suffix +gleedden gleden Irregular form plus regular suffix +geglijd gegleden Overgeneralisation +eglijd gegleden Overgeneralisation +glijd gegleden Overgeneralisation +seglijd gegleden Overgeneralisation+prefix ge pronounced as se +geglijde gegledene Overgeneralisation+ +eglijde gegledene Overgeneralisation+Prefix ge without onset +seglijde gegledene Overgeneralisation+prefix ge pronounced as se +geglijden gegleden Wrong -en suffix +eglijden gegleden Wrong -en suffix +glijden gegleden Wrong -en suffix +gegleed gegleden Overgeneralisation +egleden gegleden Prefix ge without onset +gleden gegleden Lacking ge prefix +glimde glom Overgeneralisation +glimden glommen Overgeneralisation +glomde glom Irregular form plus regular suffix +glomden glommen Irregular form plus regular suffix +geglimd geglommen Overgeneralisation+ +eglimd geglommen Overgeneralisation+Prefix ge without onset +glimd geglommen Overgeneralisation+Lacking ge prefix +seglimd geglommen Overgeneralisation+prefix ge pronounced as se +geglimde geglommene Overgeneralisation+ +eglimde geglommene Overgeneralisation+Prefix ge without onset +seglimde geglommene Overgeneralisation+prefix ge pronounced as se +geglimt geglommen Overgeneralisation +eglimt geglommen Overgeneralisation +glimt geglommen Overgeneralisation +geglimmen geglommen Wrong -en suffix +eglimmen geglommen Wrong -en suffix +glimmen geglommen Wrong -en suffix +geglomt geglommen Overgeneralisation +eglommen geglommen Prefix ge without onset +glommen geglommen Lacking ge prefix +graafde groef Overgeneralisation +graafden groeven Overgeneralisation +groefde groef Irregular form plus regular suffix +groefden groeven Irregular form plus regular suffix +gegraafd gegraven Overgeneralisation +egraafd gegraven Overgeneralisation+Prefix ge without onset +graafd gegraven Overgeneralisation+Lacking ge prefix +segraafd gegraven Overgeneralisation+prefix ge pronounced as se +gegraafde gegravene Overgeneralisation+ +egraafde gegravene Overgeneralisation+Prefix ge without onset +segraafde gegravene Overgeneralisation+prefix ge pronounced as se +gegraaft gegraven Overgeneralisation +egraaft gegraven Overgeneralisation +graaft gegraven Overgeneralisation +gegrafen gegraven Wrong -en suffix +egrafen gegraven Wrong -en suffix +grafen gegraven Wrong -en suffix +egraven gegraven Prefix ge without onset +graven gegraven Lacking ge prefix +grijpte greep Overgeneralisation +grijpten grepen Overgeneralisation +greepte greep Irregular form plus regular suffix +greepten grepen Irregular form plus regular suffix +gegrijpt gegrepen Overgeneralisation +egrijpt gegrepen Overgeneralisation +grijpt gegrepen Overgeneralisation +segrijpt gegrepen Overgeneralisation+prefix ge pronounced as se +gegrijpte gegrepene Overgeneralisation+ +egrijpte gegrepene Overgeneralisation+Prefix ge without onset +segrijpte gegrepene Overgeneralisation+prefix ge pronounced as se +gegrijpen gegrepen Wrong -en suffix +egrijpen gegrepen Wrong -en suffix +grijpen gegrepen Wrong -en suffix +gegreept gegrepen Overgeneralisation +egrepen gegrepen Prefix ge without onset +grepen gegrepen Lacking ge prefix +hangde hing Overgeneralisation +hangden hingen Overgeneralisation +hingde hing Irregular form plus regular suffix +hingden hingen Irregular form plus regular suffix +gehangd gehangen Overgeneralisation +ehangd gehangen Overgeneralisation+Prefix ge without onset +hangd gehangen Overgeneralisation+Lacking ge prefix +sehangd gehangen Overgeneralisation+prefix ge pronounced as se +gehangde gehangene Overgeneralisation+ +ehangde gehangene Overgeneralisation+Prefix ge without onset +sehangde gehangene Overgeneralisation+prefix ge pronounced as se +gehangt gehangen Overgeneralisation +ehangt gehangen Overgeneralisation +hangt gehangen Overgeneralisation +ehangen gehangen Prefix ge without onset +hangen gehangen Lacking ge prefix +hebde had Overgeneralisation +hebden hadden Overgeneralisation +hadde had Irregular form plus regular suffix +gehebd gehad Overgeneralisation+ +ehebd gehad Overgeneralisation+Prefix ge without onset +hebd gehad Overgeneralisation+Lacking ge prefix +sehebd gehad Overgeneralisation+prefix ge pronounced as se +gehebde gehade Overgeneralisation+ +ehebde gehade Overgeneralisation+Prefix ge without onset +sehebde gehade Overgeneralisation+prefix ge pronounced as se +gehebt gehad Overgeneralisation +ehebt gehad Overgeneralisation +hebt gehad Overgeneralisation +gehebben gehad Wrong -en suffix +ehebben gehad Wrong -en suffix +hebben gehad Wrong -en suffix +ehad gehad Prefix ge without onset +had gehad Lacking ge prefix +hefte hief Overgeneralisation +heften hieven Overgeneralisation +hiefte hief Irregular form plus regular suffix +hieften hieven Irregular form plus regular suffix +geheft geheven Overgeneralisation +eheft geheven Overgeneralisation +heft geheven Overgeneralisation +seheft geheven Overgeneralisation+prefix ge pronounced as se +gehefte gehevene Overgeneralisation+ +ehefte gehevene Overgeneralisation+Prefix ge without onset +sehefte gehevene Overgeneralisation+prefix ge pronounced as se +geheffen geheven Wrong -en suffix +eheffen geheven Wrong -en suffix +heffen geheven Wrong -en suffix +geheefd geheven Overgeneralisation +geheeft geheven Overgeneralisation +eheven geheven Prefix ge without onset +heven geheven Lacking ge prefix +helpte hielp Overgeneralisation +helpten hielpen Overgeneralisation +hielpte hielp Irregular form plus regular suffix +hielpten hielpen Irregular form plus regular suffix +gehelpt geholpen Overgeneralisation +ehelpt geholpen Overgeneralisation +helpt geholpen Overgeneralisation +sehelpt geholpen Overgeneralisation+prefix ge pronounced as se +gehelpte geholpene Overgeneralisation+ +ehelpte geholpene Overgeneralisation+Prefix ge without onset +sehelpte geholpene Overgeneralisation+prefix ge pronounced as se +gehelpen geholpen Wrong -en suffix +ehelpen geholpen Wrong -en suffix +helpen geholpen Wrong -en suffix +geholpt geholpen Overgeneralisation +eholpen geholpen Prefix ge without onset +holpen geholpen Lacking ge prefix +geheet geheten Overgeneralisation +eheet geheten Overgeneralisation +heet geheten Overgeneralisation +seheet geheten Overgeneralisation+prefix ge pronounced as se +gehete gehetene Overgeneralisation+ +ehete gehetene Overgeneralisation+Prefix ge without onset +sehete gehetene Overgeneralisation+prefix ge pronounced as se +eheten geheten Prefix ge without onset +heten geheten Lacking ge prefix +hijste hees Overgeneralisation +hijsten hesen Overgeneralisation +heeste hees Irregular form plus regular suffix +heesten hesen Irregular form plus regular suffix +gehijst gehesen Overgeneralisation +ehijst gehesen Overgeneralisation +hijst gehesen Overgeneralisation +sehijst gehesen Overgeneralisation+prefix ge pronounced as se +gehijste gehesene Overgeneralisation+ +ehijste gehesene Overgeneralisation+Prefix ge without onset +sehijste gehesene Overgeneralisation+prefix ge pronounced as se +gehijsen gehesen Wrong -en suffix +ehijsen gehesen Wrong -en suffix +hijsen gehesen Wrong -en suffix +geheest gehesen Overgeneralisation +ehesen gehesen Prefix ge without onset +hesen gehesen Lacking ge prefix +gehoefd gehoeven Overgeneralisation +ehoefd gehoeven Overgeneralisation+Prefix ge without onset +hoefd gehoeven Overgeneralisation+Lacking ge prefix +sehoefd gehoeven Overgeneralisation+prefix ge pronounced as se +gehoefde gehoevene Overgeneralisation+ +ehoefde gehoevene Overgeneralisation+Prefix ge without onset +sehoefde gehoevene Overgeneralisation+prefix ge pronounced as se +gehoeft gehoeven Overgeneralisation +ehoeft gehoeven Overgeneralisation +hoeft gehoeven Overgeneralisation +gehoefen gehoeven Wrong -en suffix +ehoefen gehoeven Wrong -en suffix +hoefen gehoeven Wrong -en suffix +ehoeven gehoeven Prefix ge without onset +hoeven gehoeven Lacking ge prefix +houdde hield Overgeneralisation +houdden hielden Overgeneralisation +hieldde hield Irregular form plus regular suffix +hieldden hielden Irregular form plus regular suffix +gehoud gehouden Overgeneralisation +ehoud gehouden Overgeneralisation +houd gehouden Overgeneralisation +sehoud gehouden Overgeneralisation+prefix ge pronounced as se +gehoude gehoudene Overgeneralisation+ +ehoude gehoudene Overgeneralisation+Prefix ge without onset +sehoude gehoudene Overgeneralisation+prefix ge pronounced as se +ehouden gehouden Prefix ge without onset +houden gehouden Lacking ge prefix +houwde hieuw Overgeneralisation +houwden hieuwen Overgeneralisation +hieuwde hieuw Irregular form plus regular suffix +hieuwden hieuwen Irregular form plus regular suffix +gehouwd gehouwen Overgeneralisation +ehouwd gehouwen Overgeneralisation+Prefix ge without onset +houwd gehouwen Overgeneralisation+Lacking ge prefix +sehouwd gehouwen Overgeneralisation+prefix ge pronounced as se +gehouwde gehouwene Overgeneralisation+ +ehouwde gehouwene Overgeneralisation+Prefix ge without onset +sehouwde gehouwene Overgeneralisation+prefix ge pronounced as se +gehouwt gehouwen Overgeneralisation +ehouwt gehouwen Overgeneralisation +houwt gehouwen Overgeneralisation +ehouwen gehouwen Prefix ge without onset +houwen gehouwen Lacking ge prefix +ejaagd gejaagd Prefix ge without onset +jaagd gejaagd Lacking ge prefix +sejaagd gejaagd Overgeneralisation+prefix ge pronounced as se +ejaagde gejaagde Overgeneralisation+Prefix ge without onset +sejaagde gejaagde Overgeneralisation+prefix ge pronounced as se +gejaagt gejaagd Overgeneralisation +ejaagt gejaagd Overgeneralisation +jaagt gejaagd Overgeneralisation +gejagen gejaagd Wrong -en suffix +ejagen gejaagd Wrong -en suffix +jagen gejaagd Wrong -en suffix +kiesde koos Overgeneralisation +kiesden kozen Overgeneralisation +koosde koos Irregular form plus regular suffix +koosden kozen Irregular form plus regular suffix +gekiesd gekozen Overgeneralisation+ +ekiesd gekozen Overgeneralisation+Prefix ge without onset +kiesd gekozen Overgeneralisation+Lacking ge prefix +sekiesd gekozen Overgeneralisation+prefix ge pronounced as se +gekiesde gekozene Overgeneralisation+ +ekiesde gekozene Overgeneralisation+Prefix ge without onset +sekiesde gekozene Overgeneralisation+prefix ge pronounced as se +gekiest gekozen Overgeneralisation +ekiest gekozen Overgeneralisation +kiest gekozen Overgeneralisation +gekiesen gekozen Wrong -en suffix +ekiesen gekozen Wrong -en suffix +kiesen gekozen Wrong -en suffix +gekoost gekozen Overgeneralisation +ekozen gekozen Prefix ge without onset +kozen gekozen Lacking ge prefix +kijkte keek Overgeneralisation +kijkten keken Overgeneralisation +keekte keek Irregular form plus regular suffix +keekten keken Irregular form plus regular suffix +gekijkt gekeken Overgeneralisation +ekijkt gekeken Overgeneralisation +kijkt gekeken Overgeneralisation +sekijkt gekeken Overgeneralisation+prefix ge pronounced as se +gekijkte gekekene Overgeneralisation+ +ekijkte gekekene Overgeneralisation+Prefix ge without onset +sekijkte gekekene Overgeneralisation+prefix ge pronounced as se +gekijken gekeken Wrong -en suffix +ekijken gekeken Wrong -en suffix +kijken gekeken Wrong -en suffix +gekeekt gekeken Overgeneralisation +ekeken gekeken Prefix ge without onset +keken gekeken Lacking ge prefix +klimde klom Overgeneralisation +klimden klommen Overgeneralisation +klomde klom Irregular form plus regular suffix +klomden klommen Irregular form plus regular suffix +geklimd geklommen Overgeneralisation+ +eklimd geklommen Overgeneralisation+Prefix ge without onset +klimd geklommen Overgeneralisation+Lacking ge prefix +seklimd geklommen Overgeneralisation+prefix ge pronounced as se +geklimde geklommene Overgeneralisation+ +eklimde geklommene Overgeneralisation+Prefix ge without onset +seklimde geklommene Overgeneralisation+prefix ge pronounced as se +geklimt geklommen Overgeneralisation +eklimt geklommen Overgeneralisation +klimt geklommen Overgeneralisation +geklimmen geklommen Wrong -en suffix +eklimmen geklommen Wrong -en suffix +klimmen geklommen Wrong -en suffix +geklomt geklommen Overgeneralisation +eklommen geklommen Prefix ge without onset +klommen geklommen Lacking ge prefix +klinkte klonk Overgeneralisation +klinkten klonken Overgeneralisation +klonkte klonk Irregular form plus regular suffix +klonkten klonken Irregular form plus regular suffix +geklinkt geklonken Overgeneralisation +eklinkt geklonken Overgeneralisation +klinkt geklonken Overgeneralisation +seklinkt geklonken Overgeneralisation+prefix ge pronounced as se +geklinkte geklonkene Overgeneralisation+ +eklinkte geklonkene Overgeneralisation+Prefix ge without onset +seklinkte geklonkene Overgeneralisation+prefix ge pronounced as se +geklinken geklonken Wrong -en suffix +eklinken geklonken Wrong -en suffix +klinken geklonken Wrong -en suffix +geklonkt geklonken Overgeneralisation +eklonken geklonken Prefix ge without onset +klonken geklonken Lacking ge prefix +kluifde kloof Overgeneralisation +kluifden kloven Overgeneralisation +kloofde kloof Irregular form plus regular suffix +kloofden kloven Irregular form plus regular suffix +gekluifd gekloven Overgeneralisation+ +ekluifd gekloven Overgeneralisation+Prefix ge without onset +kluifd gekloven Overgeneralisation+Lacking ge prefix +sekluifd gekloven Overgeneralisation+prefix ge pronounced as se +gekluifde geklovene Overgeneralisation+ +ekluifde geklovene Overgeneralisation+Prefix ge without onset +sekluifde geklovene Overgeneralisation+prefix ge pronounced as se +gekluift gekloven Overgeneralisation +ekluift gekloven Overgeneralisation +kluift gekloven Overgeneralisation +gekluifen gekloven Wrong -en suffix +ekluifen gekloven Wrong -en suffix +kluifen gekloven Wrong -en suffix +geklooft gekloven Overgeneralisation +ekloven gekloven Prefix ge without onset +kloven gekloven Lacking ge prefix +knijpte kneep Overgeneralisation +knijpten knepen Overgeneralisation +kneepte kneep Irregular form plus regular suffix +kneepten knepen Irregular form plus regular suffix +geknijpt geknepen Overgeneralisation +eknijpt geknepen Overgeneralisation +knijpt geknepen Overgeneralisation +seknijpt geknepen Overgeneralisation+prefix ge pronounced as se +geknijpte geknepene Overgeneralisation+ +eknijpte geknepene Overgeneralisation+Prefix ge without onset +seknijpte geknepene Overgeneralisation+prefix ge pronounced as se +geknijpen geknepen Wrong -en suffix +eknijpen geknepen Wrong -en suffix +knijpen geknepen Wrong -en suffix +gekneept geknepen Overgeneralisation +eknepen geknepen Prefix ge without onset +knepen geknepen Lacking ge prefix +koomte kwam Overgeneralisation +koomten kwamen Overgeneralisation +kwamte kwam Irregular form plus regular suffix +kwamten kwamen Irregular form plus regular suffix +gekoomt gekomen Overgeneralisation +ekoomt gekomen Overgeneralisation +koomt gekomen Overgeneralisation +sekoomt gekomen Overgeneralisation+prefix ge pronounced as se +gekoomte gekomene Overgeneralisation+ +ekoomte gekomene Overgeneralisation+Prefix ge without onset +sekoomte gekomene Overgeneralisation+prefix ge pronounced as se +ekomen gekomen Prefix ge without onset +komen gekomen Lacking ge prefix +koopte kocht Overgeneralisation +koopten kochten Overgeneralisation +kochtte kocht Irregular form plus regular suffix +kochtten kochten Irregular form plus regular suffix +gekoopt gekocht Overgeneralisation +ekoopt gekocht Overgeneralisation +koopt gekocht Overgeneralisation +sekoopt gekocht Overgeneralisation+prefix ge pronounced as se +gekoopte gekochte Overgeneralisation+ +ekoopte gekochte Overgeneralisation+Prefix ge without onset +sekoopte gekochte Overgeneralisation+prefix ge pronounced as se +gekopen gekocht Wrong -en suffix +ekopen gekocht Wrong -en suffix +kopen gekocht Wrong -en suffix +ekocht gekocht Prefix ge without onset +kocht gekocht Lacking ge prefix +krijgde kreeg Overgeneralisation +krijgden kregen Overgeneralisation +kreegde kreeg Irregular form plus regular suffix +kreegden kregen Irregular form plus regular suffix +gekrijgd gekregen Overgeneralisation+ +ekrijgd gekregen Overgeneralisation+Prefix ge without onset +krijgd gekregen Overgeneralisation+Lacking ge prefix +sekrijgd gekregen Overgeneralisation+prefix ge pronounced as se +gekrijgde gekregene Overgeneralisation+ +ekrijgde gekregene Overgeneralisation+Prefix ge without onset +sekrijgde gekregene Overgeneralisation+prefix ge pronounced as se +gekrijgt gekregen Overgeneralisation +ekrijgt gekregen Overgeneralisation +krijgt gekregen Overgeneralisation +gekrijgen gekregen Wrong -en suffix +ekrijgen gekregen Wrong -en suffix +krijgen gekregen Wrong -en suffix +gekreegd gekregen Overgeneralisation +gekreegt gekregen Overgeneralisation +ekregen gekregen Prefix ge without onset +kregen gekregen Lacking ge prefix +krimpte kromp Overgeneralisation +krimpten krompen Overgeneralisation +krompte kromp Irregular form plus regular suffix +krompten krompen Irregular form plus regular suffix +gekrimpt gekrompen Overgeneralisation +ekrimpt gekrompen Overgeneralisation +krimpt gekrompen Overgeneralisation +sekrimpt gekrompen Overgeneralisation+prefix ge pronounced as se +gekrimpte gekrompene Overgeneralisation+ +ekrimpte gekrompene Overgeneralisation+Prefix ge without onset +sekrimpte gekrompene Overgeneralisation+prefix ge pronounced as se +gekrimpen gekrompen Wrong -en suffix +ekrimpen gekrompen Wrong -en suffix +krimpen gekrompen Wrong -en suffix +gekrompt gekrompen Overgeneralisation +ekrompen gekrompen Prefix ge without onset +krompen gekrompen Lacking ge prefix +kruipte kroop Overgeneralisation +kruipten kropen Overgeneralisation +kroopte kroop Irregular form plus regular suffix +kroopten kropen Irregular form plus regular suffix +gekruipt gekropen Overgeneralisation +ekruipt gekropen Overgeneralisation +kruipt gekropen Overgeneralisation +sekruipt gekropen Overgeneralisation+prefix ge pronounced as se +gekruipte gekropene Overgeneralisation+ +ekruipte gekropene Overgeneralisation+Prefix ge without onset +sekruipte gekropene Overgeneralisation+prefix ge pronounced as se +gekruipen gekropen Wrong -en suffix +ekruipen gekropen Wrong -en suffix +kruipen gekropen Wrong -en suffix +gekroopt gekropen Overgeneralisation +ekropen gekropen Prefix ge without onset +kropen gekropen Lacking ge prefix +kwijtte kweet Overgeneralisation +kwijtten kweten Overgeneralisation +kweette kweet Irregular form plus regular suffix +kweetten kweten Irregular form plus regular suffix +gekwijt gekweten Overgeneralisation +ekwijt gekweten Overgeneralisation +kwijt gekweten Overgeneralisation +sekwijt gekweten Overgeneralisation+prefix ge pronounced as se +gekwijte gekwetene Overgeneralisation+ +ekwijte gekwetene Overgeneralisation+Prefix ge without onset +sekwijte gekwetene Overgeneralisation+prefix ge pronounced as se +gekwijten gekweten Wrong -en suffix +ekwijten gekweten Wrong -en suffix +kwijten gekweten Wrong -en suffix +gekweet gekweten Overgeneralisation +ekweten gekweten Prefix ge without onset +kweten gekweten Lacking ge prefix +lachde lachte Overgeneralisation +lachden lachten Overgeneralisation +gelachd gelachen Overgeneralisation +elachd gelachen Overgeneralisation+Prefix ge without onset +lachd gelachen Overgeneralisation+Lacking ge prefix +selachd gelachen Overgeneralisation+prefix ge pronounced as se +gelachde gelachene Overgeneralisation+ +elachde gelachene Overgeneralisation+Prefix ge without onset +selachde gelachene Overgeneralisation+prefix ge pronounced as se +gelacht gelachen Overgeneralisation +elacht gelachen Overgeneralisation +lacht gelachen Overgeneralisation +elachen gelachen Prefix ge without onset +lachen gelachen Lacking ge prefix +gelaad geladen Overgeneralisation +elaad geladen Overgeneralisation +laad geladen Overgeneralisation +selaad geladen Overgeneralisation+prefix ge pronounced as se +gelade geladene Overgeneralisation+ +elade geladene Overgeneralisation+Prefix ge without onset +selade geladene Overgeneralisation+prefix ge pronounced as se +eladen geladen Prefix ge without onset +laden geladen Lacking ge prefix +laatte liet Overgeneralisation +laatten lieten Overgeneralisation +liette liet Irregular form plus regular suffix +lietten lieten Irregular form plus regular suffix +gelaat gelaten Overgeneralisation +elaat gelaten Overgeneralisation +laat gelaten Overgeneralisation +selaat gelaten Overgeneralisation+prefix ge pronounced as se +gelate gelatene Overgeneralisation+ +elate gelatene Overgeneralisation+Prefix ge without onset +selate gelatene Overgeneralisation+prefix ge pronounced as se +elaten gelaten Prefix ge without onset +laten gelaten Lacking ge prefix +leesde las Overgeneralisation +leesden lazen Overgeneralisation +lasde las Irregular form plus regular suffix +lasden lazen Irregular form plus regular suffix +geleesd gelezen Overgeneralisation +eleesd gelezen Overgeneralisation+Prefix ge without onset +leesd gelezen Overgeneralisation+Lacking ge prefix +seleesd gelezen Overgeneralisation+prefix ge pronounced as se +geleesde gelezene Overgeneralisation+ +eleesde gelezene Overgeneralisation+Prefix ge without onset +seleesde gelezene Overgeneralisation+prefix ge pronounced as se +geleest gelezen Overgeneralisation +eleest gelezen Overgeneralisation +leest gelezen Overgeneralisation +gelesen gelezen Wrong -en suffix +elesen gelezen Wrong -en suffix +lesen gelezen Wrong -en suffix +elezen gelezen Prefix ge without onset +lezen gelezen Lacking ge prefix +liegde loog Overgeneralisation +liegden logen Overgeneralisation +loogde loog Irregular form plus regular suffix +loogden logen Irregular form plus regular suffix +geliegd gelogen Overgeneralisation+ +eliegd gelogen Overgeneralisation+Prefix ge without onset +liegd gelogen Overgeneralisation+Lacking ge prefix +seliegd gelogen Overgeneralisation+prefix ge pronounced as se +geliegde gelogene Overgeneralisation+ +eliegde gelogene Overgeneralisation+Prefix ge without onset +seliegde gelogene Overgeneralisation+prefix ge pronounced as se +geliegt gelogen Overgeneralisation +eliegt gelogen Overgeneralisation +liegt gelogen Overgeneralisation +geliegen gelogen Wrong -en suffix +eliegen gelogen Wrong -en suffix +liegen gelogen Wrong -en suffix +geloogt gelogen Overgeneralisation +elogen gelogen Prefix ge without onset +logen gelogen Lacking ge prefix +ligde lag Overgeneralisation +ligden lagen Overgeneralisation +lagde lag Irregular form plus regular suffix +lagden lagen Irregular form plus regular suffix +geligd gelegen Overgeneralisation+ +eligd gelegen Overgeneralisation+Prefix ge without onset +ligd gelegen Overgeneralisation+Lacking ge prefix +seligd gelegen Overgeneralisation+prefix ge pronounced as se +geligde gelegene Overgeneralisation+ +eligde gelegene Overgeneralisation+Prefix ge without onset +seligde gelegene Overgeneralisation+prefix ge pronounced as se +geligt gelegen Overgeneralisation +eligt gelegen Overgeneralisation +ligt gelegen Overgeneralisation +geliggen gelegen Wrong -en suffix +eliggen gelegen Wrong -en suffix +liggen gelegen Wrong -en suffix +geleegd gelegen Overgeneralisation +geleegt gelegen Overgeneralisation +elegen gelegen Prefix ge without onset +legen gelegen Lacking ge prefix +lijdde leed Overgeneralisation +lijdden leden Overgeneralisation +leedde leed Irregular form plus regular suffix +leedden leden Irregular form plus regular suffix +gelijd geleden Overgeneralisation +elijd geleden Overgeneralisation +lijd geleden Overgeneralisation +selijd geleden Overgeneralisation+prefix ge pronounced as se +gelijde geledene Overgeneralisation+ +elijde geledene Overgeneralisation+Prefix ge without onset +selijde geledene Overgeneralisation+prefix ge pronounced as se +gelijden geleden Wrong -en suffix +elijden geleden Wrong -en suffix +lijden geleden Wrong -en suffix +geleed geleden Overgeneralisation +eleden geleden Prefix ge without onset +leden geleden Lacking ge prefix +lijkte leek Overgeneralisation +lijkten leken Overgeneralisation +leekte leek Irregular form plus regular suffix +leekten leken Irregular form plus regular suffix +gelijkt geleken Overgeneralisation +elijkt geleken Overgeneralisation +lijkt geleken Overgeneralisation +selijkt geleken Overgeneralisation+prefix ge pronounced as se +gelijkte gelekene Overgeneralisation+ +elijkte gelekene Overgeneralisation+Prefix ge without onset +selijkte gelekene Overgeneralisation+prefix ge pronounced as se +gelijken geleken Wrong -en suffix +elijken geleken Wrong -en suffix +lijken geleken Wrong -en suffix +geleekt geleken Overgeneralisation +eleken geleken Prefix ge without onset +leken geleken Lacking ge prefix +loopte liep Overgeneralisation +loopten liepen Overgeneralisation +liepte liep Irregular form plus regular suffix +liepten liepen Irregular form plus regular suffix +geloopt gelopen Overgeneralisation +eloopt gelopen Overgeneralisation +loopt gelopen Overgeneralisation +seloopt gelopen Overgeneralisation+prefix ge pronounced as se +geloopte gelopene Overgeneralisation+ +eloopte gelopene Overgeneralisation+Prefix ge without onset +seloopte gelopene Overgeneralisation+prefix ge pronounced as se +elopen gelopen Prefix ge without onset +lopen gelopen Lacking ge prefix +gemaald gemalen Overgeneralisation +emaald gemalen Overgeneralisation+Prefix ge without onset +maald gemalen Overgeneralisation+Lacking ge prefix +semaald gemalen Overgeneralisation+prefix ge pronounced as se +gemaalde gemalene Overgeneralisation+ +emaalde gemalene Overgeneralisation+Prefix ge without onset +semaalde gemalene Overgeneralisation+prefix ge pronounced as se +gemaalt gemalen Overgeneralisation +emaalt gemalen Overgeneralisation +maalt gemalen Overgeneralisation +emalen gemalen Prefix ge without onset +malen gemalen Lacking ge prefix +emelkt gemelkt Prefix ge without onset +melkt gemelkt Lacking ge prefix +semelkt gemelkt Overgeneralisation+prefix ge pronounced as se +emelkte gemelkte Overgeneralisation+Prefix ge without onset +semelkte gemelkte Overgeneralisation+prefix ge pronounced as se +gemelken gemelkt Wrong -en suffix +emelken gemelkt Wrong -en suffix +melken gemelkt Wrong -en suffix +meette mat Overgeneralisation +meetten maten Overgeneralisation +matte mat Irregular form plus regular suffix +matten maten Irregular form plus regular suffix +gemeet gemeten Overgeneralisation +emeet gemeten Overgeneralisation +meet gemeten Overgeneralisation +semeet gemeten Overgeneralisation+prefix ge pronounced as se +gemete gemetene Overgeneralisation+ +emete gemetene Overgeneralisation+Prefix ge without onset +semete gemetene Overgeneralisation+prefix ge pronounced as se +emeten gemeten Prefix ge without onset +meten gemeten Lacking ge prefix +mijdde meed Overgeneralisation +mijdden meden Overgeneralisation +meedde meed Irregular form plus regular suffix +meedden meden Irregular form plus regular suffix +gemijd gemeden Overgeneralisation +emijd gemeden Overgeneralisation +mijd gemeden Overgeneralisation +semijd gemeden Overgeneralisation+prefix ge pronounced as se +gemijde gemedene Overgeneralisation+ +emijde gemedene Overgeneralisation+Prefix ge without onset +semijde gemedene Overgeneralisation+prefix ge pronounced as se +gemijden gemeden Wrong -en suffix +emijden gemeden Wrong -en suffix +mijden gemeden Wrong -en suffix +gemeed gemeden Overgeneralisation +emeden gemeden Prefix ge without onset +meden gemeden Lacking ge prefix +moette moest Overgeneralisation +moetten moesten Overgeneralisation +moestte moest Irregular form plus regular suffix +moestten moesten Irregular form plus regular suffix +gemoet gemoeten Overgeneralisation +emoet gemoeten Overgeneralisation +moet gemoeten Overgeneralisation +semoet gemoeten Overgeneralisation+prefix ge pronounced as se +gemoete gemoetene Overgeneralisation+ +emoete gemoetene Overgeneralisation+Prefix ge without onset +semoete gemoetene Overgeneralisation+prefix ge pronounced as se +emoeten gemoeten Prefix ge without onset +moeten gemoeten Lacking ge prefix +neemde nam Overgeneralisation +neemden namen Overgeneralisation +namde nam Irregular form plus regular suffix +namden namen Irregular form plus regular suffix +geneemd genomen Overgeneralisation+ +eneemd genomen Overgeneralisation+Prefix ge without onset +neemd genomen Overgeneralisation+Lacking ge prefix +seneemd genomen Overgeneralisation+prefix ge pronounced as se +geneemde genomene Overgeneralisation+ +eneemde genomene Overgeneralisation+Prefix ge without onset +seneemde genomene Overgeneralisation+prefix ge pronounced as se +geneemt genomen Overgeneralisation +eneemt genomen Overgeneralisation +neemt genomen Overgeneralisation +genemen genomen Wrong -en suffix +enemen genomen Wrong -en suffix +nemen genomen Wrong -en suffix +genoomt genomen Overgeneralisation +enomen genomen Prefix ge without onset +nomen genomen Lacking ge prefix +nijgde neeg Overgeneralisation +nijgden negen Overgeneralisation +neegde neeg Irregular form plus regular suffix +neegden negen Irregular form plus regular suffix +genijgd genegen Overgeneralisation+ +enijgd genegen Overgeneralisation+Prefix ge without onset +nijgd genegen Overgeneralisation+Lacking ge prefix +senijgd genegen Overgeneralisation+prefix ge pronounced as se +genijgde genegene Overgeneralisation+ +enijgde genegene Overgeneralisation+Prefix ge without onset +senijgde genegene Overgeneralisation+prefix ge pronounced as se +genijgt genegen Overgeneralisation +enijgt genegen Overgeneralisation +nijgt genegen Overgeneralisation +genijgen genegen Wrong -en suffix +enijgen genegen Wrong -en suffix +nijgen genegen Wrong -en suffix +geneegd genegen Overgeneralisation +geneegt genegen Overgeneralisation +enegen genegen Prefix ge without onset +negen genegen Lacking ge prefix +ontginde ontgonnene Overgeneralisation +ontginden ontgonnen Overgeneralisation +ontgonde ontgon Irregular form plus regular suffix +ontgonden ontgonnen Irregular form plus regular suffix +ontgind ontgonnen Overgeneralisation +ontgint ontgonnen Overgeneralisation +ontginnen ontgonnen Wrong -en suffix +ontgont ontgonnen Overgeneralisation +ontluikte ontlokene Overgeneralisation +ontluikten ontloken Overgeneralisation +ontlookte ontlook Irregular form plus regular suffix +ontlookten ontloken Irregular form plus regular suffix +ontluikt ontloken Overgeneralisation +ontluiken ontloken Wrong -en suffix +ontlookt ontloken Overgeneralisation +pluisde ploos Overgeneralisation +pluisden plozen Overgeneralisation +ploosde ploos Irregular form plus regular suffix +ploosden plozen Irregular form plus regular suffix +gepluisd geplozen Overgeneralisation+ +epluisd geplozen Overgeneralisation+Prefix ge without onset +pluisd geplozen Overgeneralisation+Lacking ge prefix +sepluisd geplozen Overgeneralisation+prefix ge pronounced as se +gepluisde geplozene Overgeneralisation+ +epluisde geplozene Overgeneralisation+Prefix ge without onset +sepluisde geplozene Overgeneralisation+prefix ge pronounced as se +gepluist geplozen Overgeneralisation +epluist geplozen Overgeneralisation +pluist geplozen Overgeneralisation +gepluisen geplozen Wrong -en suffix +epluisen geplozen Wrong -en suffix +pluisen geplozen Wrong -en suffix +geploost geplozen Overgeneralisation +eplozen geplozen Prefix ge without onset +plozen geplozen Lacking ge prefix +prijsde prees Overgeneralisation +prijsden prezen Overgeneralisation +preesde prees Irregular form plus regular suffix +preesden prezen Irregular form plus regular suffix +geprijsd geprezen Overgeneralisation+ +eprijsd geprezen Overgeneralisation+Prefix ge without onset +prijsd geprezen Overgeneralisation+Lacking ge prefix +seprijsd geprezen Overgeneralisation+prefix ge pronounced as se +geprijsde geprezene Overgeneralisation+ +eprijsde geprezene Overgeneralisation+Prefix ge without onset +seprijsde geprezene Overgeneralisation+prefix ge pronounced as se +geprijst geprezen Overgeneralisation +eprijst geprezen Overgeneralisation +prijst geprezen Overgeneralisation +geprijsen geprezen Wrong -en suffix +eprijsen geprezen Wrong -en suffix +prijsen geprezen Wrong -en suffix +gepreesd geprezen Overgeneralisation +gepreest geprezen Overgeneralisation +eprezen geprezen Prefix ge without onset +prezen geprezen Lacking ge prefix +geraad geraden Overgeneralisation +eraad geraden Overgeneralisation +raad geraden Overgeneralisation +seraad geraden Overgeneralisation+prefix ge pronounced as se +gerade geradene Overgeneralisation+ +erade geradene Overgeneralisation+Prefix ge without onset +serade geradene Overgeneralisation+prefix ge pronounced as se +eraden geraden Prefix ge without onset +raden geraden Lacking ge prefix +verraad verraden Overgeneralisation +verrade verradene Overgeneralisation +rijdde reed Overgeneralisation +rijdden reden Overgeneralisation +reedde reed Irregular form plus regular suffix +reedden reden Irregular form plus regular suffix +gerijd gereden Overgeneralisation +erijd gereden Overgeneralisation +rijd gereden Overgeneralisation +serijd gereden Overgeneralisation+prefix ge pronounced as se +gerijde geredene Overgeneralisation+ +erijde geredene Overgeneralisation+Prefix ge without onset +serijde geredene Overgeneralisation+prefix ge pronounced as se +gerijden gereden Wrong -en suffix +erijden gereden Wrong -en suffix +rijden gereden Wrong -en suffix +gereed gereden Overgeneralisation +ereden gereden Prefix ge without onset +reden gereden Lacking ge prefix +rijgde reeg Overgeneralisation +rijgden regen Overgeneralisation +reegde reeg Irregular form plus regular suffix +reegden regen Irregular form plus regular suffix +gerijgd geregen Overgeneralisation+ +erijgd geregen Overgeneralisation+Prefix ge without onset +rijgd geregen Overgeneralisation+Lacking ge prefix +serijgd geregen Overgeneralisation+prefix ge pronounced as se +gerijgde geregene Overgeneralisation+ +erijgde geregene Overgeneralisation+Prefix ge without onset +serijgde geregene Overgeneralisation+prefix ge pronounced as se +gerijgt geregen Overgeneralisation +erijgt geregen Overgeneralisation +rijgt geregen Overgeneralisation +gerijgen geregen Wrong -en suffix +erijgen geregen Wrong -en suffix +rijgen geregen Wrong -en suffix +gereegd geregen Overgeneralisation +gereegt geregen Overgeneralisation +eregen geregen Prefix ge without onset +regen geregen Lacking ge prefix +rijtte reet Overgeneralisation +rijtten reten Overgeneralisation +reette reet Irregular form plus regular suffix +reetten reten Irregular form plus regular suffix +gerijt gereten Overgeneralisation +erijt gereten Overgeneralisation +rijt gereten Overgeneralisation +serijt gereten Overgeneralisation+prefix ge pronounced as se +gerijte geretene Overgeneralisation+ +erijte geretene Overgeneralisation+Prefix ge without onset +serijte geretene Overgeneralisation+prefix ge pronounced as se +gerijten gereten Wrong -en suffix +erijten gereten Wrong -en suffix +rijten gereten Wrong -en suffix +gereet gereten Overgeneralisation +ereten gereten Prefix ge without onset +reten gereten Lacking ge prefix +rijsde rees Overgeneralisation +rijsden rezen Overgeneralisation +reesde rees Irregular form plus regular suffix +reesden rezen Irregular form plus regular suffix +gerijsd Gerezen Overgeneralisation+ +erijsd Gerezen Overgeneralisation+Prefix ge without onset +rijsd Gerezen Overgeneralisation+Lacking ge prefix +serijsd Gerezen Overgeneralisation+prefix ge pronounced as se +gerijsde Gerezene Overgeneralisation+ +erijsde Gerezene Overgeneralisation+Prefix ge without onset +serijsde Gerezene Overgeneralisation+prefix ge pronounced as se +gerijst Gerezen Overgeneralisation +erijst Gerezen Overgeneralisation +rijst Gerezen Overgeneralisation +gerijsen Gerezen Wrong -en suffix +erijsen Gerezen Wrong -en suffix +rijsen Gerezen Wrong -en suffix +geGereesd Gerezen Overgeneralisation +geGereest Gerezen Overgeneralisation +roepte riep Overgeneralisation +roepten riepen Overgeneralisation +riepte riep Irregular form plus regular suffix +riepten riepen Irregular form plus regular suffix +geroept geroepen Overgeneralisation +eroept geroepen Overgeneralisation +roept geroepen Overgeneralisation +seroept geroepen Overgeneralisation+prefix ge pronounced as se +geroepte geroepene Overgeneralisation+ +eroepte geroepene Overgeneralisation+Prefix ge without onset +seroepte geroepene Overgeneralisation+prefix ge pronounced as se +eroepen geroepen Prefix ge without onset +roepen geroepen Lacking ge prefix +ruikte rook Overgeneralisation +ruikten roken Overgeneralisation +rookte rook Irregular form plus regular suffix +rookten roken Irregular form plus regular suffix +geruikt geroken Overgeneralisation +eruikt geroken Overgeneralisation +ruikt geroken Overgeneralisation +seruikt geroken Overgeneralisation+prefix ge pronounced as se +geruikte gerokene Overgeneralisation+ +eruikte gerokene Overgeneralisation+Prefix ge without onset +seruikte gerokene Overgeneralisation+prefix ge pronounced as se +geruiken geroken Wrong -en suffix +eruiken geroken Wrong -en suffix +ruiken geroken Wrong -en suffix +gerookt geroken Overgeneralisation +eroken geroken Prefix ge without onset +roken geroken Lacking ge prefix +gescheid gescheiden Overgeneralisation +escheid gescheiden Overgeneralisation +scheid gescheiden Overgeneralisation +sescheid gescheiden Overgeneralisation+prefix ge pronounced as se +gescheide gescheidene Overgeneralisation+ +escheide gescheidene Overgeneralisation+Prefix ge without onset +sescheide gescheidene Overgeneralisation+prefix ge pronounced as se +escheiden gescheiden Prefix ge without onset +scheiden gescheiden Lacking ge prefix +scheldde schold Overgeneralisation +scheldden scholden Overgeneralisation +scholdde schold Irregular form plus regular suffix +scholdden scholden Irregular form plus regular suffix +gescheld gescholden Overgeneralisation +escheld gescholden Overgeneralisation +scheld gescholden Overgeneralisation +sescheld gescholden Overgeneralisation+prefix ge pronounced as se +geschelde gescholdene Overgeneralisation+ +eschelde gescholdene Overgeneralisation+Prefix ge without onset +seschelde gescholdene Overgeneralisation+prefix ge pronounced as se +geschelden gescholden Wrong -en suffix +eschelden gescholden Wrong -en suffix +schelden gescholden Wrong -en suffix +geschold gescholden Overgeneralisation +escholden gescholden Prefix ge without onset +scholden gescholden Lacking ge prefix +schendde schond Overgeneralisation +schendden schonden Overgeneralisation +schondde schond Irregular form plus regular suffix +schondden schonden Irregular form plus regular suffix +geschend geschonden Overgeneralisation +eschend geschonden Overgeneralisation +schend geschonden Overgeneralisation +seschend geschonden Overgeneralisation+prefix ge pronounced as se +geschende geschondene Overgeneralisation+ +eschende geschondene Overgeneralisation+Prefix ge without onset +seschende geschondene Overgeneralisation+prefix ge pronounced as se +geschenden geschonden Wrong -en suffix +eschenden geschonden Wrong -en suffix +schenden geschonden Wrong -en suffix +geschond geschonden Overgeneralisation +eschonden geschonden Prefix ge without onset +schonden geschonden Lacking ge prefix +schenkte schonk Overgeneralisation +schenkten schonken Overgeneralisation +schonkte schonk Irregular form plus regular suffix +schonkten schonken Irregular form plus regular suffix +geschenkt geschonken Overgeneralisation +eschenkt geschonken Overgeneralisation +schenkt geschonken Overgeneralisation +seschenkt geschonken Overgeneralisation+prefix ge pronounced as se +geschenkte geschonkene Overgeneralisation+ +eschenkte geschonkene Overgeneralisation+Prefix ge without onset +seschenkte geschonkene Overgeneralisation+prefix ge pronounced as se +geschenken geschonken Wrong -en suffix +eschenken geschonken Wrong -en suffix +schenken geschonken Wrong -en suffix +geschonkt geschonken Overgeneralisation +eschonken geschonken Prefix ge without onset +schonken geschonken Lacking ge prefix +schepte shiep Overgeneralisation +schepten schiepen Overgeneralisation +shiepte shiep Irregular form plus regular suffix +shiepten schiepen Irregular form plus regular suffix +geschept geschapen Overgeneralisation +eschept geschapen Overgeneralisation +schept geschapen Overgeneralisation +seschept geschapen Overgeneralisation+prefix ge pronounced as se +geschepte geschapene Overgeneralisation+ +eschepte geschapene Overgeneralisation+Prefix ge without onset +seschepte geschapene Overgeneralisation+prefix ge pronounced as se +gescheppen geschapen Wrong -en suffix +escheppen geschapen Wrong -en suffix +scheppen geschapen Wrong -en suffix +geschaapt geschapen Overgeneralisation +eschapen geschapen Prefix ge without onset +schapen geschapen Lacking ge prefix +gescheerd geschoren Overgeneralisation+ +escheerd geschoren Overgeneralisation+Prefix ge without onset +scheerd geschoren Overgeneralisation+Lacking ge prefix +sescheerd geschoren Overgeneralisation+prefix ge pronounced as se +gescheerde geschorene Overgeneralisation+ +escheerde geschorene Overgeneralisation+Prefix ge without onset +sescheerde geschorene Overgeneralisation+prefix ge pronounced as se +gescheert geschoren Overgeneralisation +escheert geschoren Overgeneralisation +scheert geschoren Overgeneralisation +gescheren geschoren Wrong -en suffix +escheren geschoren Wrong -en suffix +scheren geschoren Wrong -en suffix +geschoort geschoren Overgeneralisation +eschoren geschoren Prefix ge without onset +schoren geschoren Lacking ge prefix +schiette schoot Overgeneralisation +schietten schoten Overgeneralisation +schootte schoot Irregular form plus regular suffix +schootten schoten Irregular form plus regular suffix +geschiet geschoten Overgeneralisation +eschiet geschoten Overgeneralisation +schiet geschoten Overgeneralisation +seschiet geschoten Overgeneralisation+prefix ge pronounced as se +geschiete geschotene Overgeneralisation+ +eschiete geschotene Overgeneralisation+Prefix ge without onset +seschiete geschotene Overgeneralisation+prefix ge pronounced as se +geschieten geschoten Wrong -en suffix +eschieten geschoten Wrong -en suffix +schieten geschoten Wrong -en suffix +geschoot geschoten Overgeneralisation +eschoten geschoten Prefix ge without onset +schoten geschoten Lacking ge prefix +schijnde scheen Overgeneralisation +schijnden schenen Overgeneralisation +scheende scheen Irregular form plus regular suffix +scheenden schenen Irregular form plus regular suffix +geschijnd geschenen Overgeneralisation+ +eschijnd geschenen Overgeneralisation+Prefix ge without onset +schijnd geschenen Overgeneralisation+Lacking ge prefix +seschijnd geschenen Overgeneralisation+prefix ge pronounced as se +geschijnde geschenene Overgeneralisation+ +eschijnde geschenene Overgeneralisation+Prefix ge without onset +seschijnde geschenene Overgeneralisation+prefix ge pronounced as se +geschijnt geschenen Overgeneralisation +eschijnt geschenen Overgeneralisation +schijnt geschenen Overgeneralisation +geschijnen geschenen Wrong -en suffix +eschijnen geschenen Wrong -en suffix +schijnen geschenen Wrong -en suffix +gescheend geschenen Overgeneralisation +gescheent geschenen Overgeneralisation +eschenen geschenen Prefix ge without onset +schenen geschenen Lacking ge prefix +schijtte scheet Overgeneralisation +schijtten scheten Overgeneralisation +scheette scheet Irregular form plus regular suffix +scheetten scheten Irregular form plus regular suffix +geschijt gescheten Overgeneralisation +eschijt gescheten Overgeneralisation +schijt gescheten Overgeneralisation +seschijt gescheten Overgeneralisation+prefix ge pronounced as se +geschijte geschetene Overgeneralisation+ +eschijte geschetene Overgeneralisation+Prefix ge without onset +seschijte geschetene Overgeneralisation+prefix ge pronounced as se +geschijten gescheten Wrong -en suffix +eschijten gescheten Wrong -en suffix +schijten gescheten Wrong -en suffix +gescheet gescheten Overgeneralisation +escheten gescheten Prefix ge without onset +scheten gescheten Lacking ge prefix +schrijfde schreef Overgeneralisation +schrijfden schreven Overgeneralisation +schreefde schreef Irregular form plus regular suffix +schreefden schreven Irregular form plus regular suffix +geschrijfd geschreven Overgeneralisation+ +eschrijfd geschreven Overgeneralisation+Prefix ge without onset +schrijfd geschreven Overgeneralisation+Lacking ge prefix +seschrijfd geschreven Overgeneralisation+prefix ge pronounced as se +geschrijfde geschrevene Overgeneralisation+ +eschrijfde geschrevene Overgeneralisation+Prefix ge without onset +seschrijfde geschrevene Overgeneralisation+prefix ge pronounced as se +geschrijft geschreven Overgeneralisation +eschrijft geschreven Overgeneralisation +schrijft geschreven Overgeneralisation +geschrijfen geschreven Wrong -en suffix +eschrijfen geschreven Wrong -en suffix +schrijfen geschreven Wrong -en suffix +geschreefd geschreven Overgeneralisation +geschreeft geschreven Overgeneralisation +eschreven geschreven Prefix ge without onset +schreven geschreven Lacking ge prefix +schrikte schrok Overgeneralisation +schrikten schrokken Overgeneralisation +schrokte schrok Irregular form plus regular suffix +schrokten schrokken Irregular form plus regular suffix +geschrikt geschrokken Overgeneralisation +eschrikt geschrokken Overgeneralisation +schrikt geschrokken Overgeneralisation +seschrikt geschrokken Overgeneralisation+prefix ge pronounced as se +geschrikte geschrokkene Overgeneralisation+ +eschrikte geschrokkene Overgeneralisation+Prefix ge without onset +seschrikte geschrokkene Overgeneralisation+prefix ge pronounced as se +geschrikken geschrokken Wrong -en suffix +eschrikken geschrokken Wrong -en suffix +schrikken geschrokken Wrong -en suffix +geschrokt geschrokken Overgeneralisation +eschrokken geschrokken Prefix ge without onset +schrokken geschrokken Lacking ge prefix +eschuild geschuild Prefix ge without onset +schuild geschuild Lacking ge prefix +seschuild geschuild Overgeneralisation+prefix ge pronounced as se +eschuilde geschuilde Overgeneralisation+Prefix ge without onset +seschuilde geschuilde Overgeneralisation+prefix ge pronounced as se +geschuilt geschuild Overgeneralisation +eschuilt geschuild Overgeneralisation +schuilt geschuild Overgeneralisation +geschuilen geschuild Wrong -en suffix +eschuilen geschuild Wrong -en suffix +schuilen geschuild Wrong -en suffix +schuifde schoof Overgeneralisation +schuifden schoven Overgeneralisation +schoofde schoof Irregular form plus regular suffix +schoofden schoven Irregular form plus regular suffix +geschuifd geschoven Overgeneralisation+ +eschuifd geschoven Overgeneralisation+Prefix ge without onset +schuifd geschoven Overgeneralisation+Lacking ge prefix +seschuifd geschoven Overgeneralisation+prefix ge pronounced as se +geschuifde geschovene Overgeneralisation+ +eschuifde geschovene Overgeneralisation+Prefix ge without onset +seschuifde geschovene Overgeneralisation+prefix ge pronounced as se +geschuift geschoven Overgeneralisation +eschuift geschoven Overgeneralisation +schuift geschoven Overgeneralisation +geschuifen geschoven Wrong -en suffix +eschuifen geschoven Wrong -en suffix +schuifen geschoven Wrong -en suffix +geschooft geschoven Overgeneralisation +eschoven geschoven Prefix ge without onset +schoven geschoven Lacking ge prefix +slade sloeg Overgeneralisation +sladen sloegen Overgeneralisation +sloegde sloeg Irregular form plus regular suffix +sloegden sloegen Irregular form plus regular suffix +geslaad geslagen Overgeneralisation+ +eslaad geslagen Overgeneralisation+Prefix ge without onset +slaad geslagen Overgeneralisation+Lacking ge prefix +seslaad geslagen Overgeneralisation+prefix ge pronounced as se +geslade geslagene Overgeneralisation+ +eslade geslagene Overgeneralisation+Prefix ge without onset +seslade geslagene Overgeneralisation+prefix ge pronounced as se +geslaat geslagen Overgeneralisation +eslaat geslagen Overgeneralisation +slaat geslagen Overgeneralisation +geslaan geslagen Wrong -en suffix +eslaan geslagen Wrong -en suffix +slaan geslagen Wrong -en suffix +geslaagd geslagen Overgeneralisation +geslaagt geslagen Overgeneralisation +eslagen geslagen Prefix ge without onset +slagen geslagen Lacking ge prefix +slaapte sliep Overgeneralisation +slaapten sliepen Overgeneralisation +sliepte sliep Irregular form plus regular suffix +sliepten sliepen Irregular form plus regular suffix +geslaapt geslapen Overgeneralisation +eslaapt geslapen Overgeneralisation +slaapt geslapen Overgeneralisation +seslaapt geslapen Overgeneralisation+prefix ge pronounced as se +geslaapte geslapene Overgeneralisation+ +eslaapte geslapene Overgeneralisation+Prefix ge without onset +seslaapte geslapene Overgeneralisation+prefix ge pronounced as se +eslapen geslapen Prefix ge without onset +slapen geslapen Lacking ge prefix +slijpte sleep Overgeneralisation +slijpten slepen Overgeneralisation +sleepte sleep Irregular form plus regular suffix +sleepten slepen Irregular form plus regular suffix +geslijpt geslepen Overgeneralisation +eslijpt geslepen Overgeneralisation +slijpt geslepen Overgeneralisation +seslijpt geslepen Overgeneralisation+prefix ge pronounced as se +geslijpte geslepene Overgeneralisation+ +eslijpte geslepene Overgeneralisation+Prefix ge without onset +seslijpte geslepene Overgeneralisation+prefix ge pronounced as se +geslijpen geslepen Wrong -en suffix +eslijpen geslepen Wrong -en suffix +slijpen geslepen Wrong -en suffix +gesleept geslepen Overgeneralisation +eslepen geslepen Prefix ge without onset +slepen geslepen Lacking ge prefix +slijtte sleet Overgeneralisation +slijtten sleten Overgeneralisation +sleette sleet Irregular form plus regular suffix +sleetten sleten Irregular form plus regular suffix +geslijt gesleten Overgeneralisation +eslijt gesleten Overgeneralisation +slijt gesleten Overgeneralisation +seslijt gesleten Overgeneralisation+prefix ge pronounced as se +geslijte gesletene Overgeneralisation+ +eslijte gesletene Overgeneralisation+Prefix ge without onset +seslijte gesletene Overgeneralisation+prefix ge pronounced as se +geslijten gesleten Wrong -en suffix +eslijten gesleten Wrong -en suffix +slijten gesleten Wrong -en suffix +gesleet gesleten Overgeneralisation +esleten gesleten Prefix ge without onset +sleten gesleten Lacking ge prefix +slinkte slonk Overgeneralisation +slinkten slonken Overgeneralisation +slonkte slonk Irregular form plus regular suffix +slonkten slonken Irregular form plus regular suffix +geslinkt Geslonken Overgeneralisation +eslinkt Geslonken Overgeneralisation +slinkt Geslonken Overgeneralisation +seslinkt Geslonken Overgeneralisation+prefix ge pronounced as se +geslinkte Geslonkene Overgeneralisation+ +eslinkte Geslonkene Overgeneralisation+Prefix ge without onset +seslinkte Geslonkene Overgeneralisation+prefix ge pronounced as se +geslinken Geslonken Wrong -en suffix +eslinken Geslonken Wrong -en suffix +slinken Geslonken Wrong -en suffix +geGeslonkt Geslonken Overgeneralisation +sluipte sloop Overgeneralisation +sluipten slopen Overgeneralisation +sloopte sloop Irregular form plus regular suffix +sloopten slopen Irregular form plus regular suffix +gesluipt geslopen Overgeneralisation +esluipt geslopen Overgeneralisation +sluipt geslopen Overgeneralisation +sesluipt geslopen Overgeneralisation+prefix ge pronounced as se +gesluipte geslopene Overgeneralisation+ +esluipte geslopene Overgeneralisation+Prefix ge without onset +sesluipte geslopene Overgeneralisation+prefix ge pronounced as se +gesluipen geslopen Wrong -en suffix +esluipen geslopen Wrong -en suffix +sluipen geslopen Wrong -en suffix +gesloopt geslopen Overgeneralisation +eslopen geslopen Prefix ge without onset +slopen geslopen Lacking ge prefix +sluitte sloot Overgeneralisation +sluitten sloten Overgeneralisation +slootte sloot Irregular form plus regular suffix +slootten sloten Irregular form plus regular suffix +gesluit gesloten Overgeneralisation +esluit gesloten Overgeneralisation +sluit gesloten Overgeneralisation +sesluit gesloten Overgeneralisation+prefix ge pronounced as se +gesluite geslotene Overgeneralisation+ +esluite geslotene Overgeneralisation+Prefix ge without onset +sesluite geslotene Overgeneralisation+prefix ge pronounced as se +gesluiten gesloten Wrong -en suffix +esluiten gesloten Wrong -en suffix +sluiten gesloten Wrong -en suffix +gesloot gesloten Overgeneralisation +esloten gesloten Prefix ge without onset +sloten gesloten Lacking ge prefix +smeltte smolt Overgeneralisation +smeltten smolten Overgeneralisation +smoltte smolt Irregular form plus regular suffix +smoltten smolten Irregular form plus regular suffix +gesmelt gesmolten Overgeneralisation +esmelt gesmolten Overgeneralisation +smelt gesmolten Overgeneralisation +sesmelt gesmolten Overgeneralisation+prefix ge pronounced as se +gesmelte gesmoltene Overgeneralisation+ +esmelte gesmoltene Overgeneralisation+Prefix ge without onset +sesmelte gesmoltene Overgeneralisation+prefix ge pronounced as se +gesmelten gesmolten Wrong -en suffix +esmelten gesmolten Wrong -en suffix +smelten gesmolten Wrong -en suffix +gesmolt gesmolten Overgeneralisation +esmolten gesmolten Prefix ge without onset +smolten gesmolten Lacking ge prefix +smijtte smeet Overgeneralisation +smijtten smeten Overgeneralisation +smeette smeet Irregular form plus regular suffix +smeetten smeten Irregular form plus regular suffix +gesmijt gesmeten Overgeneralisation +esmijt gesmeten Overgeneralisation +smijt gesmeten Overgeneralisation +sesmijt gesmeten Overgeneralisation+prefix ge pronounced as se +gesmijte gesmetene Overgeneralisation+ +esmijte gesmetene Overgeneralisation+Prefix ge without onset +sesmijte gesmetene Overgeneralisation+prefix ge pronounced as se +gesmijten gesmeten Wrong -en suffix +esmijten gesmeten Wrong -en suffix +smijten gesmeten Wrong -en suffix +gesmeet gesmeten Overgeneralisation +esmeten gesmeten Prefix ge without onset +smeten gesmeten Lacking ge prefix +snijdde sneed Overgeneralisation +snijdden sneden Overgeneralisation +sneedde sneed Irregular form plus regular suffix +sneedden sneden Irregular form plus regular suffix +gesnijd gesneden Overgeneralisation +esnijd gesneden Overgeneralisation +snijd gesneden Overgeneralisation +sesnijd gesneden Overgeneralisation+prefix ge pronounced as se +gesnijde gesnedene Overgeneralisation+ +esnijde gesnedene Overgeneralisation+Prefix ge without onset +sesnijde gesnedene Overgeneralisation+prefix ge pronounced as se +gesnijden gesneden Wrong -en suffix +esnijden gesneden Wrong -en suffix +snijden gesneden Wrong -en suffix +gesneed gesneden Overgeneralisation +esneden gesneden Prefix ge without onset +sneden gesneden Lacking ge prefix +snuitte snoot Overgeneralisation +snuitten snoten Overgeneralisation +snootte snoot Irregular form plus regular suffix +snootten snoten Irregular form plus regular suffix +gesnuit gesnoten Overgeneralisation +esnuit gesnoten Overgeneralisation +snuit gesnoten Overgeneralisation +sesnuit gesnoten Overgeneralisation+prefix ge pronounced as se +gesnuite gesnotene Overgeneralisation+ +esnuite gesnotene Overgeneralisation+Prefix ge without onset +sesnuite gesnotene Overgeneralisation+prefix ge pronounced as se +gesnuiten gesnoten Wrong -en suffix +esnuiten gesnoten Wrong -en suffix +snuiten gesnoten Wrong -en suffix +gesnoot gesnoten Overgeneralisation +esnoten gesnoten Prefix ge without onset +snoten gesnoten Lacking ge prefix +snuifde snoof Overgeneralisation +snuifden snoven Overgeneralisation +snoofde snoof Irregular form plus regular suffix +snoofden snoven Irregular form plus regular suffix +gesnuifd gesnoven Overgeneralisation+ +esnuifd gesnoven Overgeneralisation+Prefix ge without onset +snuifd gesnoven Overgeneralisation+Lacking ge prefix +sesnuifd gesnoven Overgeneralisation+prefix ge pronounced as se +gesnuifde gesnovene Overgeneralisation+ +esnuifde gesnovene Overgeneralisation+Prefix ge without onset +sesnuifde gesnovene Overgeneralisation+prefix ge pronounced as se +gesnuift gesnoven Overgeneralisation +esnuift gesnoven Overgeneralisation +snuift gesnoven Overgeneralisation +gesnuifen gesnoven Wrong -en suffix +esnuifen gesnoven Wrong -en suffix +snuifen gesnoven Wrong -en suffix +gesnooft gesnoven Overgeneralisation +esnoven gesnoven Prefix ge without onset +snoven gesnoven Lacking ge prefix +gespand gespannen Overgeneralisation +espand gespannen Overgeneralisation+Prefix ge without onset +spand gespannen Overgeneralisation+Lacking ge prefix +sespand gespannen Overgeneralisation+prefix ge pronounced as se +gespande gespannene Overgeneralisation+ +espande gespannene Overgeneralisation+Prefix ge without onset +sespande gespannene Overgeneralisation+prefix ge pronounced as se +gespant gespannen Overgeneralisation +espant gespannen Overgeneralisation +spant gespannen Overgeneralisation +espannen gespannen Prefix ge without onset +spannen gespannen Lacking ge prefix +spijtte speet Overgeneralisation +spijtten speten Overgeneralisation +speette speet Irregular form plus regular suffix +speetten speten Irregular form plus regular suffix +gespijt gespeten Overgeneralisation +espijt gespeten Overgeneralisation +spijt gespeten Overgeneralisation +sespijt gespeten Overgeneralisation+prefix ge pronounced as se +gespijte gespetene Overgeneralisation+ +espijte gespetene Overgeneralisation+Prefix ge without onset +sespijte gespetene Overgeneralisation+prefix ge pronounced as se +gespijten gespeten Wrong -en suffix +espijten gespeten Wrong -en suffix +spijten gespeten Wrong -en suffix +gespeet gespeten Overgeneralisation +espeten gespeten Prefix ge without onset +speten gespeten Lacking ge prefix +spinde spon Overgeneralisation +spinden sponnen Overgeneralisation +sponde spon Irregular form plus regular suffix +sponden sponnen Irregular form plus regular suffix +gespind gesponnen Overgeneralisation+ +espind gesponnen Overgeneralisation+Prefix ge without onset +spind gesponnen Overgeneralisation+Lacking ge prefix +sespind gesponnen Overgeneralisation+prefix ge pronounced as se +gespinde gesponnene Overgeneralisation+ +espinde gesponnene Overgeneralisation+Prefix ge without onset +sespinde gesponnene Overgeneralisation+prefix ge pronounced as se +gespint gesponnen Overgeneralisation +espint gesponnen Overgeneralisation +spint gesponnen Overgeneralisation +gespinnen gesponnen Wrong -en suffix +espinnen gesponnen Wrong -en suffix +spinnen gesponnen Wrong -en suffix +gespont gesponnen Overgeneralisation +esponnen gesponnen Prefix ge without onset +sponnen gesponnen Lacking ge prefix +splijtte spleet Overgeneralisation +splijtten spleten Overgeneralisation +spleette spleet Irregular form plus regular suffix +spleetten spleten Irregular form plus regular suffix +gesplijt gespleten Overgeneralisation +esplijt gespleten Overgeneralisation +splijt gespleten Overgeneralisation +sesplijt gespleten Overgeneralisation+prefix ge pronounced as se +gesplijte gespletene Overgeneralisation+ +esplijte gespletene Overgeneralisation+Prefix ge without onset +sesplijte gespletene Overgeneralisation+prefix ge pronounced as se +gesplijten gespleten Wrong -en suffix +esplijten gespleten Wrong -en suffix +splijten gespleten Wrong -en suffix +gespleet gespleten Overgeneralisation +espleten gespleten Prefix ge without onset +spleten gespleten Lacking ge prefix +spreekte sprak Overgeneralisation +spreekten spraken Overgeneralisation +sprakte sprak Irregular form plus regular suffix +sprakten spraken Irregular form plus regular suffix +gespreekt gesproken Overgeneralisation +espreekt gesproken Overgeneralisation +spreekt gesproken Overgeneralisation +sespreekt gesproken Overgeneralisation+prefix ge pronounced as se +gespreekte gesprokene Overgeneralisation+ +espreekte gesprokene Overgeneralisation+Prefix ge without onset +sespreekte gesprokene Overgeneralisation+prefix ge pronounced as se +gespreken gesproken Wrong -en suffix +espreken gesproken Wrong -en suffix +spreken gesproken Wrong -en suffix +gesprookt gesproken Overgeneralisation +esproken gesproken Prefix ge without onset +sproken gesproken Lacking ge prefix +springde sprong Overgeneralisation +springden sprongen Overgeneralisation +sprongde sprong Irregular form plus regular suffix +sprongden sprongen Irregular form plus regular suffix +gespringd gesprongen Overgeneralisation+ +espringd gesprongen Overgeneralisation+Prefix ge without onset +springd gesprongen Overgeneralisation+Lacking ge prefix +sespringd gesprongen Overgeneralisation+prefix ge pronounced as se +gespringde gesprongene Overgeneralisation+ +espringde gesprongene Overgeneralisation+Prefix ge without onset +sespringde gesprongene Overgeneralisation+prefix ge pronounced as se +gespringt gesprongen Overgeneralisation +espringt gesprongen Overgeneralisation +springt gesprongen Overgeneralisation +gespringen gesprongen Wrong -en suffix +espringen gesprongen Wrong -en suffix +springen gesprongen Wrong -en suffix +gesprongd gesprongen Overgeneralisation +gesprongt gesprongen Overgeneralisation +esprongen gesprongen Prefix ge without onset +sprongen gesprongen Lacking ge prefix +spruitte sproot Overgeneralisation +spruitten sproten Overgeneralisation +sprootte sproot Irregular form plus regular suffix +sprootten sproten Irregular form plus regular suffix +gespruit gesproten Overgeneralisation +espruit gesproten Overgeneralisation +spruit gesproten Overgeneralisation +sespruit gesproten Overgeneralisation+prefix ge pronounced as se +gespruite gesprotene Overgeneralisation+ +espruite gesprotene Overgeneralisation+Prefix ge without onset +sespruite gesprotene Overgeneralisation+prefix ge pronounced as se +gespruiten gesproten Wrong -en suffix +espruiten gesproten Wrong -en suffix +spruiten gesproten Wrong -en suffix +gesproot gesproten Overgeneralisation +esproten gesproten Prefix ge without onset +sproten gesproten Lacking ge prefix +spuitte spoot Overgeneralisation +spuitten spoten Overgeneralisation +spootte spoot Irregular form plus regular suffix +spootten spoten Irregular form plus regular suffix +gespuit gespoten Overgeneralisation +espuit gespoten Overgeneralisation +spuit gespoten Overgeneralisation +sespuit gespoten Overgeneralisation+prefix ge pronounced as se +gespuite gespotene Overgeneralisation+ +espuite gespotene Overgeneralisation+Prefix ge without onset +sespuite gespotene Overgeneralisation+prefix ge pronounced as se +gespuiten gespoten Wrong -en suffix +espuiten gespoten Wrong -en suffix +spuiten gespoten Wrong -en suffix +gespoot gespoten Overgeneralisation +espoten gespoten Prefix ge without onset +spoten gespoten Lacking ge prefix +state stond Overgeneralisation +staten stonden Overgeneralisation +stondte stond Irregular form plus regular suffix +stondten stonden Irregular form plus regular suffix +gestat gestaan Overgeneralisation+ +estat gestaan Overgeneralisation+Prefix ge without onset +stat gestaan Overgeneralisation+Lacking ge prefix +sestat gestaan Overgeneralisation+prefix ge pronounced as se +gestatte gestaane Overgeneralisation+ +estatte gestaane Overgeneralisation+Prefix ge without onset +sestatte gestaane Overgeneralisation+prefix ge pronounced as se +gestaat gestaan Overgeneralisation +estaat gestaan Overgeneralisation +staat gestaan Overgeneralisation +estaan gestaan Prefix ge without onset +staan gestaan Lacking ge prefix +steekte stak Overgeneralisation +steekten staken Overgeneralisation +stakte stak Irregular form plus regular suffix +stakten staken Irregular form plus regular suffix +gesteekt gestoken Overgeneralisation +esteekt gestoken Overgeneralisation +steekt gestoken Overgeneralisation +sesteekt gestoken Overgeneralisation+prefix ge pronounced as se +gesteekte gestokene Overgeneralisation+ +esteekte gestokene Overgeneralisation+Prefix ge without onset +sesteekte gestokene Overgeneralisation+prefix ge pronounced as se +gesteken gestoken Wrong -en suffix +esteken gestoken Wrong -en suffix +steken gestoken Wrong -en suffix +gestookt gestoken Overgeneralisation +estoken gestoken Prefix ge without onset +stoken gestoken Lacking ge prefix +steelde stal Overgeneralisation +steelden stalen Overgeneralisation +stalde stal Irregular form plus regular suffix +stalden stalen Irregular form plus regular suffix +gesteeld gestolen Overgeneralisation+ +esteeld gestolen Overgeneralisation+Prefix ge without onset +steeld gestolen Overgeneralisation+Lacking ge prefix +sesteeld gestolen Overgeneralisation+prefix ge pronounced as se +gesteelde gestolene Overgeneralisation+ +esteelde gestolene Overgeneralisation+Prefix ge without onset +sesteelde gestolene Overgeneralisation+prefix ge pronounced as se +gesteelt gestolen Overgeneralisation +esteelt gestolen Overgeneralisation +steelt gestolen Overgeneralisation +gestelen gestolen Wrong -en suffix +estelen gestolen Wrong -en suffix +stelen gestolen Wrong -en suffix +gestoolt gestolen Overgeneralisation +estolen gestolen Prefix ge without onset +stolen gestolen Lacking ge prefix +sterfde stierf Overgeneralisation +sterfden stierven Overgeneralisation +stierfde stierf Irregular form plus regular suffix +stierfden stierven Irregular form plus regular suffix +gesterfd gestorven Overgeneralisation+ +esterfd gestorven Overgeneralisation+Prefix ge without onset +sterfd gestorven Overgeneralisation+Lacking ge prefix +sesterfd gestorven Overgeneralisation+prefix ge pronounced as se +gesterfde gestorvene Overgeneralisation+ +esterfde gestorvene Overgeneralisation+Prefix ge without onset +sesterfde gestorvene Overgeneralisation+prefix ge pronounced as se +gesterft gestorven Overgeneralisation +esterft gestorven Overgeneralisation +sterft gestorven Overgeneralisation +gesterfen gestorven Wrong -en suffix +esterfen gestorven Wrong -en suffix +sterfen gestorven Wrong -en suffix +gestorfd gestorven Overgeneralisation +gestorft gestorven Overgeneralisation +estorven gestorven Prefix ge without onset +storven gestorven Lacking ge prefix +stijgde steeg Overgeneralisation +stijgden stegen Overgeneralisation +steegde steeg Irregular form plus regular suffix +steegden stegen Irregular form plus regular suffix +gestijgd gestegen Overgeneralisation+ +estijgd gestegen Overgeneralisation+Prefix ge without onset +stijgd gestegen Overgeneralisation+Lacking ge prefix +sestijgd gestegen Overgeneralisation+prefix ge pronounced as se +gestijgde gestegene Overgeneralisation+ +estijgde gestegene Overgeneralisation+Prefix ge without onset +sestijgde gestegene Overgeneralisation+prefix ge pronounced as se +gestijgt gestegen Overgeneralisation +estijgt gestegen Overgeneralisation +stijgt gestegen Overgeneralisation +gestijgen gestegen Wrong -en suffix +estijgen gestegen Wrong -en suffix +stijgen gestegen Wrong -en suffix +gesteegd gestegen Overgeneralisation +gesteegt gestegen Overgeneralisation +estegen gestegen Prefix ge without onset +stegen gestegen Lacking ge prefix +stijfde steef Overgeneralisation +stijfden steven Overgeneralisation +steefde steef Irregular form plus regular suffix +steefden steven Irregular form plus regular suffix +gestijfd gesteven Overgeneralisation+ +estijfd gesteven Overgeneralisation+Prefix ge without onset +stijfd gesteven Overgeneralisation+Lacking ge prefix +sestijfd gesteven Overgeneralisation+prefix ge pronounced as se +gestijfde gestevene Overgeneralisation+ +estijfde gestevene Overgeneralisation+Prefix ge without onset +sestijfde gestevene Overgeneralisation+prefix ge pronounced as se +gestijft gesteven Overgeneralisation +estijft gesteven Overgeneralisation +stijft gesteven Overgeneralisation +gestijfen gesteven Wrong -en suffix +estijfen gesteven Wrong -en suffix +stijfen gesteven Wrong -en suffix +gesteefd gesteven Overgeneralisation +gesteeft gesteven Overgeneralisation +esteven gesteven Prefix ge without onset +steven gesteven Lacking ge prefix +stinkte stonk Overgeneralisation +stinkten stonken Overgeneralisation +stonkte stonk Irregular form plus regular suffix +stonkten stonken Irregular form plus regular suffix +gestinkt gestonken Overgeneralisation +estinkt gestonken Overgeneralisation +stinkt gestonken Overgeneralisation +sestinkt gestonken Overgeneralisation+prefix ge pronounced as se +gestinkte gestonkene Overgeneralisation+ +estinkte gestonkene Overgeneralisation+Prefix ge without onset +sestinkte gestonkene Overgeneralisation+prefix ge pronounced as se +gestinken gestonken Wrong -en suffix +estinken gestonken Wrong -en suffix +stinken gestonken Wrong -en suffix +gestonkt gestonken Overgeneralisation +estonken gestonken Prefix ge without onset +stonken gestonken Lacking ge prefix +gestoot gestoten Overgeneralisation +estoot gestoten Overgeneralisation +stoot gestoten Overgeneralisation +sestoot gestoten Overgeneralisation+prefix ge pronounced as se +gestote gestotene Overgeneralisation+ +estote gestotene Overgeneralisation+Prefix ge without onset +sestote gestotene Overgeneralisation+prefix ge pronounced as se +estoten gestoten Prefix ge without onset +stoten gestoten Lacking ge prefix +strijdde streed Overgeneralisation +strijdden streden Overgeneralisation +streedde streed Irregular form plus regular suffix +streedden streden Irregular form plus regular suffix +gestrijd gestreden Overgeneralisation +estrijd gestreden Overgeneralisation +strijd gestreden Overgeneralisation +sestrijd gestreden Overgeneralisation+prefix ge pronounced as se +gestrijde gestredene Overgeneralisation+ +estrijde gestredene Overgeneralisation+Prefix ge without onset +sestrijde gestredene Overgeneralisation+prefix ge pronounced as se +gestrijden gestreden Wrong -en suffix +estrijden gestreden Wrong -en suffix +strijden gestreden Wrong -en suffix +gestreed gestreden Overgeneralisation +estreden gestreden Prefix ge without onset +streden gestreden Lacking ge prefix +strijkte streek Overgeneralisation +strijkten streken Overgeneralisation +streekte streek Irregular form plus regular suffix +streekten streken Irregular form plus regular suffix +gestrijkt gestreken Overgeneralisation +estrijkt gestreken Overgeneralisation +strijkt gestreken Overgeneralisation +sestrijkt gestreken Overgeneralisation+prefix ge pronounced as se +gestrijkte gestrekene Overgeneralisation+ +estrijkte gestrekene Overgeneralisation+Prefix ge without onset +sestrijkte gestrekene Overgeneralisation+prefix ge pronounced as se +gestrijken gestreken Wrong -en suffix +estrijken gestreken Wrong -en suffix +strijken gestreken Wrong -en suffix +gestreekt gestreken Overgeneralisation +estreken gestreken Prefix ge without onset +streken gestreken Lacking ge prefix +stuifde stoof Overgeneralisation +stuifden stoven Overgeneralisation +stoofde stoof Irregular form plus regular suffix +stoofden stoven Irregular form plus regular suffix +gestuifd gestoventoven Overgeneralisation+ +estuifd gestoventoven Overgeneralisation+Prefix ge without onset +stuifd gestoventoven Overgeneralisation+Lacking ge prefix +sestuifd gestoventoven Overgeneralisation+prefix ge pronounced as se +gestuifde gestoventovene Overgeneralisation+ +estuifde gestoventovene Overgeneralisation+Prefix ge without onset +sestuifde gestoventovene Overgeneralisation+prefix ge pronounced as se +gestuift gestoventoven Overgeneralisation +estuift gestoventoven Overgeneralisation +stuift gestoventoven Overgeneralisation +gestuifen gestoventoven Wrong -en suffix +estuifen gestoventoven Wrong -en suffix +stuifen gestoventoven Wrong -en suffix +gestoventooft gestoventoven Overgeneralisation +estoventoven gestoventoven Prefix ge without onset +stoventoven gestoventoven Lacking ge prefix +treedde trad Overgeneralisation +treedden traden Overgeneralisation +tradde trad Irregular form plus regular suffix +tradden traden Irregular form plus regular suffix +getreed getreden Overgeneralisation +etreed getreden Overgeneralisation +treed getreden Overgeneralisation +setreed getreden Overgeneralisation+prefix ge pronounced as se +getrede getredene Overgeneralisation+ +etrede getredene Overgeneralisation+Prefix ge without onset +setrede getredene Overgeneralisation+prefix ge pronounced as se +etreden getreden Prefix ge without onset +treden getreden Lacking ge prefix +trefte trof Overgeneralisation +treften troffen Overgeneralisation +trofte trof Irregular form plus regular suffix +troften troffen Irregular form plus regular suffix +getreft getroffen Overgeneralisation +etreft getroffen Overgeneralisation +treft getroffen Overgeneralisation +setreft getroffen Overgeneralisation+prefix ge pronounced as se +getrefte getroffene Overgeneralisation+ +etrefte getroffene Overgeneralisation+Prefix ge without onset +setrefte getroffene Overgeneralisation+prefix ge pronounced as se +getreffen getroffen Wrong -en suffix +etreffen getroffen Wrong -en suffix +treffen getroffen Wrong -en suffix +getroft getroffen Overgeneralisation +etroffen getroffen Prefix ge without onset +troffen getroffen Lacking ge prefix +trekte trok Overgeneralisation +trekten trokken Overgeneralisation +trokte trok Irregular form plus regular suffix +trokten trokken Irregular form plus regular suffix +getrekt getrokken Overgeneralisation +etrekt getrokken Overgeneralisation +trekt getrokken Overgeneralisation +setrekt getrokken Overgeneralisation+prefix ge pronounced as se +getrekte getrokkene Overgeneralisation+ +etrekte getrokkene Overgeneralisation+Prefix ge without onset +setrekte getrokkene Overgeneralisation+prefix ge pronounced as se +getrekken getrokken Wrong -en suffix +etrekken getrokken Wrong -en suffix +trekken getrokken Wrong -en suffix +getrokt getrokken Overgeneralisation +etrokken getrokken Prefix ge without onset +trokken getrokken Lacking ge prefix +valde viel Overgeneralisation +valden vielen Overgeneralisation +vielde viel Irregular form plus regular suffix +vielden vielen Irregular form plus regular suffix +gevald gevallen Overgeneralisation +evald gevallen Overgeneralisation+Prefix ge without onset +vald gevallen Overgeneralisation+Lacking ge prefix +sevald gevallen Overgeneralisation+prefix ge pronounced as se +gevalde gevallene Overgeneralisation+ +evalde gevallene Overgeneralisation+Prefix ge without onset +sevalde gevallene Overgeneralisation+prefix ge pronounced as se +gevalt gevallen Overgeneralisation +evalt gevallen Overgeneralisation +valt gevallen Overgeneralisation +evallen gevallen Prefix ge without onset +vallen gevallen Lacking ge prefix +vangde ving Overgeneralisation +vangden vingen Overgeneralisation +vingde ving Irregular form plus regular suffix +vingden vingen Irregular form plus regular suffix +gevangd gevangen Overgeneralisation +evangd gevangen Overgeneralisation+Prefix ge without onset +vangd gevangen Overgeneralisation+Lacking ge prefix +sevangd gevangen Overgeneralisation+prefix ge pronounced as se +gevangde gevangene Overgeneralisation+ +evangde gevangene Overgeneralisation+Prefix ge without onset +sevangde gevangene Overgeneralisation+prefix ge pronounced as se +gevangt gevangen Overgeneralisation +evangt gevangen Overgeneralisation +vangt gevangen Overgeneralisation +evangen gevangen Prefix ge without onset +vangen gevangen Lacking ge prefix +vaarde voer Overgeneralisation +vaarden voeren Overgeneralisation +voerde voer Irregular form plus regular suffix +voerden voeren Irregular form plus regular suffix +gevaard gevaren Overgeneralisation +evaard gevaren Overgeneralisation+Prefix ge without onset +vaard gevaren Overgeneralisation+Lacking ge prefix +sevaard gevaren Overgeneralisation+prefix ge pronounced as se +gevaarde gevarene Overgeneralisation+ +evaarde gevarene Overgeneralisation+Prefix ge without onset +sevaarde gevarene Overgeneralisation+prefix ge pronounced as se +gevaart gevaren Overgeneralisation +evaart gevaren Overgeneralisation +vaart gevaren Overgeneralisation +evaren gevaren Prefix ge without onset +varen gevaren Lacking ge prefix +vechtte vocht Overgeneralisation +vechtten vochten Overgeneralisation +vochtte vocht Irregular form plus regular suffix +vochtten vochten Irregular form plus regular suffix +gevecht gevochten Overgeneralisation +evecht gevochten Overgeneralisation +vecht gevochten Overgeneralisation +sevecht gevochten Overgeneralisation+prefix ge pronounced as se +gevechte gevochtene Overgeneralisation+ +evechte gevochtene Overgeneralisation+Prefix ge without onset +sevechte gevochtene Overgeneralisation+prefix ge pronounced as se +gevechten gevochten Wrong -en suffix +evechten gevochten Wrong -en suffix +vechten gevochten Wrong -en suffix +gevocht gevochten Overgeneralisation +evochten gevochten Prefix ge without onset +vochten gevochten Lacking ge prefix +verdriette verdroot Overgeneralisation +verdrietten verdroten Overgeneralisation +verdrootte verdroot Irregular form plus regular suffix +verdrootten verdroten Irregular form plus regular suffix +verdriet verdroten Overgeneralisation +verdriete verdrotene Overgeneralisation +verdrieten verdroten Wrong -en suffix +verdroot verdroten Overgeneralisation +verdwijnde verdwenene Overgeneralisation +verdwijnden verdwenen Overgeneralisation +verdweende verdween Irregular form plus regular suffix +verdweenden verdwenen Irregular form plus regular suffix +verdwijnd verdwenen Overgeneralisation +verdwijnt verdwenen Overgeneralisation +verdwijnen verdwenen Wrong -en suffix +verdweend verdwenen Overgeneralisation +verdweent verdwenen Overgeneralisation +vergeette vergat Overgeneralisation +vergeetten vergaten Overgeneralisation +vergatte vergat Irregular form plus regular suffix +vergatten vergaten Irregular form plus regular suffix +vergeet vergeten Overgeneralisation +vergete vergetene Overgeneralisation +verliesde verlorene Overgeneralisation +verliesden verloren Overgeneralisation +verloorde verloor Irregular form plus regular suffix +verloorden verloren Irregular form plus regular suffix +verliesd verloren Overgeneralisation +verliest verloren Overgeneralisation +verliesen verloren Wrong -en suffix +verloort verloren Overgeneralisation +vindde vond Overgeneralisation +vindden vonden Overgeneralisation +vondde vond Irregular form plus regular suffix +vondden vonden Irregular form plus regular suffix +gevind gevonden Overgeneralisation +evind gevonden Overgeneralisation +vind gevonden Overgeneralisation +sevind gevonden Overgeneralisation+prefix ge pronounced as se +gevinde gevondene Overgeneralisation+ +evinde gevondene Overgeneralisation+Prefix ge without onset +sevinde gevondene Overgeneralisation+prefix ge pronounced as se +gevinden gevonden Wrong -en suffix +evinden gevonden Wrong -en suffix +vinden gevonden Wrong -en suffix +gevond gevonden Overgeneralisation +evonden gevonden Prefix ge without onset +vonden gevonden Lacking ge prefix +vlechtte vlocht Overgeneralisation +vlechtten vlochten Overgeneralisation +vlochtte vlocht Irregular form plus regular suffix +vlochtten vlochten Irregular form plus regular suffix +gevlecht gevlochten Overgeneralisation +evlecht gevlochten Overgeneralisation +vlecht gevlochten Overgeneralisation +sevlecht gevlochten Overgeneralisation+prefix ge pronounced as se +gevlechte gevlochtene Overgeneralisation+ +evlechte gevlochtene Overgeneralisation+Prefix ge without onset +sevlechte gevlochtene Overgeneralisation+prefix ge pronounced as se +gevlechten gevlochten Wrong -en suffix +evlechten gevlochten Wrong -en suffix +vlechten gevlochten Wrong -en suffix +gevlocht gevlochten Overgeneralisation +evlochten gevlochten Prefix ge without onset +vlochten gevlochten Lacking ge prefix +vliegde vloog Overgeneralisation +vliegden vlogen Overgeneralisation +vloogde vloog Irregular form plus regular suffix +vloogden vlogen Irregular form plus regular suffix +gevliegd gevlogen Overgeneralisation+ +evliegd gevlogen Overgeneralisation+Prefix ge without onset +vliegd gevlogen Overgeneralisation+Lacking ge prefix +sevliegd gevlogen Overgeneralisation+prefix ge pronounced as se +gevliegde gevlogene Overgeneralisation+ +evliegde gevlogene Overgeneralisation+Prefix ge without onset +sevliegde gevlogene Overgeneralisation+prefix ge pronounced as se +gevliegt gevlogen Overgeneralisation +evliegt gevlogen Overgeneralisation +vliegt gevlogen Overgeneralisation +gevliegen gevlogen Wrong -en suffix +evliegen gevlogen Wrong -en suffix +vliegen gevlogen Wrong -en suffix +gevloogt gevlogen Overgeneralisation +evlogen gevlogen Prefix ge without onset +vlogen gevlogen Lacking ge prefix +gevouwd gevouwen Overgeneralisation +evouwd gevouwen Overgeneralisation+Prefix ge without onset +vouwd gevouwen Overgeneralisation+Lacking ge prefix +sevouwd gevouwen Overgeneralisation+prefix ge pronounced as se +gevouwde gevouwene Overgeneralisation+ +evouwde gevouwene Overgeneralisation+Prefix ge without onset +sevouwde gevouwene Overgeneralisation+prefix ge pronounced as se +gevouwt gevouwen Overgeneralisation +evouwt gevouwen Overgeneralisation +vouwt gevouwen Overgeneralisation +evouwen gevouwen Prefix ge without onset +vouwen gevouwen Lacking ge prefix +vraagde vroeg Overgeneralisation +vraagden vroegen Overgeneralisation +vroegde vroeg Irregular form plus regular suffix +vroegden vroegen Irregular form plus regular suffix +evraagd gevraagd Prefix ge without onset +vraagd gevraagd Lacking ge prefix +sevraagd gevraagd Overgeneralisation+prefix ge pronounced as se +evraagde gevraagde Overgeneralisation+Prefix ge without onset +sevraagde gevraagde Overgeneralisation+prefix ge pronounced as se +gevraagt gevraagd Overgeneralisation +evraagt gevraagd Overgeneralisation +vraagt gevraagd Overgeneralisation +gevragen gevraagd Wrong -en suffix +evragen gevraagd Wrong -en suffix +vragen gevraagd Wrong -en suffix +vreette vrat Overgeneralisation +vreetten vraten Overgeneralisation +vratte vrat Irregular form plus regular suffix +vratten vraten Irregular form plus regular suffix +gevreet gevreten Overgeneralisation +evreet gevreten Overgeneralisation +vreet gevreten Overgeneralisation +sevreet gevreten Overgeneralisation+prefix ge pronounced as se +gevrete gevretene Overgeneralisation+ +evrete gevretene Overgeneralisation+Prefix ge without onset +sevrete gevretene Overgeneralisation+prefix ge pronounced as se +evreten gevreten Prefix ge without onset +vreten gevreten Lacking ge prefix +vriesde vroor Overgeneralisation +vriesden vroren Overgeneralisation +vroorde vroor Irregular form plus regular suffix +vroorden vroren Irregular form plus regular suffix +gevriesd gevroren Overgeneralisation+ +evriesd gevroren Overgeneralisation+Prefix ge without onset +vriesd gevroren Overgeneralisation+Lacking ge prefix +sevriesd gevroren Overgeneralisation+prefix ge pronounced as se +gevriesde gevrorene Overgeneralisation+ +evriesde gevrorene Overgeneralisation+Prefix ge without onset +sevriesde gevrorene Overgeneralisation+prefix ge pronounced as se +gevriest gevroren Overgeneralisation +evriest gevroren Overgeneralisation +vriest gevroren Overgeneralisation +gevriesen gevroren Wrong -en suffix +evriesen gevroren Wrong -en suffix +vriesen gevroren Wrong -en suffix +gevroort gevroren Overgeneralisation +evroren gevroren Prefix ge without onset +vroren gevroren Lacking ge prefix +vriijde vrijde Overgeneralisation +vriijden vrijden Overgeneralisation +gevriijd gevrijd Overgeneralisation+ +evriijd gevrijd Overgeneralisation+Prefix ge without onset +vriijd gevrijd Overgeneralisation+Lacking ge prefix +sevriijd gevrijd Overgeneralisation+prefix ge pronounced as se +gevriijde gevrijde Overgeneralisation+ +evriijde gevrijde Overgeneralisation+Prefix ge without onset +sevriijde gevrijde Overgeneralisation+prefix ge pronounced as se +gevriijt gevrijd Overgeneralisation +evriijt gevrijd Overgeneralisation +vriijt gevrijd Overgeneralisation +gevrijen gevrijd Wrong -en suffix +evrijen gevrijd Wrong -en suffix +vrijen gevrijd Wrong -en suffix +evrijd gevrijd Prefix ge without onset +vrijd gevrijd Lacking ge prefix +gewast gewassen Overgeneralisation +ewast gewassen Overgeneralisation +wast gewassen Overgeneralisation +sewast gewassen Overgeneralisation+prefix ge pronounced as se +gewaste gewassene Overgeneralisation+ +ewaste gewassene Overgeneralisation+Prefix ge without onset +sewaste gewassene Overgeneralisation+prefix ge pronounced as se +ewassen gewassen Prefix ge without onset +wassen gewassen Lacking ge prefix +weegde woog Overgeneralisation +weegden wogen Overgeneralisation +woogde woog Irregular form plus regular suffix +woogden wogen Irregular form plus regular suffix +geweegd gewogen Overgeneralisation+ +eweegd gewogen Overgeneralisation+Prefix ge without onset +weegd gewogen Overgeneralisation+Lacking ge prefix +seweegd gewogen Overgeneralisation+prefix ge pronounced as se +geweegde gewogene Overgeneralisation+ +eweegde gewogene Overgeneralisation+Prefix ge without onset +seweegde gewogene Overgeneralisation+prefix ge pronounced as se +geweegt gewogen Overgeneralisation +eweegt gewogen Overgeneralisation +weegt gewogen Overgeneralisation +gewegen gewogen Wrong -en suffix +ewegen gewogen Wrong -en suffix +wegen gewogen Wrong -en suffix +gewoogt gewogen Overgeneralisation +ewogen gewogen Prefix ge without onset +wogen gewogen Lacking ge prefix +werpte wierp Overgeneralisation +werpten wierpen Overgeneralisation +wierpte wierp Irregular form plus regular suffix +wierpten wierpen Irregular form plus regular suffix +gewerpt geworpen Overgeneralisation +ewerpt geworpen Overgeneralisation +werpt geworpen Overgeneralisation +sewerpt geworpen Overgeneralisation+prefix ge pronounced as se +gewerpte geworpene Overgeneralisation+ +ewerpte geworpene Overgeneralisation+Prefix ge without onset +sewerpte geworpene Overgeneralisation+prefix ge pronounced as se +gewerpen geworpen Wrong -en suffix +ewerpen geworpen Wrong -en suffix +werpen geworpen Wrong -en suffix +geworpt geworpen Overgeneralisation +eworpen geworpen Prefix ge without onset +worpen geworpen Lacking ge prefix +werfde wierf Overgeneralisation +werfden wierven Overgeneralisation +wierfde wierf Irregular form plus regular suffix +wierfden wierven Irregular form plus regular suffix +gewerfd geworven Overgeneralisation+ +ewerfd geworven Overgeneralisation+Prefix ge without onset +werfd geworven Overgeneralisation+Lacking ge prefix +sewerfd geworven Overgeneralisation+prefix ge pronounced as se +gewerfde geworvene Overgeneralisation+ +ewerfde geworvene Overgeneralisation+Prefix ge without onset +sewerfde geworvene Overgeneralisation+prefix ge pronounced as se +gewerft geworven Overgeneralisation +ewerft geworven Overgeneralisation +werft geworven Overgeneralisation +gewerfen geworven Wrong -en suffix +ewerfen geworven Wrong -en suffix +werfen geworven Wrong -en suffix +geworfd geworven Overgeneralisation +geworft geworven Overgeneralisation +eworven geworven Prefix ge without onset +worven geworven Lacking ge prefix +weette weet Irregular form plus regular suffix +weetten weten Irregular form plus regular suffix +wistte wist Irregular form plus regular suffix +wistten wisten Irregular form plus regular suffix +geweet geweten Overgeneralisation +eweet geweten Overgeneralisation +weet geweten Overgeneralisation +seweet geweten Overgeneralisation+prefix ge pronounced as se +gewete gewetene Overgeneralisation+ +ewete gewetene Overgeneralisation+Prefix ge without onset +sewete gewetene Overgeneralisation+prefix ge pronounced as se +eweten geweten Prefix ge without onset +weten geweten Lacking ge prefix +geweefd geweven Overgeneralisation +eweefd geweven Overgeneralisation+Prefix ge without onset +weefd geweven Overgeneralisation+Lacking ge prefix +seweefd geweven Overgeneralisation+prefix ge pronounced as se +geweefde gewevene Overgeneralisation+ +eweefde gewevene Overgeneralisation+Prefix ge without onset +seweefde gewevene Overgeneralisation+prefix ge pronounced as se +geweeft geweven Overgeneralisation +eweeft geweven Overgeneralisation +weeft geweven Overgeneralisation +gewefen geweven Wrong -en suffix +ewefen geweven Wrong -en suffix +wefen geweven Wrong -en suffix +eweven geweven Prefix ge without onset +weven geweven Lacking ge prefix +wijkte week Overgeneralisation +wijkten weken Overgeneralisation +weekte week Irregular form plus regular suffix +weekten weken Irregular form plus regular suffix +gewijkt geweken Overgeneralisation +ewijkt geweken Overgeneralisation +wijkt geweken Overgeneralisation +sewijkt geweken Overgeneralisation+prefix ge pronounced as se +gewijkte gewekene Overgeneralisation+ +ewijkte gewekene Overgeneralisation+Prefix ge without onset +sewijkte gewekene Overgeneralisation+prefix ge pronounced as se +gewijken geweken Wrong -en suffix +ewijken geweken Wrong -en suffix +wijken geweken Wrong -en suffix +geweekt geweken Overgeneralisation +eweken geweken Prefix ge without onset +weken geweken Lacking ge prefix +wijtte weet Overgeneralisation +wijtten weten Overgeneralisation +gewijt geweten Overgeneralisation +ewijt geweten Overgeneralisation +wijt geweten Overgeneralisation +sewijt geweten Overgeneralisation+prefix ge pronounced as se +gewijte gewetene Overgeneralisation+ +ewijte gewetene Overgeneralisation+Prefix ge without onset +sewijte gewetene Overgeneralisation+prefix ge pronounced as se +gewijten geweten Wrong -en suffix +ewijten geweten Wrong -en suffix +wijten geweten Wrong -en suffix +wijsde wees Overgeneralisation +wijsden wezen Overgeneralisation +weesde wees Irregular form plus regular suffix +weesden wezen Irregular form plus regular suffix +gewijsd gewezen Overgeneralisation+ +ewijsd gewezen Overgeneralisation+Prefix ge without onset +wijsd gewezen Overgeneralisation+Lacking ge prefix +sewijsd gewezen Overgeneralisation+prefix ge pronounced as se +gewijsde gewezene Overgeneralisation+ +ewijsde gewezene Overgeneralisation+Prefix ge without onset +sewijsde gewezene Overgeneralisation+prefix ge pronounced as se +gewijst gewezen Overgeneralisation +ewijst gewezen Overgeneralisation +wijst gewezen Overgeneralisation +gewijsen gewezen Wrong -en suffix +ewijsen gewezen Wrong -en suffix +wijsen gewezen Wrong -en suffix +geweesd gewezen Overgeneralisation +geweest gewezen Overgeneralisation +ewezen gewezen Prefix ge without onset +wezen gewezen Lacking ge prefix +windde wond Overgeneralisation +windden wonden Overgeneralisation +wondde wond Irregular form plus regular suffix +wondden wonden Irregular form plus regular suffix +gewind gewonnen Overgeneralisation+ +ewind gewonnen Overgeneralisation+Prefix ge without onset +wind gewonnen Overgeneralisation+Lacking ge prefix +sewind gewonnen Overgeneralisation+prefix ge pronounced as se +gewinde gewonnene Overgeneralisation+ +ewinde gewonnene Overgeneralisation+Prefix ge without onset +sewinde gewonnene Overgeneralisation+prefix ge pronounced as se +gewinden gewonden Wrong -en suffix +ewinden gewonden Wrong -en suffix +winden wonnen Overgeneralisation +gewond gewonden Overgeneralisation +ewonden gewonden Prefix ge without onset +wonden wonnen Irregular form plus regular suffix +winde won Overgeneralisation +wonde won Irregular form plus regular suffix +gewint gewonnen Overgeneralisation +ewint gewonnen Overgeneralisation +wint gewonnen Overgeneralisation +gewinnen gewonnen Wrong -en suffix +ewinnen gewonnen Wrong -en suffix +winnen gewonnen Wrong -en suffix +gewont gewonnen Overgeneralisation +ewonnen gewonnen Prefix ge without onset +wonnen gewonnen Lacking ge prefix +wordde werd Overgeneralisation +wordden werden Overgeneralisation +werdde werd Irregular form plus regular suffix +werdden werden Irregular form plus regular suffix +geword geworden Overgeneralisation +eword geworden Overgeneralisation +word geworden Overgeneralisation +seword geworden Overgeneralisation+prefix ge pronounced as se +geworde gewordene Overgeneralisation+ +eworde gewordene Overgeneralisation+Prefix ge without onset +seworde gewordene Overgeneralisation+prefix ge pronounced as se +eworden geworden Prefix ge without onset +worden geworden Lacking ge prefix +wrijfde wreef Overgeneralisation +wrijfden wreven Overgeneralisation +wreefde wreef Irregular form plus regular suffix +wreefden wreven Irregular form plus regular suffix +gewrijfd gewreven Overgeneralisation+ +ewrijfd gewreven Overgeneralisation+Prefix ge without onset +wrijfd gewreven Overgeneralisation+Lacking ge prefix +sewrijfd gewreven Overgeneralisation+prefix ge pronounced as se +gewrijfde gewrevene Overgeneralisation+ +ewrijfde gewrevene Overgeneralisation+Prefix ge without onset +sewrijfde gewrevene Overgeneralisation+prefix ge pronounced as se +gewrijft gewreven Overgeneralisation +ewrijft gewreven Overgeneralisation +wrijft gewreven Overgeneralisation +gewrijfen gewreven Wrong -en suffix +ewrijfen gewreven Wrong -en suffix +wrijfen gewreven Wrong -en suffix +gewreefd gewreven Overgeneralisation +gewreeft gewreven Overgeneralisation +ewreven gewreven Prefix ge without onset +wreven gewreven Lacking ge prefix +wringde wrong Overgeneralisation +wringden wrongen Overgeneralisation +wrongde wrong Irregular form plus regular suffix +wrongden wrongen Irregular form plus regular suffix +gewringd gewrongen Overgeneralisation+ +ewringd gewrongen Overgeneralisation+Prefix ge without onset +wringd gewrongen Overgeneralisation+Lacking ge prefix +sewringd gewrongen Overgeneralisation+prefix ge pronounced as se +gewringde gewrongene Overgeneralisation+ +ewringde gewrongene Overgeneralisation+Prefix ge without onset +sewringde gewrongene Overgeneralisation+prefix ge pronounced as se +gewringt gewrongen Overgeneralisation +ewringt gewrongen Overgeneralisation +wringt gewrongen Overgeneralisation +gewringen gewrongen Wrong -en suffix +ewringen gewrongen Wrong -en suffix +wringen gewrongen Wrong -en suffix +gewrongd gewrongen Overgeneralisation +gewrongt gewrongen Overgeneralisation +ewrongen gewrongen Prefix ge without onset +wrongen gewrongen Lacking ge prefix +zegde zei Overgeneralisation +zegden zeiden Overgeneralisation +zeide zei Irregular form plus regular suffix +ezegd gezegd Prefix ge without onset +zegd gezegd Lacking ge prefix +sezegd gezegd Overgeneralisation+prefix ge pronounced as se +ezegde gezegde Overgeneralisation+Prefix ge without onset +sezegde gezegde Overgeneralisation+prefix ge pronounced as se +gezegt gezegd Overgeneralisation +ezegt gezegd Overgeneralisation +zegt gezegd Overgeneralisation +gezeggen gezegd Wrong -en suffix +ezeggen gezegd Wrong -en suffix +zeggen gezegd Wrong -en suffix +zendde zond Overgeneralisation +zendden zonden Overgeneralisation +zondde zond Irregular form plus regular suffix +zondden zonden Irregular form plus regular suffix +gezend gezonden Overgeneralisation +ezend gezonden Overgeneralisation +zend gezonden Overgeneralisation +sezend gezonden Overgeneralisation+prefix ge pronounced as se +gezende gezondene Overgeneralisation+ +ezende gezondene Overgeneralisation+Prefix ge without onset +sezende gezondene Overgeneralisation+prefix ge pronounced as se +gezenden gezonden Wrong -en suffix +ezenden gezonden Wrong -en suffix +zenden gezonden Wrong -en suffix +gezond gezonden Overgeneralisation +ezonden gezonden Prefix ge without onset +zonden zonnen Irregular form plus regular suffix +zijgde zeeg Overgeneralisation +zijgden zegen Overgeneralisation +zeegde zeeg Irregular form plus regular suffix +zeegden zegen Irregular form plus regular suffix +gezijgd gezegen Overgeneralisation+ +ezijgd gezegen Overgeneralisation+Prefix ge without onset +zijgd gezegen Overgeneralisation+Lacking ge prefix +sezijgd gezegen Overgeneralisation+prefix ge pronounced as se +gezijgde gezegene Overgeneralisation+ +ezijgde gezegene Overgeneralisation+Prefix ge without onset +sezijgde gezegene Overgeneralisation+prefix ge pronounced as se +gezijgt gezegen Overgeneralisation +ezijgt gezegen Overgeneralisation +zijgt gezegen Overgeneralisation +gezijgen gezegen Wrong -en suffix +ezijgen gezegen Wrong -en suffix +zijgen gezegen Wrong -en suffix +gezeegd gezegen Overgeneralisation +gezeegt gezegen Overgeneralisation +ezegen gezegen Prefix ge without onset +zegen gezegen Lacking ge prefix +zijde was Overgeneralisation +zijden waren Overgeneralisation +wasde was Irregular form plus regular suffix +wasden waren Irregular form plus regular suffix +gezijd geweest Overgeneralisation+ +ezijd geweest Overgeneralisation+Prefix ge without onset +zijd geweest Overgeneralisation+Lacking ge prefix +sezijd geweest Overgeneralisation+prefix ge pronounced as se +gezijde geweeste Overgeneralisation+ +ezijde geweeste Overgeneralisation+Prefix ge without onset +sezijde geweeste Overgeneralisation+prefix ge pronounced as se +gezijt geweest Overgeneralisation +ezijt geweest Overgeneralisation +zijt geweest Overgeneralisation +gezijjen geweest Wrong -en suffix +ezijjen geweest Wrong -en suffix +zijjen geweest Wrong -en suffix +eweest geweest Prefix ge without onset +weest geweest Lacking ge prefix +zingde zong Overgeneralisation +zingden zongen Overgeneralisation +zongde zong Irregular form plus regular suffix +zongden zongen Irregular form plus regular suffix +gezingd gezongen Overgeneralisation+ +ezingd gezongen Overgeneralisation+Prefix ge without onset +zingd gezongen Overgeneralisation+Lacking ge prefix +sezingd gezongen Overgeneralisation+prefix ge pronounced as se +gezingde gezongene Overgeneralisation+ +ezingde gezongene Overgeneralisation+Prefix ge without onset +sezingde gezongene Overgeneralisation+prefix ge pronounced as se +gezingt gezongen Overgeneralisation +ezingt gezongen Overgeneralisation +zingt gezongen Overgeneralisation +gezingen gezongen Wrong -en suffix +ezingen gezongen Wrong -en suffix +zingen gezongen Wrong -en suffix +gezongd gezongen Overgeneralisation +gezongt gezongen Overgeneralisation +ezongen gezongen Prefix ge without onset +zongen gezongen Lacking ge prefix +zinkte zonk Overgeneralisation +zinkten zonken Overgeneralisation +zonkte zonk Irregular form plus regular suffix +zonkten zonken Irregular form plus regular suffix +gezinkt gezonken Overgeneralisation +ezinkt gezonken Overgeneralisation +zinkt gezonken Overgeneralisation +sezinkt gezonken Overgeneralisation+prefix ge pronounced as se +gezinkte gezonkene Overgeneralisation+ +ezinkte gezonkene Overgeneralisation+Prefix ge without onset +sezinkte gezonkene Overgeneralisation+prefix ge pronounced as se +gezinken gezonken Wrong -en suffix +ezinken gezonken Wrong -en suffix +zinken gezonken Wrong -en suffix +gezonkt gezonken Overgeneralisation +ezonken gezonken Prefix ge without onset +zonken gezonken Lacking ge prefix +zinde zon Overgeneralisation +zinden zonnen Overgeneralisation +zonde zon Irregular form plus regular suffix +gezind gezonnen Overgeneralisation+ +ezind gezonnen Overgeneralisation+Prefix ge without onset +zind gezonnen Overgeneralisation+Lacking ge prefix +sezind gezonnen Overgeneralisation+prefix ge pronounced as se +gezinde gezonnene Overgeneralisation+ +ezinde gezonnene Overgeneralisation+Prefix ge without onset +sezinde gezonnene Overgeneralisation+prefix ge pronounced as se +gezint gezonnen Overgeneralisation +ezint gezonnen Overgeneralisation +zint gezonnen Overgeneralisation +gezinnen gezonnen Wrong -en suffix +ezinnen gezonnen Wrong -en suffix +zinnen gezonnen Wrong -en suffix +gezont gezonnen Overgeneralisation +ezonnen gezonnen Prefix ge without onset +zonnen gezonnen Lacking ge prefix +zitte zat Overgeneralisation +zitten gezeten Wrong -en suffix +zatte zat Irregular form plus regular suffix +zatten zaten Irregular form plus regular suffix +gezit gezeten Overgeneralisation +ezit gezeten Overgeneralisation +zit gezeten Overgeneralisation +sezit gezeten Overgeneralisation+prefix ge pronounced as se +gezitte gezetene Overgeneralisation+ +ezitte gezetene Overgeneralisation+Prefix ge without onset +sezitte gezetene Overgeneralisation+prefix ge pronounced as se +gezitten gezeten Wrong -en suffix +ezitten gezeten Wrong -en suffix +gezeet gezeten Overgeneralisation +ezeten gezeten Prefix ge without onset +zeten gezeten Lacking ge prefix +zoekte zocht Overgeneralisation +zoekten zochten Overgeneralisation +zochtte zocht Irregular form plus regular suffix +zochtten zochten Irregular form plus regular suffix +gezoekt gezocht Overgeneralisation +ezoekt gezocht Overgeneralisation +zoekt gezocht Overgeneralisation +sezoekt gezocht Overgeneralisation+prefix ge pronounced as se +gezoekte gezochte Overgeneralisation+ +ezoekte gezochte Overgeneralisation+Prefix ge without onset +sezoekte gezochte Overgeneralisation+prefix ge pronounced as se +gezoeken gezocht Wrong -en suffix +ezoeken gezocht Wrong -en suffix +zoeken gezocht Wrong -en suffix +ezocht gezocht Prefix ge without onset +zocht gezocht Lacking ge prefix +zuigde zoog Overgeneralisation +zuigden zogen Overgeneralisation +zoogde zoog Irregular form plus regular suffix +zoogden zogen Irregular form plus regular suffix +gezuigd gezogen Overgeneralisation+ +ezuigd gezogen Overgeneralisation+Prefix ge without onset +zuigd gezogen Overgeneralisation+Lacking ge prefix +sezuigd gezogen Overgeneralisation+prefix ge pronounced as se +gezuigde gezogene Overgeneralisation+ +ezuigde gezogene Overgeneralisation+Prefix ge without onset +sezuigde gezogene Overgeneralisation+prefix ge pronounced as se +gezuigt gezogen Overgeneralisation +ezuigt gezogen Overgeneralisation +zuigt gezogen Overgeneralisation +gezuigen gezogen Wrong -en suffix +ezuigen gezogen Wrong -en suffix +zuigen gezogen Wrong -en suffix +gezoogt gezogen Overgeneralisation +ezogen gezogen Prefix ge without onset +zogen gezogen Lacking ge prefix +zuipte zoop Overgeneralisation +zuipten zopen Overgeneralisation +zoopte zoop Irregular form plus regular suffix +zoopten zopen Irregular form plus regular suffix +gezuipt gezopen Overgeneralisation +ezuipt gezopen Overgeneralisation +zuipt gezopen Overgeneralisation +sezuipt gezopen Overgeneralisation+prefix ge pronounced as se +gezuipte gezopene Overgeneralisation+ +ezuipte gezopene Overgeneralisation+Prefix ge without onset +sezuipte gezopene Overgeneralisation+prefix ge pronounced as se +gezuipen gezopen Wrong -en suffix +ezuipen gezopen Wrong -en suffix +zuipen gezopen Wrong -en suffix +gezoopt gezopen Overgeneralisation +ezopen gezopen Prefix ge without onset +zopen gezopen Lacking ge prefix +zwelgde zwolg Overgeneralisation +zwelgden zwolgen Overgeneralisation +zwolgde zwolg Irregular form plus regular suffix +zwolgden zwolgen Irregular form plus regular suffix +gezwelgd gezwolgen Overgeneralisation+ +ezwelgd gezwolgen Overgeneralisation+Prefix ge without onset +zwelgd gezwolgen Overgeneralisation+Lacking ge prefix +sezwelgd gezwolgen Overgeneralisation+prefix ge pronounced as se +gezwelgde gezwolgene Overgeneralisation+ +ezwelgde gezwolgene Overgeneralisation+Prefix ge without onset +sezwelgde gezwolgene Overgeneralisation+prefix ge pronounced as se +gezwelgt gezwolgen Overgeneralisation +ezwelgt gezwolgen Overgeneralisation +zwelgt gezwolgen Overgeneralisation +gezwelgen gezwolgen Wrong -en suffix +ezwelgen gezwolgen Wrong -en suffix +zwelgen gezwolgen Wrong -en suffix +gezwolgd gezwolgen Overgeneralisation +gezwolgt gezwolgen Overgeneralisation +ezwolgen gezwolgen Prefix ge without onset +zwolgen gezwolgen Lacking ge prefix +zwelde zwol Overgeneralisation +zwelden zwollen Overgeneralisation +zwolde zwol Irregular form plus regular suffix +zwolden zwollen Irregular form plus regular suffix +gezweld gezwollen Overgeneralisation+ +ezweld gezwollen Overgeneralisation+Prefix ge without onset +zweld gezwollen Overgeneralisation+Lacking ge prefix +sezweld gezwollen Overgeneralisation+prefix ge pronounced as se +gezwelde gezwollene Overgeneralisation+ +ezwelde gezwollene Overgeneralisation+Prefix ge without onset +sezwelde gezwollene Overgeneralisation+prefix ge pronounced as se +gezwelt gezwollen Overgeneralisation +ezwelt gezwollen Overgeneralisation +zwelt gezwollen Overgeneralisation +gezwellen gezwollen Wrong -en suffix +ezwellen gezwollen Wrong -en suffix +zwellen gezwollen Wrong -en suffix +gezwolt gezwollen Overgeneralisation +ezwollen gezwollen Prefix ge without onset +zwollen gezwollen Lacking ge prefix +zwemde zwom Overgeneralisation +zwemden zwommen Overgeneralisation +zwomde zwom Irregular form plus regular suffix +zwomden zwommen Irregular form plus regular suffix +gezwemd gezwommen Overgeneralisation+ +ezwemd gezwommen Overgeneralisation+Prefix ge without onset +zwemd gezwommen Overgeneralisation+Lacking ge prefix +sezwemd gezwommen Overgeneralisation+prefix ge pronounced as se +gezwemde gezwommene Overgeneralisation+ +ezwemde gezwommene Overgeneralisation+Prefix ge without onset +sezwemde gezwommene Overgeneralisation+prefix ge pronounced as se +gezwemt gezwommen Overgeneralisation +ezwemt gezwommen Overgeneralisation +zwemt gezwommen Overgeneralisation +gezwemmen gezwommen Wrong -en suffix +ezwemmen gezwommen Wrong -en suffix +zwemmen gezwommen Wrong -en suffix +gezwomt gezwommen Overgeneralisation +ezwommen gezwommen Prefix ge without onset +zwommen gezwommen Lacking ge prefix +zweerde zwoer Overgeneralisation +zweerden zwoeren Overgeneralisation +zwoerde zwoer Irregular form plus regular suffix +zwoerden zwoeren Irregular form plus regular suffix +gezweerd gezworen Overgeneralisation+ +ezweerd gezworen Overgeneralisation+Prefix ge without onset +zweerd gezworen Overgeneralisation+Lacking ge prefix +sezweerd gezworen Overgeneralisation+prefix ge pronounced as se +gezweerde gezworene Overgeneralisation+ +ezweerde gezworene Overgeneralisation+Prefix ge without onset +sezweerde gezworene Overgeneralisation+prefix ge pronounced as se +gezweert gezworen Overgeneralisation +ezweert gezworen Overgeneralisation +zweert gezworen Overgeneralisation +gezweren gezworen Wrong -en suffix +ezweren gezworen Wrong -en suffix +zweren gezworen Wrong -en suffix +gezwoort gezworen Overgeneralisation +ezworen gezworen Prefix ge without onset +zworen gezworen Lacking ge prefix +zwerfde zwierf Overgeneralisation +zwerfden zwierven Overgeneralisation +zwierfde zwierf Irregular form plus regular suffix +zwierfden zwierven Irregular form plus regular suffix +gezwerfd gezworven Overgeneralisation+ +ezwerfd gezworven Overgeneralisation+Prefix ge without onset +zwerfd gezworven Overgeneralisation+Lacking ge prefix +sezwerfd gezworven Overgeneralisation+prefix ge pronounced as se +gezwerfde gezworvene Overgeneralisation+ +ezwerfde gezworvene Overgeneralisation+Prefix ge without onset +sezwerfde gezworvene Overgeneralisation+prefix ge pronounced as se +gezwerft gezworven Overgeneralisation +ezwerft gezworven Overgeneralisation +zwerft gezworven Overgeneralisation +gezwerfen gezworven Wrong -en suffix +ezwerfen gezworven Wrong -en suffix +zwerfen gezworven Wrong -en suffix +gezworfd gezworven Overgeneralisation +gezworft gezworven Overgeneralisation +ezworven gezworven Prefix ge without onset +zworven gezworven Lacking ge prefix +zwijgde zweeg Overgeneralisation +zwijgden zwegen Overgeneralisation +zweegde zweeg Irregular form plus regular suffix +zweegden zwegen Irregular form plus regular suffix +gezwijgd gezwegen Overgeneralisation+ +ezwijgd gezwegen Overgeneralisation+Prefix ge without onset +zwijgd gezwegen Overgeneralisation+Lacking ge prefix +sezwijgd gezwegen Overgeneralisation+prefix ge pronounced as se +gezwijgde gezwegene Overgeneralisation+ +ezwijgde gezwegene Overgeneralisation+Prefix ge without onset +sezwijgde gezwegene Overgeneralisation+prefix ge pronounced as se +gezwijgt gezwegen Overgeneralisation +ezwijgt gezwegen Overgeneralisation +zwijgt gezwegen Overgeneralisation +gezwijgen gezwegen Wrong -en suffix +ezwijgen gezwegen Wrong -en suffix +zwijgen gezwegen Wrong -en suffix +gezweegd gezwegen Overgeneralisation +gezweegt gezwegen Overgeneralisation +ezwegen gezwegen Prefix ge without onset +zwegen gezwegen Lacking ge prefix diff --git a/src/sastadev/lexicon.py b/src/sastadev/lexicon.py index c869a6e..995ecee 100644 --- a/src/sastadev/lexicon.py +++ b/src/sastadev/lexicon.py @@ -8,12 +8,14 @@ ''' - +import os from typing import Any, Dict, List, Optional from sastadev import celexlexicon, treebankfunctions +from sastadev.conf import settings from sastadev.namepartlexicon import (namepart_isa_namepart, namepart_isa_namepart_uc) +from sastadev.readcsv import readcsv from sastadev.sastatypes import CELEX_INFL, DCOITuple, Lemma, SynTree, WordInfo space = ' ' @@ -28,7 +30,7 @@ lexicon = celex #Alpino often analyses certain words as tsw though they should be analysed as nouns -tswnouns = ['baby', 'jongen', 'juf', 'jufforouw', 'mam', 'mama', 'mamma', 'meisje', 'mens', 'meneer', 'mevrouw', +tswnouns = ['baby', 'jongen', 'juf', 'juffrouw', 'mam', 'mama', 'mamma', 'meisje', 'mens', 'meneer', 'mevrouw', 'pap', 'papa', 'pappa', 'stouterd', 'opa', 'oma'] de = '1' @@ -38,6 +40,23 @@ dets[de] = ['de', 'die', 'deze', 'onze', 'welke', 'iedere', 'elke', 'zulke'] dets[het] = ['het', 'dat', 'dit', 'ons', 'welk', 'ieder', 'elk', 'zulk'] +def initializelexicon(lexiconfilename) -> set: + lexicon = set() + fptuples = readcsv(lexiconfilename, header=False) + for _, fp in fptuples: + strippedword = fp[0].strip() + lexicon.add(strippedword) + return lexicon + +def initializelexicondict(lexiconfilename) -> Dict[str,str]: + lexicon = {} + fptuples = readcsv(lexiconfilename, header=False) + for _, fp in fptuples: + strippedword = fp[0].strip() + strippedreplacement = fp[1].strip() + lexicon[strippedword] = strippedreplacement + return lexicon + def isa_namepart(word: str) -> bool: ''' @@ -194,3 +213,13 @@ def getinflforms(thesubj: SynTree, thepv: SynTree, inversion: bool) -> List[str] else: results = [] return results + +nochildwordsfilename = 'nochildwords.txt' +nochildwordsfolder = 'data/nochildwords' +nochildwordsfullname = os.path.join(settings.SD_DIR, nochildwordsfolder, nochildwordsfilename) +nochildwords = initializelexicon(nochildwordsfullname) + +lexiconfoldername = 'data/wordsunknowntoalpino' +wordsunknowntoalpinofilename = 'wordsunknowntoalpino.txt' +wordsunknowntoalpinofullname = os.path.join(settings.SD_DIR, lexiconfoldername, wordsunknowntoalpinofilename) +wordsunknowntoalpinolexicondict = initializelexicondict(wordsunknowntoalpinofullname) diff --git a/src/sastadev/metadata.py b/src/sastadev/metadata.py index 739a0ad..7fd8f0e 100644 --- a/src/sastadev/metadata.py +++ b/src/sastadev/metadata.py @@ -3,8 +3,8 @@ from lxml import etree -bpl_none, bpl_word, bpl_node, bpl_delete, bpl_indeze, bpl_extra_grammatical, bpl_wordlemma, \ - bpl_cond, bpl_replacement = tuple(range(9)) +(bpl_none, bpl_word, bpl_node, bpl_delete, bpl_indeze, bpl_extra_grammatical, + bpl_wordlemma, bpl_cond, bpl_replacement) = tuple(range(9)) defaultpenalty = 10 defaultbackplacement = bpl_none @@ -53,7 +53,7 @@ def despace(str): # replace other sequences of spaces by underscore result = str.strip() result = re.sub(r' +', r'_', result) - return (result) + return result class Meta: @@ -84,17 +84,20 @@ def __init__(self, name, value, annotationwordlist=[], annotationposlist=[], ann def __repr__(self): reprfmstr = 'Meta({},{},annotationwordlist={},annotationposlist={},annotatedposlist{},annotatedwordlist={},' \ ' atype={}, cat={}, subcat={}, source={}, penalty={}, backplacement={})' - result = reprfmstr.format(repr(self.name), repr(self.value), repr(self.annotationwordlist), repr(self.annotationposlist), + result = reprfmstr.format(repr(self.name), repr(self.value), repr(self.annotationwordlist), + repr(self.annotationposlist), repr(self.annotatedposlist), repr( - self.annotatedwordlist), repr(self.atype), - repr(self.cat), repr(self.subcat), repr(self.source), repr(self.penalty), repr(self.backplacement)) + self.annotatedwordlist), repr(self.atype), + repr(self.cat), repr(self.subcat), repr( + self.source), repr(self.penalty), + repr(self.backplacement)) return result def __str__(self): frm = self.fmstr.format(self.name, self.atype, str(self.annotationwordlist), str(self.annotationposlist), str( - self.annotatedwordlist), str(self.annotatedposlist), - str(self.value), str(self.cat), str(self.source)) + self.annotatedwordlist), str(self.annotatedposlist), + str(self.value), str(self.cat), str(self.source)) return frm def toElement(self): @@ -104,8 +107,10 @@ def toElement(self): # subcat=self.subcat, source=str(self.source), backplacement=self.backplacement, # penalty=self.penalty) - result = etree.Element('xmeta', name=self.name, atype=self.atype, annotationwordlist=str(self.annotationwordlist), - annotationposlist=str(self.annotationposlist), annotatedwordlist=str(self.annotatedwordlist), + result = etree.Element('xmeta', name=self.name, atype=self.atype, + annotationwordlist=str(self.annotationwordlist), + annotationposlist=str(self.annotationposlist), + annotatedwordlist=str(self.annotatedwordlist), annotatedposlist=str(self.annotatedposlist), value=str(self.value), cat=str(self.cat), subcat=str(self.subcat), source=str(self.source), backplacement=str(self.backplacement), penalty=str(self.penalty)) diff --git a/src/sastadev/methods.py b/src/sastadev/methods.py index d60997d..52c9724 100644 --- a/src/sastadev/methods.py +++ b/src/sastadev/methods.py @@ -1,12 +1,17 @@ import os from typing import Callable, Dict, List, Optional, Tuple +from sastadev.allresults import mkresultskey from sastadev.conf import settings from sastadev.query import pre_process from sastadev.sastatypes import (AltCodeDict, ExactResult, ExactResultsDict, ExactResultsFilter, FileName, - Item_Level2QIdDict, MethodName, QId, Query, - QueryDict) + Item_Level2QIdDict, MethodName, Pattern, QId, + Query, QueryDict) + +lemmaqid = 'A051' +lexreskey = mkresultskey('A018') +nreskey = mkresultskey('A021') asta = 'asta' stap = 'stap' @@ -18,7 +23,15 @@ validmethods = astamethods + stapmethods + tarspmethods -astalexicalmeasures = ['A018', 'A021'] # LEX and N +astalexicalmeasures = [mkresultskey('A018'), mkresultskey('A021')] # LEX and N + +basicpattern: Pattern = '[,;]' +extendedpattern: Pattern = '[,;/\|]' + +methodseparators = {} +methodseparators[tarsp] = basicpattern +methodseparators[stap] = extendedpattern +methodseparators[asta] = extendedpattern class SampleSize: @@ -60,20 +73,38 @@ def __init__(self, name: MethodName, queries: QueryDict, item2idmap: Item_Level2 self.queries: QueryDict = queries self.defaultfilter: ExactResultsFilter = defaultfilter self.item2idmap: Item_Level2QIdDict = item2idmap + self.simpleitem2idmap = {item: id for ( + (item, level), id) in item2idmap.items()} self.altcodes: AltCodeDict = altcodes self.postquerylist: List[QId] = postquerylist self.methodfilename: FileName = methodfilename + self.separators: Pattern = methodseparators[name] def implies(a: bool, b: bool) -> bool: - return (not a or b) + return (not a) or b + + +def astalemmafilter(query: Query, xrs: ExactResultsDict, xr: ExactResult) -> bool: + for (qid, val) in xrs: + if qid == lemmaqid: + if xr in xrs[(qid, val)]: + result1 = xr in xrs[lexreskey] or xr in xrs[nreskey] + result = query.process == pre_process or result1 + return result + + return True # filter specifies what passes the filter def astadefaultfilter(query: Query, xrs: ExactResultsDict, xr: ExactResult) -> bool: - return query.process == pre_process or \ - (implies('A029' in xrs, xr not in xrs['A029']) - and implies('A045' in xrs, xr not in xrs['A045'])) + a029 = mkresultskey('A029') + a045 = mkresultskey('A045') + result1 = query.process == pre_process + result2 = xr not in xrs[a029] if a029 in xrs else True + result3 = xr not in xrs[a045] if a045 in xrs else True + result = result1 or (result2 and result3) + return result def getmethodfromfile(filename: str) -> str: @@ -118,18 +149,27 @@ def treatmethod(methodname: MethodName, methodfilename: FileName) -> Tuple[Metho return resultmethodname, resultmethodfilename -codepath = settings.SD_DIR +codepath = os.path.dirname(os.path.abspath(__file__)) datapath = os.path.join(codepath, 'data') methodspath = os.path.join(datapath, 'methods') - supported_methods = {} supported_methods[tarsp] = os.path.join( - methodspath, 'TARSP Index Current.xlsx') + methodspath, 'TARSP_Index_Current.xlsx') supported_methods[asta] = os.path.join(methodspath, 'ASTA_Index_Current.xlsx') supported_methods[stap] = os.path.join(methodspath, 'STAP_Index_Current.xlsx') +codepath = os.path.dirname(os.path.abspath(__file__)) +datapath = os.path.join(codepath, 'data') +methodspath = os.path.join(datapath, 'methods') + +# supported_methods = {} +# supported_methods[tarsp] = os.path.join( +# methodspath, 'TARSP_Index_Current.xlsx') +# supported_methods[asta] = os.path.join(methodspath, 'ASTA_Index_Current.xlsx') +# supported_methods[stap] = os.path.join(methodspath, 'STAP_Index_Current.xlsx') + defaultfilters: Dict[MethodName, ExactResultsFilter] = {} defaultfilters[asta] = astadefaultfilter defaultfilters[tarsp] = allok diff --git a/src/sastadev/mismatches.py b/src/sastadev/mismatches.py index 4eebe96..5c36c1d 100644 --- a/src/sastadev/mismatches.py +++ b/src/sastadev/mismatches.py @@ -1,9 +1,12 @@ from collections import Counter from copy import copy +from typing import Tuple from lxml import etree +from sastadev.allresults import ResultsKey, showreskey from sastadev.conf import settings +from sastadev.sastatypes import Position, UttId from sastadev.treebankfunctions import (find1, getattval, getmarkedyield, getyield) @@ -73,7 +76,7 @@ def getfirstwordposition(matchtree): position = 0 return position -#moved to treebannkfunctions +# moved to treebannkfunctions # def getmarkedyield(wordlist, positions): # pos = 1 # resultlist = [] @@ -86,14 +89,16 @@ def getfirstwordposition(matchtree): # return resultlist -def mismatches(queryid, queries, theresultsminusgold, goldminustheresults, allmatches, allutts, platinumcheckfile): +def mismatches(reskey, queries, theresultsminusgold, goldminustheresults, allmatches, allutts, platinumcheckfile): + reskeystr = showreskey(reskey) + queryid = reskey[0] if theresultsminusgold != {}: print('More examples', file=platinumcheckfile) for uttid in theresultsminusgold: - if (queryid, uttid) in allmatches: - for (m, syntree) in allmatches[(queryid, uttid)]: + if (reskey, uttid) in allmatches: + for (m, syntree) in allmatches[(reskey, uttid)]: markedutt = getmarkedutt(m, syntree) - platinumcheckrow1 = [queryid, queries[queryid].cat, queries[queryid].subcat, queries[queryid].item, + platinumcheckrow1 = [reskeystr, queries[queryid].cat, queries[queryid].subcat, queries[queryid].item, uttid, markedutt] print(tab.join(platinumcheckrow1), file=platinumcheckfile) @@ -104,8 +109,8 @@ def mismatches(queryid, queries, theresultsminusgold, goldminustheresults, allma uttstr = space.join(allutts[uttid]) else: settings.LOGGER.warning('uttid {} not in alluts'.format(uttid)) - platinumcheckrow2 = [queryid, queries[queryid].cat, queries[queryid].subcat, queries[queryid].item, uttid, - uttstr] + platinumcheckrow2 = [reskeystr, queries[queryid].cat, queries[queryid].subcat, queries[queryid].item, uttid, + uttstr, queries[queryid].inform] print(tab.join(platinumcheckrow2), file=platinumcheckfile) @@ -116,36 +121,92 @@ def getmarkposition(position, nodeendmap, uttid): if str(position) in nodeendmap[uttid]: result = nodeendmap[uttid][str(position)] else: - settings.LOGGER.error('getmarkposition: No mapping found for position {} in utterance {}'.format(position, uttid)) + settings.LOGGER.error( + 'getmarkposition: No mapping found for position {} in utterance {}'.format(position, uttid)) result = 1 else: - settings.LOGGER.error('getmarkposition: No mappings found for uttid {}'.format(uttid)) + settings.LOGGER.error( + 'getmarkposition: No mappings found for uttid {}'.format(uttid)) result = 1 return result -def exactmismatches(queryid, queries, exactresults, exactgoldscores, allmatches, allutts, platinumcheckfile, +def isliteralreskey(reskey: ResultsKey): + (key, val) = reskey + result = key != val + return result + + +def literalmissedmatches(queries, exactresults, exactgoldscores, allmatches, allutts, platinumcheckfile, + permsilverdatadict={}, annotationinput=False): + newrows = [] + for reskey in exactgoldscores: + if isliteralreskey(reskey) and reskey not in exactresults: + print('Missed examples', file=platinumcheckfile) + reskeystr = showreskey(reskey) + queryid = reskey[0] + inform = queries[queryid].inform + for hit in exactgoldscores[reskey]: + (uttid, position) = hit + if uttid in allutts: + # markposition = 1 if position == 0 else position + markposition = position + markedwordlist = getmarkedyield( + allutts[uttid], [markposition]) + uttstr = space.join(markedwordlist) + tree = allmatches[(reskey, uttid)][0][1] if ( + reskey, uttid) in allmatches else None + origutt = find1( + tree, './/meta[@name="origutt"]/@value') if tree is not None else '**' + else: + settings.LOGGER.warning( + 'uttid {} not in allutts'.format(uttid)) + uttstr = "" + markposition = 0 + tree = allmatches[(reskey, uttid)][0][1] if ( + reskey, uttid) in allmatches else None + origutt = find1( + tree, './/meta[@name="origutt"]/@value') if tree is not None else '**' + platinumcheckrow2 = [reskeystr, queries[queryid].cat, queries[queryid].subcat, queries[queryid].item, + str(uttid), + str(markposition), + uttstr, origutt, inform] + print(tab.join(platinumcheckrow2), file=platinumcheckfile) + key = (reskey, uttid, position) + usercomments = getusercomments( + permsilverdatadict, key, report=False) + xlplatinumcheckrow2 = usercomments + \ + ['Missed examples'] + platinumcheckrow2 + newrows.append(xlplatinumcheckrow2) + return newrows + + +def exactmismatches(reskey, queries, exactresults, exactgoldscores, allmatches, allutts, platinumcheckfile, permsilverdatadict={}, annotationinput=False): - theexactresults = exactresults[queryid] if queryid in exactresults else Counter() - theexactgoldscores = exactgoldscores[queryid] if queryid in exactgoldscores else Counter() + reskeystr = showreskey(reskey) + queryid = reskey[0] + inform = queries[queryid].inform + theexactresults = exactresults[reskey] if reskey in exactresults else Counter() + theexactgoldscores = exactgoldscores[reskey] if reskey in exactgoldscores else Counter() (theresultsminusgold, goldminustheresults, intersection) = exactcompare(theexactresults, theexactgoldscores) newrows = [] if theresultsminusgold != []: print('More examples', file=platinumcheckfile) for hit in theresultsminusgold: uttid, position = hit - if (queryid, uttid) in allmatches or annotationinput: - #markposition = 1 if position == 0 else position - tree = allmatches[(queryid, uttid)][0][1] if (queryid, uttid) in allmatches else None + if (reskey, uttid) in allmatches or annotationinput: + # markposition = 1 if position == 0 else position + tree = allmatches[(reskey, uttid)][0][1] if (reskey, uttid) in allmatches else None origutt = find1(tree, './/meta[@name="origutt"]/@value') if tree is not None else '**' markposition = position if uttid in allutts: markedwordlist = getmarkedyield(allutts[uttid], [markposition]) uttstr = space.join(markedwordlist) - platinumcheckrow1 = [queryid, queries[queryid].cat, queries[queryid].subcat, queries[queryid].item, - str(uttid), str(markposition), uttstr, origutt] + queryitem = reskey[1] if isliteralreskey(reskey) else queries[queryid].item + platinumcheckrow1 = [reskeystr, queries[queryid].cat, queries[queryid].subcat, queryitem, + str(uttid), str(markposition), uttstr, origutt, inform] print(tab.join(platinumcheckrow1), file=platinumcheckfile) - key = (queryid, uttid, position) + key = (reskey, uttid, position) usercomments = getusercomments(permsilverdatadict, key, report=True) xlplatinumcheckrow1 = usercomments + ['More examples'] + platinumcheckrow1 newrows.append(xlplatinumcheckrow1) @@ -156,32 +217,35 @@ def exactmismatches(queryid, queries, exactresults, exactgoldscores, allmatches, # uttid), markedutt] # print(tab.join(platinumcheckrow1), file=platinumcheckfile) else: - settings.LOGGER.error(f'Uttid {uttid} not in allutts; reporting ignored') + settings.LOGGER.error( + f'Uttid {uttid} not in allutts; reporting ignored') if goldminustheresults != []: print('Missed examples', file=platinumcheckfile) for hit in goldminustheresults: (uttid, position) = hit if uttid in allutts: - #markposition = 1 if position == 0 else position + # markposition = 1 if position == 0 else position markposition = position markedwordlist = getmarkedyield(allutts[uttid], [markposition]) uttstr = space.join(markedwordlist) - tree = allmatches[(queryid, uttid)][0][1] if (queryid, uttid) in allmatches else None + tree = allmatches[(reskey, uttid)][0][1] if (reskey, uttid) in allmatches else None origutt = find1(tree, './/meta[@name="origutt"]/@value') if tree is not None else '**' else: settings.LOGGER.warning('uttid {} not in allutts'.format(uttid)) uttstr = "" markposition = 0 - tree = allmatches[(queryid, uttid)][0][1] if (queryid, uttid) in allmatches else None + tree = allmatches[(reskey, uttid)][0][1] if (queryid, uttid) in allmatches else None origutt = find1(tree, './/meta[@name="origutt"]/@value') if tree is not None else '**' - platinumcheckrow2 = [queryid, queries[queryid].cat, queries[queryid].subcat, queries[queryid].item, str(uttid), + platinumcheckrow2 = [reskeystr, queries[queryid].cat, queries[queryid].subcat, queries[queryid].item, + str(uttid), str(markposition), - uttstr, origutt] + uttstr, origutt, inform] print(tab.join(platinumcheckrow2), file=platinumcheckfile) - key = (queryid, uttid, position) + key = (reskey, uttid, position) usercomments = getusercomments(permsilverdatadict, key, report=False) - xlplatinumcheckrow2 = usercomments + ['Missed examples'] + platinumcheckrow2 + xlplatinumcheckrow2 = usercomments + \ + ['Missed examples'] + platinumcheckrow2 newrows.append(xlplatinumcheckrow2) return newrows @@ -232,7 +296,8 @@ def exactcompare(exactresults, exactgoldscores): resultsminusgold1 = resultscounter - goldcounter goldminusresults1 = goldcounter - resultscounter - (resultsminusgold2, goldminusresults2, intersection2) = compareunaligned(resultsminusgold1, goldminusresults1) + (resultsminusgold2, goldminusresults2, intersection2) = compareunaligned( + resultsminusgold1, goldminusresults1) intersectionctr = intersection1 + intersection2 resultsminusgoldctr = resultsminusgold1 - resultsminusgold2 @@ -251,11 +316,17 @@ def counter2list(ctr): return result -def getusercomments(permsilverdict, key, report=False): +def getusercomments(permsilverdict, key: Tuple[ResultsKey, UttId, Position], report=False): + reskey, uttid, pos = key + olderkey = (reskey[0], uttid, pos) if key in permsilverdict: therow = permsilverdict[key] usercomments = therow[usercommentbegin:usercommentuntil] result = usercomments + elif olderkey in permsilverdict: + therow = permsilverdict[olderkey] + usercomments = therow[usercommentbegin:usercommentuntil] + result = usercomments else: count = usercommentuntil - usercommentbegin resultlist = [usercommentdefaultvalue for _ in range(count)] @@ -271,7 +342,8 @@ def testcompare(): reftestminusgold = [(1, 2), (1, 5), (1, 6)] refgoldminustest = [(3, 5)] refintersection = [(1, 2), (1, 2), (2, 4), (2, 6)] - (testminusgold, goldminustest, intersection) = exactcompare(testresults, goldresults) + (testminusgold, goldminustest, intersection) = exactcompare( + testresults, goldresults) for (l, r, g) in zip(['R-G', 'G-R', 'R*G'], [testminusgold, goldminustest, intersection], [reftestminusgold, refgoldminustest, refintersection]): if r == g: diff --git a/src/sastadev/mysastadev - Shortcut.lnk b/src/sastadev/mysastadev - Shortcut.lnk new file mode 100644 index 0000000..4712208 Binary files /dev/null and b/src/sastadev/mysastadev - Shortcut.lnk differ diff --git a/src/sastadev/mysastadev.py b/src/sastadev/mysastadev.py new file mode 100644 index 0000000..a8c728b --- /dev/null +++ b/src/sastadev/mysastadev.py @@ -0,0 +1,1456 @@ +""" + +SASTAdev is a module used for developing SASTA. It takes as input a treebank or a (corrected) annotation file, +a method (or method filename), and various kinds of reference files. +We originally used the terms *gold* for the reference file, and *platinum* for an improved reference file, +but later changed this to *bronze* and *silver*, resp. +In the modules and file names the terms gold and platinum have not been replaced everywhere, so both terms still occur. + + +All input is supposed to be encoded in UTF8, all output is also generated in UTF8. + + +Here is the help for this module (python sastadev.py -h):: + + Usage: sastadev.py [options] + + Options: + -h, --help show this help message and exit + -f INFILENAME, --file=INFILENAME + Treebank File to be analysed + -m METHODNAME, --method=METHODNAME + Name of the method or (for backwards compatibility) + file containing definition of assessment method (SAM) + -a ANNOTATIONFILENAME, --anno=ANNOTATIONFILENAME + SASTA Annotation Format File containing annotations to + derive a reference + -g GOLDFILENAME, --gold=GOLDFILENAME + File containing a gold reference in SASTA Reference + Format + -c GOLDCOUNTSFILENAME, --goldcounts=GOLDCOUNTSFILENAME + File containing gold reference counts in SASTA + Counts Reference Format + -p PLATINUMINFILENAME, --plat=PLATINUMINFILENAME + File containing a platinum reference in SASTA + Reference Format + -i, --impl Use the implies column of the method + -l LOGFILENAME, --log=LOGFILENAME + File for logging + --corr=CORR 0=No correction; 1=correction with 1 alternative; + n=correction with multiple alternatives (default) + --mf=METHODFILENAME, --mfile=METHODFILENAME + File containing definition of assessment method (SAM) + + + +By using the preferred file and folder structure, the number of parameters to be +specified is minimal. + +The preferred file and folder structure is as follows: + + * There is a dataroot where all data reside. This dataroot can be specified in the configuration module + * Within the dataroot there is a folder for each dataset (e.g., VKLTARSP for TARSP data provided by VKL) + * Within each dataset folder the folders are fixed, as follows: + + * Analyses: for storing previous analysis results + * Analysiscomparison: for reports generated by sastadev on the differences with an earlier analysis + * Bronze: for bronze reference annotation files + * Forms: for forms generated by sastadev + * Indata: for the .cha or .docx input files + * Intreebanks: for the treebankfiles corresponding to the files in indata + * Logging: for various logging files generated by sastadev + * Outtreebanks: for corrected treebanks generated by sastadev + * Results: for analysis results generated by sastadev + * Silver: for silver files + * Silverperm: for the silver annotation store + +If the input data are in a standard dataset folder configuration, sastadev can be called by specifying the full path +to the input treebank (using -f) and specifying the method (using -m), e.g.:: + + python sastadev.py -f "D:/jodijk/Dropbox/jodijk/Utrecht/Projects/SASTADATA/VKLTarsp/intreebanks/Tarsp_01.xml" -m tarsp + +(where 'D:/jodijk/Dropbox/jodijk/Utrecht/Projects/SASTADATA' is the dataroot for user Odijk101) + +If the data are not in the standard configuration, one needs to specify one additional parameter to specify the +full path to the bronze reference file. It is assumed that all other input files are in the same folder as the +input treebank, and all output files are generated in that folder. + +It generates as output a lot of files. If the input treebank file has the name Tarsp_10.xml, the following files +are generated as output: + +* Log file: Tarsp_10.log +* Platinum files: + + * Tarsp_10.platinum-edited.tsv.txt + * Tarsp_10.platinum.tsv.txt + +* Platinum Check files: + + * TSV format: Tarsp_10_platinum.check.tsv.txt + * XSLX format: Tarsp_10_platinum.check.tsv.xlsx + +* Analysis files: + + * TSV format: Tarsp_10_analysis.tsv.txt + * XLSX format: Tarsp_10_analysis.xlsx + +* Grammatical Error related files: + + * Corrected treebank: Tarsp_10_corrected.xml + * Error Logging: Tarsp_10_errorlogging.xlsx + * Error Report: Tarsp_10_errorreport.xlsx + +* Tarsp_10_countcomparison.tsv.txt +* Form: Tarsp_10_TARSP-Form.xlsx + + + +Sastadev supports the following reference files: + + * for bronze/gold reference files + + * an annotated reference file in Sasta Annotation File (SAF) format (option -a), or + * a reference file in Sasta Reference File (SRF) format (option -g), or + * a reference count file in SASTA Reference Count File (RCF) format (option -c) + + * for silver/platinum reference files: + + * a reference file in Sasta Reference File (SRF) format (option -p) + +Sastadev yields as output: + + * an analysis file showing the results and comparing them to the gold and platinum reference if supplied (in SASTA Development Analysis (SDA) format) + * a new platinumfile (useful for creating or updating the platinum reference file), in SPR format + * a platinum check file: list the examples of mismatches between the results and the gold reference + * a gold counts comparison file (for each measure the # of the results, the # of the gold reference count, and their difference) (tsv format) + +Sastadev logs its actions through: + + * a logfile, and + * the terminal screen (sys.stderr) + +""" + +# to do +# -Excel output, cleanup output code + +import datetime +import logging +import os +import re +import sys +from collections import Counter, defaultdict +# from altcodes import altcodes +from optparse import OptionParser +from typing import Any, Callable, Dict, List, Pattern, Tuple + +import xlsxwriter +# import xlrd +from lxml import etree + +from sastadev import compounds +from sastadev.allresults import (AllResults, ExactResultsDict, MatchesDict, + ResultsKey, mkresultskey, scores2counts, + showreskey) +from sastadev.ASTApostfunctions import getastamaxsamplesizeuttidsandcutoff +from sastadev.conf import settings +from sastadev.constants import (bronzefolder, formsfolder, intreebanksfolder, + loggingfolder, outtreebanksfolder, + resultsfolder, silverfolder, silverpermfolder) +from sastadev.correcttreebank import (correcttreebank, corrn, errorwbheader, + validcorroptions) +from sastadev.counterfunctions import counter2liststr +from sastadev.external_functions import str2functionmap +from sastadev.goldcountreader import get_goldcounts +from sastadev.macros import expandmacros +from sastadev.methods import (Method, astamethods, stapmethods, + supported_methods, tarspmethods, treatmethod) +from sastadev.mismatches import (exactmismatches, getmarkposition, + literalmissedmatches) +from sastadev.mksilver import getsilverannotations, permprefix +from sastadev.query import (Query, form_process, is_core, is_literal, is_pre, + is_preorcore, post_process, query_exists, + query_inform) +from sastadev.readmethod import itemseppattern, read_method +from sastadev.reduceresults import (exact2results, reduceallresults, + reduceexactgoldscores, reduceresults) +from sastadev.rpf1 import getevalscores, getscores, sumfreq +from sastadev.SAFreader import (get_golddata, richexact2global, + richscores2scores) +from sastadev.sasta_explanation import finalexplanation_adapttreebank +# import sastatypes +from sastadev.sastatypes import (AltCodeDict, GoldTuple, MethodName, Position, + QId, QIdCount, QueryDict, ResultsCounter, + SampleSizeTuple, SynTree, UttId) +from sastadev.SRFreader import read_referencefile +from sastadev.stringfunctions import getallrealwords +from sastadev.targets import get_mustbedone, get_targets +from sastadev.treebankfunctions import (getattval, getnodeendmap, getuttid, + getxmetatreepositions, getxselseuttid, + getyield, showtree) +from sastadev.xlsx import mkworkbook + +listDir = False +if listDir: + print(dir()) + exit(0) + + +tarsp = 'tarsp' +stap = 'stap' +asta = 'asta' +gramat = 'gramat' + +codepath = os.path.dirname(os.path.abspath(__file__)) + + +# moved to methods.py +# methodspath = os.path.join(codepath, 'methods') + +# supported_methods = {} +# supported_methods[tarsp] = os.path.join(methodspath, 'TARSP Index Current.xlsx') +# supported_methods[asta] = os.path.join(methodspath, 'ASTA Index Current.xlsx') +# supported_methods[stap] = os.path.join(methodspath, 'STAP_Index_Current.xlsx') + +platinumchecksuffix = '_platinum.check.tsv' +platinumcheckeditedsuffix = '_platinum.check-edited.tsv' +platinumsuffix = '.platinum.tsv' +platinumeditedsuffix = '.platinum-edited.tsv' +bronzesuffix = '_bronze' +silversuffix = '_silver' + +path2permfolder = silverpermfolder + + +# target_intarget, target_xsid, target_all = 0, 1, 2 +# intargetxpath = '//meta[@name="intarget"]' +# xsidxpath = '//meta[@name="xsid"]' +# intargetvalxpath = './/meta[@name="intarget"]/@value' +# xsidvalxpath = './/meta[@name="xsid"]/@value' + +proc = tarsp + +logfile = sys.stderr + +space = " " +comma = "," +semicolon = ';' +commaspace = ', ' +tab = '\t' +pagesep = semicolon +txtext = ".txt" +tsvext = '.tsv' +logext = ".log" +xlsxext = '.xlsx' +samzn = 'samzn' +goldheaderrows = 1 +# platinumheaderrows = 1 +na = 'na' + +getwordsxpath = ".//node[@pt or @pos]" + +queryinfoheaderrow = ['id', 'cat', 'subcat', 'item'] +queryresultsheaderrow = ['count', 'results', + 'GoldCount', 'Goldresults', 'queryExists'] +queryRGscoreheaderrow = ['recall', 'precision', 'f1score', + 'intersection', 'gold-results', 'results-gold'] +queryRPscoreheaderrow = ['platinum', 'plat_recall', 'plat_precision', + 'plat_f1score', 'plat-results', 'results-plat'] +queryGPscoreheaderrow = ['GP recall', 'GP precision', + 'GP F1-score', 'GP intersection', 'P minus G', 'G minus P'] + +resultsheaderrow = queryinfoheaderrow + queryresultsheaderrow + \ + queryRGscoreheaderrow + queryRPscoreheaderrow + queryGPscoreheaderrow +resultsheaderstring = tab.join(resultsheaderrow) +platinumheaderrow = ['id', 'cat', 'subcat', 'item', + 'uttids', 'results-gold', 'status', 'remarks'] +platinumheaderstring = tab.join(platinumheaderrow) + +allmatches: MatchesDict = {} +altcodes: AltCodeDict = {} + +emptycounter: Counter = Counter() +invalidqueries: Dict[QId, Exception] = {} + + +def checkplatinum(goldscores: Dict[ResultsKey, Counter], platinumscores: Dict[ResultsKey, Counter], queries: QueryDict) -> None: + for reskey in goldscores: + if reskey in platinumscores: + # all values of gold must be in platinum + qid = reskey[0] + if query_exists(queries[qid]): + diff1 = goldscores[reskey] - platinumscores[reskey] + if diff1 != Counter(): + settings.LOGGER.warning( + '{} has goldscores not in platinum: {}'.format(str(reskey), diff1)) + + +def mkerrorreport(errordict, errorreportfilename: str): + header = ['name', 'count', 'uttid', 'value', + 'source', 'cat', 'subcat', 'origutt', 'parsed_as'] + allrows = [] + for item in errordict: + count = len(errordict[item]) + summaryrow = [item, count] + allrows.append(summaryrow) + for instance in errordict[item]: + instancerow = instance[0:1] + instance[2:] + fullrow = [item, ''] + instancerow + allrows.append(fullrow) + + wb = mkworkbook(errorreportfilename, [ + header], allrows, freeze_panes=(1, 1)) + wb.close() + + +def erow(cnt: int) -> List[str]: + result = [] + for i in range(cnt): + result.append('') + return result + + +def getpostval(qid, thepostresults): + if qid in thepostresults: + result = thepostresults[qid] + else: + result = '' + return result + + +# def scores2counts(scores): +# counts = {} +# for el in scores: +# countval = len(scores[el]) +# counts[el] = countval +# return counts + +def sf(number): + if type(number) == float or type(number) == int: + result = '{0:.1f}'.format(number) + else: + result = number + return result + + +def getmarkedutt(m: SynTree, syntree: SynTree) -> str: + thewordlist = getyield(syntree) + thepositions = getwordpositions(m, syntree) + themarkedyield = getmarkedyield(thewordlist, thepositions) + yieldstr = space.join(themarkedyield) + return yieldstr + + +def mark(str: str) -> str: + result = '*' + str + '*' + return result + + +def getwordpositionsold(matchtree: SynTree, syntree: SynTree) -> List[int]: + positions1 = [] + for node in matchtree.iter(): + if 'pt' in node.attrib: + if 'end' in node.attrib: + positions1.append(node.attrib['end']) + + indexednodes = {} + for node in syntree.iter(): + if 'index' in node.attrib and ('pt' in node.attrib or 'cat' in node.attrib or 'pos' in node.attrib): + theindex = node.attrib['index'] + indexednodes[theindex] = node + + thequery2 = ".//node[@index and not(@pt) and not(@cat)]" + try: + matches2 = matchtree.xpath(thequery2) + except etree.XPathEvalError as e: + matches2 = [] + positions2 = [] + for m in matches2: + positions2 += getwordpositions(m, syntree) + positions = positions1 + positions2 + result = [int(p) for p in positions] + return result + + +def getwordpositions(matchtree: SynTree, syntree: SynTree) -> List[int]: + # nothing special needs to be done for index nodes since they also have begin and end + positions = [] + for node in matchtree.iter(): + if 'end' in node.attrib: + positions.append(node.attrib['end']) + result = [int(p) for p in positions] + return result + + +def getmarkedyield(wordlist: List[str], positions: List[int]) -> List[str]: + pos = 1 + resultlist = [] + for w in wordlist: + if pos in positions: + resultlist.append(mark(w)) + else: + resultlist.append(w) + pos += 1 + return resultlist + + +def update(thedict: Dict[str, GoldTuple], qid: str, goldtuple: GoldTuple): + (level, item, thecounter) = goldtuple + if qid in thedict: + (oldlevel, olditem, oldcounter) = thedict[qid] + thedict[qid] = (oldlevel, olditem, oldcounter + thecounter) + else: + thedict[qid] = goldtuple + + +def logprint(str: str): + print(str, file=logfile) + if logfile != sys.stderr: + print(str, file=sys.stderr) + +# @@ types to be reconsidered + + +def getitem2levelmap(mapping): + resultmap: Dict[Any, List[Any]] = {} + for (item, level) in mapping: + if item in resultmap: + resultmap[item].append(level) + else: + resultmap[item] = [level] + return resultmap + + +def getcompounds(syntree: SynTree) -> List[SynTree]: + results: List[SynTree] = [] + tlist = syntree.xpath(getwordsxpath) + for t in tlist: + w = t.attrib['word'] + if compounds.iscompound(w): + results.append(t) + return results + + +def isxpathquery(query: str) -> bool: + cleanquery = query.lstrip() + return cleanquery.startswith('//') + + +def getreskey(qid: QId, m: SynTree, queries: QueryDict) -> ResultsKey: + if m is None: + return mkresultskey(qid) + thequery = queries[qid] + if is_literal(thequery): + litfunc = str2functionmap[thequery.literal] + thevalue = litfunc(m) + return mkresultskey(qid, thevalue) + else: + return mkresultskey(qid) + + +def doqueries(syntree: SynTree, queries: QueryDict, exactresults: ExactResultsDict, allmatches: MatchesDict, criterion: Callable[[Query], bool]): + global invalidqueries + uttid = getuttid(syntree) + # uttid = getuttidorno(syntree) + omittedwordpositions = getxmetatreepositions( + syntree, 'Omitted Word', poslistname='annotatedposlist') + # print(uttid) + # core queries + junk = 0 + for queryid in queries: # @@ dit aanpassen voor literals en voor Resultskey; check read_referencefile + # if queryid not in exactresults: # not needed becaysetaken care of below + # exactresults[queryid] = [] + thequeryobj = queries[queryid] + if criterion(thequeryobj): + if query_exists(thequeryobj): + thelistedquery = thequeryobj.query + if isxpathquery(thelistedquery): + expandedquery = expandmacros(thelistedquery) + thequery = "." + expandedquery + try: + matches = syntree.xpath(thequery) + except etree.XPathEvalError as e: + invalidqueries[queryid] = e + matches = [] + else: + thef = str2functionmap[thelistedquery] + matches = thef(syntree) + else: + matches = [] + exactresults[mkresultskey(queryid)] = [] + # matchingids = [uttid for x in matches] + for m in matches: + # showtree(m) + reskey = getreskey(queryid, m, queries) + if m is None: + showtree(syntree, text='in doqueries: Nonematch') + if (reskey, uttid) in allmatches: + allmatches[(reskey, uttid)].append((m, syntree)) + else: + allmatches[(reskey, uttid)] = [(m, syntree)] + exactresult = (uttid, int(getattval(m, 'begin')) + 1) + if reskey in exactresults: + exactresults[reskey].append(exactresult) + else: + exactresults[reskey] = [exactresult] + # if queryid in results: + # results[queryid].update(matchingids) + # else: + # results[queryid] = Counter(matchingids) + + +def docorequeries(syntree: SynTree, queries: QueryDict, results: ExactResultsDict, allmatches: MatchesDict): + doqueries(syntree, queries, results, allmatches, is_core) + + +def doprequeries(syntree: SynTree, queries: QueryDict, results: ExactResultsDict, allmatches: MatchesDict): + doqueries(syntree, queries, results, allmatches, is_pre) + + +def dopostqueries(allresults: AllResults, postquerylist: List[QId], queries: QueryDict): + # post queries + for queryid in postquerylist: + thequeryobj = queries[queryid] + if query_exists(thequeryobj): + thelistedquery = thequeryobj.query + + # it is assumed that these are all python functions + thef = str2functionmap[thelistedquery] + result = thef(allresults, queries) + allresults.postresults[queryid] = result + + +def codeadapt(c: str) -> str: + result = c + result = re.sub(r'\.', r'\\.', result) + result = re.sub(r'\(', r'\\(', result) + result = re.sub(r'\)', r'\\)', result) + result = re.sub(r'\?', r'\\?', result) + result = re.sub(r'\*', r'\\*', result) + result = re.sub(r'\+', r'\\+', result) + result = re.sub(r' ', r'\\s+', result) + return result + + +def mkpatterns(allcodes: List[str]) -> Tuple[Pattern, Pattern]: + basepattern = r'' + sortedallcodes = sorted(allcodes, key=len, reverse=True) + adaptedcodes = [codeadapt(c) for c in sortedallcodes] + basepattern = r'' + '|'.join(adaptedcodes) + '|' + itemseppattern + fullpattern = r'^(' + basepattern + r')*$' + return (re.compile(basepattern), re.compile(fullpattern)) + + +def get_definedfornonemptygold(goldscores, queries: QueryDict) -> Tuple[int, List[QId]]: + undefinedqueries = [] + definedfornonemptygoldscore = 0 + for reskey in goldscores: + if goldscores[reskey] != emptycounter: + queryid = reskey[0] + if queryid in queries: + if queries[queryid].query != '': + definedfornonemptygoldscore += 1 + else: + undefinedqueries.append(queryid) + return (definedfornonemptygoldscore, undefinedqueries) + + +def get_comparison(resultscounts: QIdCount, goldcounts: QIdCount, queries: QueryDict) -> List[Tuple[QId, int, int]]: + comparison = [] + for qid in queries: + if qid in goldcounts: + gold = goldcounts[qid] + if qid in resultscounts: + res = resultscounts[qid] + else: + res = 0 + else: + gold = 0 + if qid in resultscounts: + res = resultscounts[qid] + else: + res = 0 + comparison.append((qid, res, gold)) + return comparison + + +topnodequery = './/node[@cat="top"]' + + +def getexactresults(allmatches: MatchesDict) -> ExactResultsDict: + result: ExactResultsDict = defaultdict(list) + for (queryid, uttid) in allmatches: + matchresults = [] + wholeuttmatch = False + for (m, _) in allmatches[(queryid, uttid)]: + # @@hier de topnode opzoeken@@ + if m is None: + position = 0 + settings.LOGGER.error('None match found') + else: + topnodes = m.xpath(topnodequery) + if topnodes != []: + positionstr = getattval(topnodes[0], 'begin') + wholeuttmatch = True + else: + positionstr = getattval(m, 'begin') + wholeuttmatch = getattval(m, 'cat') == 'top' + try: + position = int(positionstr) + except ValueError: + position = 0 + settings.LOGGER.error('getexactresults ValueError') + else: + if not wholeuttmatch: + position += 1 + matchresults.append((uttid, position)) + result[queryid] += matchresults + return result + + +def adaptpositions(rawexactresults: ExactResultsDict, nodeendmap) -> ExactResultsDict: + newexactresults: ExactResultsDict = {} + for qid in rawexactresults: + newlist = [] + for (uttid, position) in rawexactresults[qid]: + newposition = getmarkposition(position, nodeendmap, uttid) + newtuple = (uttid, newposition) + newlist.append(newtuple) + newexactresults[qid] = newlist + return newexactresults + + +def passfilter(rawexactresults: ExactResultsDict, method: Method) -> ExactResultsDict: + """ + let only those through that satisfy the filter + :param rawexactresults: dictionary with ResultsKey as key and a Counter as value, exact results + :param method: Method object + :return: a filtered version of rawexactresults: results that pass the filter + """ +# exactresults: ExactResultsDict = defaultdict(list) # hiermee ontstaat een probleem: dictionary size changed in iteration + exactresults: ExactResultsDict = {} + queries = method.queries + for reskey in rawexactresults: + queryid = reskey[0] + query = queries[queryid] + queryfilter = query.filter + thefilter = method.defaultfilter if queryfilter is None or queryfilter == '' else str2functionmap[ + queryfilter] + exactresults[reskey] = [r for r in rawexactresults[reskey] if reskey in rawexactresults and + thefilter(query, rawexactresults, r)] + return exactresults + + +def getmaxsamplesizeuttidsandcutoff(allresults: AllResults) -> Tuple[List[UttId], int, Position]: + cutoffpoint = None + words = getallrealwords(allresults) + cumwordcount = 0 + wordcounts: Dict[UttId, Tuple[int, int, int]] = {} + uttidlist = [] + for uttid in allresults.allutts: + basewordcount = sum(words[uttid].values()) + ignorewordcount = 0 # getignorewordcount(allresults, uttid) + wordcount = basewordcount - ignorewordcount + wordcounts[uttid] = (basewordcount, ignorewordcount, wordcount) + uttidlist.append(uttid) + cumwordcount += wordcount + result = (uttidlist, cumwordcount, cutoffpoint) + return result + + +def getsamplesizefunction(methodname: MethodName) -> Callable: + if methodname in astamethods: + result = getastamaxsamplesizeuttidsandcutoff + elif methodname in tarspmethods: + # @@to be implemented + result = getmaxsamplesizeuttidsandcutoff + elif methodname in stapmethods: + # @@to be implemented + result = getmaxsamplesizeuttidsandcutoff + return result + + +# defaulttarsp = r"TARSP Index Current.xlsx" +defaulttarsp = supported_methods[tarsp] + + +def main(): + + parser = OptionParser() + parser.add_option("-f", "--file", dest="infilename", + help="Treebank File to be analysed") + parser.add_option("-m", "--method", dest="methodname", + help="Name of the method or (for backwards compatibility) " + "file containing definition of assessment method (SAM)") + parser.add_option("-a", "--anno", dest="annotationfilename", + help="SASTA Annotation Format File containing annotations to derive a reference") + parser.add_option("-g", "--gold", dest="goldfilename", + help="File containing a gold reference in SASTA Reference Format") + parser.add_option("-c", "--goldcounts", dest="goldcountsfilename", + help="File containing gold reference counts in SASTA Counts Reference Format") + parser.add_option("-p", "--plat", dest="platinuminfilename", + help="File containing a platinum reference in SASTA Reference Format") + parser.add_option("-i", "--impl", dest="includeimplies", action="store_true", + help="Use the implies column of the method", default=False) + parser.add_option("-l", "--log", dest="logfilename", + help="File for logging") + parser.add_option("--corr", dest="corr", default='n', + help="0=No correction; 1=correction with 1 alternative; " + "n=correction with multiple alternatives (default) ") + parser.add_option("--mf", "--mfile", dest="methodfilename", + help="File containing definition of assessment method (SAM)") + + (options, args) = parser.parse_args() + + if options.corr is None: + options.corr = corrn + if options.corr not in validcorroptions: + validcorrstr = comma.join(validcorroptions) + settings.LOGGER.error( + 'Illegal value for -c/--corr option: only the following are allowed: {}'.format(validcorrstr)) + exit(1) + + # @ hier ook toestaan dat er een annotatiefile als input komt (.xlsx)-done + if options.infilename is None: # an XML file or an.xlsx file + settings.LOGGER.error( + 'Specify an input treebank file name to analyse (.xml) or the name of an annotationfile (.xlsx)') + exit(1) + elif not os.path.exists(options.infilename): + settings.LOGGER.error( + 'File {} not found. Aborting'.format(options.infilename)) + exit(1) + (inbase, inext) = os.path.splitext(options.infilename) + basepath, basefilename = os.path.split(options.infilename) + corepath, lastfolder = os.path.split(basepath) + corefilename, inext = os.path.splitext(basefilename) + + if lastfolder == intreebanksfolder: + intreebankinput = True + analysespath = os.path.join(corepath, 'analyses') + bronzepath = os.path.join(corepath, bronzefolder) + silverpath = os.path.join(corepath, silverfolder) + outtreebankspath = os.path.join(corepath, outtreebanksfolder) + resultspath = os.path.join(corepath, resultsfolder) + silverpermpath = os.path.join(corepath, silverpermfolder) + loggingpath = os.path.join(corepath, loggingfolder) + formspath = os.path.join(corepath, formsfolder) + + outpaths = [analysespath, outtreebankspath, resultspath, + silverpermpath, loggingpath, formspath, silverpath] + + for outpath in outpaths: + try: + os.makedirs(outpath) + except FileExistsError: + pass + else: + intreebankinput = False + analysespath = bronzepath = outtreebankspath = resultspath = loggingpath = formspath = basepath + silverpermpath = os.path.join(basepath, path2permfolder) + + if inext not in ['.xml', '.xlsx']: + settings.LOGGER.error( + 'Illegal input file type: must be a treebank (.xml) or an annotationfile (.xlsx)') + exit(1) + elif inext in ['.xlsx']: + annotationinput = True + else: + annotationinput = False + + if options.logfilename is None: + options.logfilename = os.path.join(loggingpath, corefilename + logext) + + options.methodname, options.methodfilename = treatmethod( + options.methodname, options.methodfilename) + + # Configure logging + handler = logging.FileHandler(options.logfilename, 'w', encoding='utf8') + logformat = '%(levelname)s:%(message)s' + formatter = logging.Formatter(logformat) + handler.setFormatter(formatter) + root_logger = settings.LOGGER + root_logger.addHandler(handler) + root_logger.setLevel(logging.INFO) + settings.LOGGER.info('Start of logging') + + if options.annotationfilename is not None and options.goldcountsfilename is not None: + settings.LOGGER.info( + 'Annotation file and Gold counts file found; gold counts file ignored') + elif options.goldfilename is not None and options.goldcountsfilename is not None: + settings.LOGGER.info( + 'Gold Reference file and Gold counts file found; gold counts file ignored') + + # this is not needed anymore because of treatmethod + # if options.methodfilename is None: # an xslx file + # options.methodfilename = defaulttarsp + if options.annotationfilename is None: # an xlsx file + options.annotationfilename = os.path.join( + bronzepath, corefilename + bronzesuffix + xlsxext) + if options.platinuminfilename is None: + if intreebankinput: + options.platinuminfilename = os.path.join( + silverpath, corefilename + platinumeditedsuffix + txtext) + else: + options.platinuminfilename = inbase + platinumeditedsuffix + txtext + + if options.goldfilename is not None and options.annotationfilename is not None: + settings.LOGGER.info( + 'annotationfile and goldfile specified. Annotationfile will be used.') + + if options.goldfilename is None: + if intreebankinput: + options.goldfilename = os.path.join( + bronzepath, corefilename + ".gold" + ".tsv" + ".txt") + else: + options.goldfilename = inbase + ".gold" + ".tsv" + ".txt" + if options.goldcountsfilename is None: + if intreebankinput: + options.goldcountsfilename = os.path.join( + bronzepath, corefilename + ".goldcounts" + xlsxext) + else: + options.goldcountsfilename = inbase + ".goldcounts" + xlsxext + + # adapted this so that the method is read in directly as a Method object + # (queries, item2idmap, altcodes, postorformquerylist) = read_method(options.methodname, options.methodfilename) + # defaultfilter = defaultfilters[options.methodname] + # themethod = Method(options.methodname, queries, item2idmap, altcodes, postorformquerylist, + # options.methodfilename, defaultfilter) + themethod = read_method(options.methodname, options.methodfilename) + + # print('annotationfilename=', options.annotationfilename, file=sys.stderr ) + + # read the annotation reference file if available, otherwise the gold file, otherwise quit + goldscores = {} + if options.annotationfilename != '' and os.path.exists(options.annotationfilename): + allannutts, richexactgoldscores = get_golddata(options.annotationfilename, themethod.item2idmap, + themethod.altcodes, themethod.queries, options.includeimplies) + annuttcount = len(allannutts) + exactgoldscores = richscores2scores(richexactgoldscores) + richgoldscores = richexact2global(richexactgoldscores) + goldscores = richscores2scores(richgoldscores) + goldcounts = scores2counts(goldscores) + goldcountfilename = options.annotationfilename + ".goldcount.tsv.txt" + goldcountfile = open(goldcountfilename, 'w', encoding='utf8') + for el in goldcounts: + print(el, goldcounts[el], sep=tab, file=goldcountfile) + goldcountfile.close() + reffilename = options.annotationfilename + elif options.goldfilename != '' and os.path.exists(options.goldfilename): + goldscores = read_referencefile(options.goldfilename, logfile) + goldcounts = scores2counts(goldscores) + reffilename = options.goldfilename + elif options.goldcountsfilename != '' and os.path.exists(options.goldcountsfilename): + goldcounts = get_goldcounts(options.goldcountsfilename) + if goldcounts == {}: + settings.LOGGER.error('No gold counts found. Aborting') + exit(-1) + else: + reffilename = options.goldcountsfilename + else: + settings.LOGGER.error( + 'Neither an annotationfile nor a goldfile, nor a gold count file specified. Aborting') + exit(1) + + # rawcoreresults = {} + # exact = True + rawexactresults: ExactResultsDict = {} + + # @dit aanpassen , vooral de message-done + if not os.path.exists(options.infilename): + settings.LOGGER.error( + 'Input treebank or annotationfile {} not found. Aborting'.format(options.infilename)) + exit(1) + + # gather remarks on results of earlier runs, write them to a perm_file and adapt the silverscore file + + # (pathname, barefilename) = os.path.split(options.infilename) + # (base, ext) = os.path.splitext(barefilename) + # (fullbase, _) = os.path.splitext(options.infilename) + # permpath = os.path.join(pathname, path2permfolder) + + # pathname = basepath + # barefilename = basefilename + base = corefilename + ext = inext + permpath = silverpermpath + fullbase = inbase + + try: + os.makedirs(permpath) + except FileExistsError: + pass + + perm_silverfilename = permprefix + corefilename + '.xlsx' + perm_silverfullname = os.path.join(permpath, perm_silverfilename) + # + platinumcheckeditedfullname = os.path.join( + resultspath, corefilename + platinumcheckeditedsuffix + '.xlsx') + + platinumoutfilename = os.path.join( + resultspath, corefilename + platinumsuffix + txtext) + platinumcheckfilename = os.path.join( + resultspath, corefilename + platinumchecksuffix + txtext) + silvercheckfilename = os.path.join( + resultspath, corefilename + platinumchecksuffix + '.xlsx') + + (platbase, platext) = os.path.splitext(platinumcheckfilename) + platinumcheckxlfullname = platbase + '.xlsx' + + silverannotationsdict = getsilverannotations(perm_silverfullname, platinumcheckeditedfullname, + platinumcheckxlfullname, silvercheckfilename, + platinumoutfilename, options.platinuminfilename, richgoldscores) + + analysedtrees: List[SynTree] = [] + nodeendmap = {} + + # @vanaf nu gaat het om een treebank, dus hier een if statement toevoegen-done + if annotationinput: + allutts, richexactscores = get_golddata(options.infilename, themethod.item2idmap, altcodes, themethod.queries, + options.includeimplies) + uttcount = len(allutts) + exactresults = richscores2scores(richexactscores) + else: + tree = etree.parse(options.infilename) + origtreebank = tree.getroot() + if origtreebank.tag != 'treebank': + settings.LOGGER.error( + "Input treebank file does not contain a treebank element") + exit(-1) + allutts = {} + uttcount = 0 + # determine targets + targets = get_targets(origtreebank) + + # for tree in origtreebank: + # showtree(tree, 'voor fexplanations') + + # deal with final explanations + fexplanations = True + if fexplanations: + treebank1 = finalexplanation_adapttreebank(origtreebank) + else: + treebank1 = origtreebank + + # for tree in treebank1: + # showtree(tree, 'na fexplanations') + treebank, errordict, allorandalts = correcttreebank( + treebank1, targets, options.methodname, options.corr) + + # for tree in treebank: + # showtree(tree, 'na correcties') + + # create the new treebank + fulltreebank = etree.ElementTree(treebank) + newtreebankfullname = os.path.join( + outtreebankspath, corefilename + '_corrected' + '.xml') + fulltreebank.write(newtreebankfullname, encoding="UTF8", xml_declaration=False, + pretty_print=True) + + # create error file + errorreportfilename = os.path.join( + resultspath, corefilename + '_errorreport' + '.xlsx') + mkerrorreport(errordict, errorreportfilename) + + # create error logging + errorloggingfullname = os.path.join( + loggingpath, corefilename + '_errorlogging' + '.xlsx') + + allerrorrows: List[str] = [] + for orandalts in allorandalts: + if orandalts is not None: + allerrorrows += orandalts.OrigandAlts2rows(corefilename) + errorwb = mkworkbook(errorloggingfullname, [ + errorwbheader], allerrorrows, freeze_panes=(1, 1)) + errorwb.close() + + # analysedtrees consists of (uttid, syntree) pairs in the order in which they come in + analysedtrees: List[(UttId, SynTree)] = [] + for syntree in treebank: + temputtid = getuttid(syntree) + uttcount += 1 + # if temputtid == '118': + # showtree(syntree, 'tree 118') + # settings.LOGGER.error('uttcount={}'.format(uttcount)) + mustbedone = get_mustbedone(syntree, targets) + if mustbedone: + # uttid = getuttid(syntree) + # analysedtrees consists of (uttid, syntree) pairs in order + uttid = getxselseuttid(syntree) + analysedtrees.append((uttid, syntree)) + + doprequeries(syntree, themethod.queries, + rawexactresults, allmatches) + docorequeries(syntree, themethod.queries, + rawexactresults, allmatches) + + # showtree(syntree) + if uttid in nodeendmap: + settings.LOGGER.error( + 'Duplicate uttid in sample: {}'.format(uttid)) + nodeendmap[uttid] = getnodeendmap(syntree) + + # uttno = getuttno(syntree) + # allutts[uttno] = getyield(syntree) + allutts[uttid] = getyield(syntree) + + # determine exactresults and apply the filter to catch interdependencies between prequeries and corequeries + # rawexactresults = getexactresults(allmatches) + rawexactresults2 = passfilter(rawexactresults, themethod) + exactresults = adaptpositions(rawexactresults2, nodeendmap) + + # pas hier de allutts en de rawexactresults2 aan om expansies te ontdoen, gebseerd op de nodeendmap + # @@to be implemented @@ of misschien in de loop hierboven al? + + # @ en vanaf hier kan het weer gemeenschappelijk worden; er met dus ook voor de annotatiefile een exactresults opgeleverd worden + # @d epostfunctions for lemma's etc moeten mogelijk wel aangepast worden + + # adapt the exactresults positions to the reference + + coreresults = exact2results(exactresults) + + platinuminfilefound = False + if os.path.exists(options.platinuminfilename): + platinuminfilefound = True + platinumresults: Dict[ResultsKey, Counter] = read_referencefile( + options.platinuminfilename, logfile) + checkplatinum(goldscores, platinumresults, themethod.queries) + else: + settings.LOGGER.info('Platinum file {} not found.'.format( + options.platinuminfilename)) + platinumresults = {} + + # platinumoutfilename = base + platinumsuffix + txtext + platinumoutfile = open(platinumoutfilename, 'w', encoding='utf8') + # platinumcheckfilename = base + platinumchecksuffix + txtext + platinumcheckfile = open(platinumcheckfilename, 'w', encoding='utf8') + + postresults: Dict[ResultsKey, Any] = {} + allresults = AllResults(uttcount, coreresults, exactresults, postresults, allmatches, options.infilename, analysedtrees, + allutts, annotationinput) + + samplesizefunction = getsamplesizefunction(options.methodname) + samplesizetuple: SampleSizeTuple = samplesizefunction(allresults) + + postquerylist: List[QId] = [ + q for q in themethod.postquerylist if themethod.queries[q].process == post_process] + formquerylist: List[QId] = [ + q for q in themethod.postquerylist if themethod.queries[q].process == form_process] + + # we assume the reduction must be done before the postqueries + allresults = reduceallresults( + allresults, samplesizetuple, options.methodname) + + # bronze reduction + exactgoldscores = reduceexactgoldscores( + exactgoldscores, samplesizetuple, options.methodname) # ongoing + goldscores = exact2results(exactgoldscores) # ongoing + goldcounts = scores2counts(goldscores) + + # silver / platinumreduction + platinumresults: Dict[ResultsKey, Counter] = reduceresults( + platinumresults, samplesizetuple, options.methodname) + + dopostqueries(allresults, postquerylist, themethod.queries) + + dopostqueries(allresults, formquerylist, themethod.queries) + + (base, ext) = os.path.splitext(options.infilename) + outputfullname = os.path.join( + resultspath, corefilename + "_analysis" + tsvext + txtext) + outfile = open(outputfullname, 'w', encoding='utf8') + + outxlsx = os.path.join(resultspath, corefilename + "_analysis" + xlsxext) + outworkbook = xlsxwriter.Workbook(outxlsx, {"strings_to_numbers": True}) + outworksheet = outworkbook.add_worksheet() + outstartrow = 0 + outstartcol = 0 + outrowctr = outstartrow + outworksheet.freeze_panes('E2') + + countcomparisonfilename = os.path.join( + resultspath, corefilename + '_countcomparison' + '.tsv' + '.txt') + + # print the invalid queries + for q in invalidqueries: + settings.LOGGER.error("{}: {}: <{}>".format( + q, invalidqueries[q], themethod.queries[q].query)) + + # print the header + print(resultsheaderstring, file=outfile) + outworksheet.write_row(outrowctr, outstartcol, resultsheaderrow) + outrowctr += 1 + + # print the platinumheader + print(platinumheaderstring, file=platinumoutfile) + + # print the results + qcount = 0 + invalidqcount = 0 + undefinedqcount = 0 + results: Dict[ResultsKey, ResultsCounter] = allresults.coreresults + # exactresults = getexactresults(allmatches) + exact = True + + pcheaders = [['User1', 'User2', 'User3', 'MoreorLess', 'qid', + 'cat', 'subcat', 'item', 'uttid', 'pos', 'utt', 'origutt']] + allrows = [] + + for reskey in results: + sortedgolduttlist: List[str] = [] + platinumoutresults: Dict[UttId, int] = Counter() + platinumoutresultsstring = '' + qcount += 1 + theresults = results[reskey] + resultstr = counter2liststr(theresults) + if reskey in goldscores: + # (goldlevel, golditem, goldcounter) = goldscores[queryid] + goldcounter = goldscores[reskey] + goldcount = sumfreq(goldcounter) + sortedgolduttstr = counter2liststr(goldcounter) + else: + goldcount = 0 + sortedgolduttstr = '' + queryid = reskey[0] + thequery = themethod.queries[queryid] + if query_exists(thequery): + if queryid not in invalidqueries: + qex = 'yes' + else: + qex = 'invalid' + invalidqcount += 1 + else: + qex = 'no' + undefinedqcount += 1 + if query_exists(thequery) and queryid not in invalidqueries: + # print(queryid, file=logfile) + if reskey in goldscores: + goldcounter = goldscores[reskey] + else: + goldcounter = Counter() + (recall, precision, f1score) = getscores(theresults, goldcounter) + liststargoldstr = counter2liststr(theresults & goldcounter) + goldminustheresults = goldcounter - theresults + goldminusliststr = counter2liststr(goldminustheresults) + theresultsminusgold = theresults - goldcounter + listminusgoldstr = counter2liststr(theresultsminusgold) + if platinuminfilefound and reskey in platinumresults: + theplatinumresults = platinumresults[reskey] + sortedplatinumliststr = counter2liststr(theplatinumresults) + liststarplatinumstr = counter2liststr( + theresults & theplatinumresults) + platinumminusliststr = counter2liststr( + theplatinumresults - theresults) + listminusplatinumliststr = counter2liststr( + theresults - theplatinumresults) + (platinumrecall, platinumprecision, platinumf1score) = getscores( + theresults, theplatinumresults) + + goldstarplatinumstr = counter2liststr( + goldcounter & theplatinumresults) + platinumminusgoldstr = counter2liststr( + theplatinumresults - goldcounter) + goldminusplatinumstr = counter2liststr( + goldcounter - theplatinumresults) + (gprecall, gpprecision, gpf1score) = getscores( + goldcounter, theplatinumresults) + else: + sortedplatinumliststr, liststarplatinumliststr, platinumminusliststr, \ + listminusplatinumliststr = '', '', '', '' + (platinumrecall, platinumprecision, platinumf1score) = (na, na, na) + + goldstarplatinumstr, platinumminusgoldstr, goldminusplatinumstr = '', '', '' + (gprecall, gpprecision, gpf1score) = (na, na, na) + + else: + goldcounter = Counter() + (recall, precision, f1score) = (na, na, na) + liststargoldstr, goldminusliststr, listminusgoldstr = '', '', '' + sortedplatinumliststr, liststarplatinumliststr, platinumminusliststr, listminusplatinumliststr = '', '', '', '' + (platinumrecall, platinumprecision, platinumf1score) = (na, na, na) + theresultsminusgold = {} + goldminustheresults = {} + goldstarplatinumstr, platinumminusgoldstr, goldminusplatinumstr = '', '', '' + (gprecall, gpprecision, gpf1score) = (na, na, na) + + platinumoutresults = theresults | goldcounter + platinumoutresultsstring = counter2liststr(platinumoutresults) + reskeystr = showreskey(reskey) + + queryinforow = [reskeystr, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item] + queryresultsrow = [str(sumfreq(theresults)), resultstr, str( + goldcount), sortedgolduttstr, qex] + queryRGscorerow = [sf(recall), sf(precision), sf( + f1score), liststargoldstr, goldminusliststr, listminusgoldstr] + queryRPscorerow = [sortedplatinumliststr, sf(platinumrecall), sf(platinumprecision), sf(platinumf1score), + platinumminusliststr, listminusplatinumliststr] + queryGPscorerow = [sf(gprecall), sf(gpprecision), sf(gpf1score), goldstarplatinumstr, platinumminusgoldstr, + goldminusplatinumstr] + + fullresultrow = queryinforow + queryresultsrow + \ + queryRGscorerow + queryRPscorerow + queryGPscorerow + print(tab.join(fullresultrow), file=outfile) + outworksheet.write_row(outrowctr, outstartcol, fullresultrow) + outrowctr += 1 + + platinumrow = [reskeystr, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item, platinumoutresultsstring, listminusgoldstr, '', ''] + + print(tab.join(platinumrow), file=platinumoutfile) + + # @with an annotationfile allmatches is empty so we need to redefine newrows (exactmismatches) markedutt (getmarkedutt)-done + if exact: + newrows = exactmismatches(reskey, themethod.queries, exactresults, exactgoldscores, allmatches, allutts, + platinumcheckfile, silverannotationsdict, annotationinput) + allrows += newrows + else: + if theresultsminusgold != {}: + print('More examples', file=platinumcheckfile) + for uttid in theresultsminusgold: + if (reskey, uttid) in allmatches: + for (m, syntree) in allmatches[(reskey, uttid)]: + markedutt = getmarkedutt(m, syntree) + platinumcheckrow1 = [reskey, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item, uttid, markedutt] + print(tab.join(platinumcheckrow1), + file=platinumcheckfile) + + if goldminustheresults != {}: + print('Missed examples', file=platinumcheckfile) + for uttid in goldminustheresults: + if uttid in allutts: + uttstr = space.join(allutts[uttid]) + else: + settings.LOGGER.warning( + 'uttid {} not in allutts'.format(uttid)) + platinumcheckrow2 = [reskey, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item, uttid, uttstr] + print(tab.join(platinumcheckrow2), file=platinumcheckfile) + + # platinumcheckfullname = platinumcheckfile.name + # (base, ext) = os.path.splitext(platinumcheckfilename) + # platinumcheckxlfullname = base + '.xlsx' + # add missed literal hits + literalmissedrows = literalmissedmatches(themethod.queries, exactresults, exactgoldscores, allmatches, allutts, + platinumcheckfile, silverannotationsdict, annotationinput) + allrows += literalmissedrows + + wb = mkworkbook(platinumcheckxlfullname, pcheaders, + allrows, freeze_panes=(1, 9)) + wb.close() + + # compute the gold postresults + goldpostresults: Dict[UttId, int] = {} + goldcounters: Dict[QId, ResultsCounter] = {} + allgoldmatches: MatchesDict = {} + for reskey in goldscores: + goldcounters[reskey] = goldscores[reskey] + allgoldresults = AllResults(uttcount, goldcounters, exactgoldscores, goldpostresults, allgoldmatches, reffilename, [], + allannutts, annotationinput) + dopostqueries(allgoldresults, postquerylist, themethod.queries) + + # compute the platinum postresults + + platinumpostresults: Dict[ResultsKey, Any] = {} + + # print the postresults + thepostresults = allresults.postresults + for queryid in postquerylist: + resultposval = str(getpostval(queryid, thepostresults)) + goldpostval = str(getpostval(queryid, goldpostresults)) + platinumpostval = str(getpostval(queryid, platinumpostresults)) + if themethod.queries[queryid].query != '': + qex = 'yes' + else: + qex = 'no' + + queryreskey = mkresultskey(queryid) + queryreskeystr = showreskey(queryreskey) + queryinforow = [queryreskeystr, themethod.queries[queryid].cat, themethod.queries[queryid].subcat, + themethod.queries[queryid].item] + queryresultsrow = ['', resultposval, '', goldpostval, + qex] + erow(6) + [platinumpostval] + erow(11) + + postrow = queryinforow + queryresultsrow + postrowstring = tab.join(queryinforow + queryresultsrow) + print(postrowstring, sep=tab, file=outfile) + outworksheet.write_row(outrowctr, outstartcol, postrow) + outrowctr += 1 + + # gather overall results, 2 cases: (1)for defined original measure queries only; (2) for all original measure queries + + overallmethods = [(1, 'Overall (defined pre and core queries in the profile)', + lambda x: is_preorcore(x) and query_exists(x) and query_inform(x)), + (2, 'Overall (all pre and core queries in the profile)', + lambda x: is_preorcore(x) and query_inform(x)), + (3, 'Overall (original pre and core measures with defined queries only)', + lambda x: is_preorcore(x) and query_exists(x)), + (4, 'Overall (all original pre and core measures)', lambda x: is_preorcore(x))] + + logheader = ['datetime', 'treebank', 'scorenr,' 'R', 'P', 'F1', 'P-R', 'P-P', 'P-F1', 'GP-R', 'GP-P', 'GP-F1', 'ref', + 'method'] + logname = 'sastalog.txt' + logpath = r'.' + logfullname = os.path.join(logpath, logname) + biglogfile = open(logfullname, 'a', encoding='utf8') + + exactlynow = datetime.datetime.now() + now = exactlynow.replace(microsecond=0).isoformat() + + for (ctr, message, queryfunction) in overallmethods: + # gather resultscount + resultscount = 0 + for reskey in results: + queryid = reskey[0] + thequery = themethod.queries[queryid] + if thequery.original and queryfunction(thequery): + resultscount += sum(results[reskey].values()) + + # gather goldcount + goldcount = 0 + for reskey in goldscores: + queryid = reskey[0] + thequery = themethod.queries[queryid] + goldcounter = goldscores[reskey] + if thequery.original and queryfunction(thequery): + goldcount += sum(goldcounter.values()) + + # gather platinumcount + platinumcount = 0 + for reskey in platinumresults: + queryid = reskey[0] + if queryid in themethod.queries: + thequery = themethod.queries[queryid] + if thequery.original and queryfunction(thequery): + platinumcount += sum(platinumresults[reskey].values()) + else: + settings.LOGGER.warning( + f'Query {reskey} found in platinumresults but {queryid} not in queries') + + # resultsgoldintersectiocount + resultsgoldintersectioncount = 0 + for reskey in results: + queryid = reskey[0] + thequery = themethod.queries[queryid] + if thequery.original and queryfunction(thequery): + if reskey in goldscores: + goldcounter = goldscores[reskey] + intersection = results[reskey] & goldcounter + resultsgoldintersectioncount += sum(intersection.values()) + else: + pass + # settings.LOGGER.warning(f'Query {reskey} found in results but not in goldscores') + + # resultsplatinumintersectioncount + resultsplatinumintersectioncount = 0 + for reskey in results: + queryid = reskey[0] + thequery = themethod.queries[queryid] + if thequery.original and queryfunction(thequery): + if reskey in platinumresults: + intersection = results[reskey] & platinumresults[reskey] + resultsplatinumintersectioncount += sum( + intersection.values()) + else: + pass + # settings.LOGGER.warning('queryid {} not in platinumresults'.format(queryid)) + + # goldplatinumintersectioncount + goldplatinumintersectioncount = 0 + for reskey in platinumresults: + queryid = reskey[0] + if queryid in themethod.queries: + thequery = themethod.queries[queryid] + if thequery.original and queryfunction(thequery): + if reskey in goldscores: + goldcounter = goldscores[reskey] + intersection = goldcounter & platinumresults[reskey] + goldplatinumintersectioncount += sum( + intersection.values()) + else: + pass + # settings.LOGGER.warning('Query {} in platinumresults but not in goldscores'.format(queryid)) + else: + settings.LOGGER.warning( + f'Query {reskey} in platinumresults but {queryid} not in queries') + + (recall, precision, f1score) = getevalscores( + resultscount, goldcount, resultsgoldintersectioncount) + (platinumrecall, platinumprecision, platinumf1score) = getevalscores(resultscount, platinumcount, + resultsplatinumintersectioncount) + (gprecall, gpprecision, gpf1score) = getevalscores( + goldcount, platinumcount, goldplatinumintersectioncount) + + overallrow = ['', '', '', message, '', '', '', '', '', sf(recall), sf(precision), sf(f1score), + '', '', '', '', sf(platinumrecall), sf( + platinumprecision), sf(platinumf1score), '', '', + sf(gprecall), sf(gpprecision), sf(gpf1score), '', '', ''] + + print(tab.join(overallrow), file=outfile) + outworksheet.write_row(outrowctr, outstartcol, overallrow) + outrowctr += 1 + + logrow = [now, options.infilename, str(ctr), sf(recall), sf(precision), sf(f1score), + sf(platinumrecall), sf(platinumprecision), sf(platinumf1score), + sf(gprecall), sf(gpprecision), sf(gpf1score), + reffilename, options.methodfilename] + + print(tab.join(logrow), file=biglogfile) + + biglogfile.close() + outfile.close() + outworkbook.close() + platinumoutfile.close() + platinumcheckfile.close() + + resultscounts = scores2counts(results) + + countcomparison = get_comparison( + resultscounts, goldcounts, themethod.queries) + if countcomparison != []: + countcomparisonfile = open( + countcomparisonfilename, 'w', encoding='utf8') + ccheader = ['Measure', 'result', 'gold', 'diff'] + ccheaderstr = tab.join(ccheader) + print(ccheaderstr, file=countcomparisonfile) + for (q, r, g) in countcomparison: + if not (r == 0 and g == 0): + print(q, r, g, r - g, sep=tab, file=countcomparisonfile) + + definedqcount = qcount - undefinedqcount + + (definedfornonemptygoldscore, undefinedqueries) = get_definedfornonemptygold( + goldscores, themethod.queries) + (definedfornonemptygoldcounts, undefinedqueries) = get_definedfornonemptygold( + goldcounts, themethod.queries) + + lgoldscores = len(goldscores) + + if lgoldscores != 0: + percentagecompletion1 = definedfornonemptygoldscore / lgoldscores * 100 + percentagecompletion1str = '{0:.1f}%'.format(percentagecompletion1) + else: + percentagecompletion1str = 'N/A' + + lgoldcounts = len(goldcounts) + if lgoldcounts != 0: + percentagecompletion2 = definedfornonemptygoldcounts / lgoldcounts * 100 + percentagecompletion2str = '{0:.1f}%'.format(percentagecompletion2) + else: + percentagecompletion2str = 'N/A' + + finalmessagetemplate1 = '{} measures, {} undefined, {} defined, of which {} invalid.' + finalmessagetemplate2 = '{} measures defined for a non empty gold score out of {} ({}).' + finalmessagetemplate3 = '{} measures defined for a non empty gold count out of {} ({}).' + print(finalmessagetemplate1.format( + qcount, undefinedqcount, definedqcount, invalidqcount)) + print(finalmessagetemplate2.format( + definedfornonemptygoldscore, lgoldscores, percentagecompletion1str)) + print(finalmessagetemplate3.format( + definedfornonemptygoldcounts, lgoldcounts, percentagecompletion2str)) + print('Undefined queries:', undefinedqueries) + settings.LOGGER.info("Done!") + + +if __name__ == '__main__': + main() diff --git a/src/sastadev/normalise_lemma.py b/src/sastadev/normalise_lemma.py new file mode 100644 index 0000000..77b6e2b --- /dev/null +++ b/src/sastadev/normalise_lemma.py @@ -0,0 +1,528 @@ +''' +This module normalises Alpino lemmata for noun compounds. The lemma for a noun compound in Alpino is a sequence of +lemma for the compound parts separated by underscores. + +Example: word = verkeerslichtjes. Alpino lemma = verkeer_licht. +But for many applications we need the 'normal' lemma for such as compound, i.e. +for *verkeerslichtje* that is *verkeersicht*. This is achieved by the function *normalizelemma* + +The function has been tested against all noun compounds in Lassy-Klein + +''' +# @TODO@ +# () in woorden +# 1 hyphen te veel/te weinig +# splitsen in test, eigenlijke module, stringfuncties verplaatsen +# documentatie + + +import re +from typing import List + +from sastadev import readcsv, xlsx + +hyphen = '-' +tab = '\t' +cmpsep = '_' +c = r'[bcdfghjklmnpqrstvwxz]' +vr = 'aeiou' +v = fr'[{vr}]' +notv = fr'[^{vr}]' +bv = f'({v})' +bc = f'({c})' +df = r'ai|au|ei|eu|oe|oi|ou|ui' + +bdf = f'({df})' + +vowels = 'AEIOUYaeiouy' +aigu = 'ÁÉÍÓÚÝáéíóúý' +grave = 'ÀÈÌÒÙ\u1ef2àèìòù\u1ef3' +trema = 'ÄËÏÖÜ\u0178äëïöüÿ' +tilde = 'Ã\u1EBC\u0128Õ\u0168\u1EF8ã\u1EBD\u0129õ\u0169\u1EF9' +circumflex = 'ÂÊÎÔÛ\u0176âêîôû\u0177' + + +diacritics = aigu + grave + trema + tilde + circumflex +undiacritics = 5 * vowels + + +testset = [('water_pok', 'waterpokken'), + ('zee_hond', 'zeehondje'), + ('rijk_museum', 'rijksmusea'), + ('klap_roos', 'klaprozen'), + ('maan_bol', 'maanbolletje'), + ('linde_laan', 'lindelanen'), + ('ijs_verkoper', 'ijsjesverkopers'), + ('verkeer_licht', 'verkeerslichtje'), + ('hoofd_stad', 'hoofdsteden'), + ('bewind_man', 'bewindslui'), + ('bewind_man', 'bewindslieden'), + ('bewind_man', 'bewindsmannen'), + ('klein_kind', 'kleinkinderen'), + ('offer_lam', 'offerlammeren'), + ('beleid_politicus', 'beleidspolitici'), + ('wereld_zee', 'wereldzeeën') + ] + + +def iscompound(lemma: str) -> bool: + result = cmpsep in lemma + return result + + +def apply(regex, sub, rawform, lemma, lemmatest=False, keeplastsep=False): + + if not lemmatest and not iscompound(lemma): + return lemma + else: + # form = rawform.lower() if all([c.isupper() for c in rawform]) else rawform + form = rawform + candlemma = regex.sub(sub, form) + lemmaparts = lemma.split(cmpsep) + lastpart = lemmaparts[-1] + if candlemma.endswith(lastpart): + if keeplastsep: + llastpart = len(lastpart) + result = candlemma[: -llastpart] + \ + cmpsep + candlemma[-llastpart:] + return result + else: + return candlemma + elif candlemma.endswith(lastpart.lower()): # poepchinees v. poep_Chinees + sep = cmpsep if keeplastsep else '' + return candlemma[:-len(lastpart)] + sep + lastpart.lower() + else: + lemmacorrs = lemma_alt(lastpart) + for lemmacorr in lemmacorrs: + if candlemma.endswith(lemmacorr): + sep = cmpsep if keeplastsep else '' + resultlemma = candlemma[:-len(lemmacorr)] + sep + lastpart + return resultlemma + + return None + +# het gelid de gelederen +# het lid de leden +# het schip de schepen +# de smid de smeden +# de gelegenheid de gelegenheden +# de overheid de overheden +# de moeilijkheid de moeilijkheden +# de aanwezigheid de aanwezigheden +# scheepjes + +# koe - koeien +# vlo - vlooien +# uitgang -nen (naast andere mogelijkheden) +# lende - lendenen (ook: lenden). Dit woord komt oorspronkelijk van het archaïsche woord lenden, waarvan de -n uit de officiële spelling gehaald is vanwege het verdwijnen van die -n in de spreektaal. +# uitgang -iën met accentwisseling (in archaïsch taalgebruik) +# kleinood - kleinodiën (ook: kleinoden) +# sieraad - sieradiën (ook: sieraden) +# uitgang -en +# epos - epen (ook: epossen) +# genius - geniën (NB. genie - genieën) +# +# politicus - politici +# +# been - beenderen (botten) (ook: benen (ledematen)) +# blad - bladeren (van planten) (ook: bladen (papier)) +# ei - eieren +# gelid - gelederen +# gemoed - gemoederen +# goed - goederen +# hoen - hoenderen +# kalf - kalveren +# kind - kinderen +# kleed - kle(de)ren (kledingstukken) (ook: kleden (vloerbedekking)) +# lam - lammeren +# lied - liederen +# rad - raderen +# rund - runderen +# volk - volkeren (naties) (ook: volken (populaties)) +# +# politica - politica's +# politicus - politici (zowel mannen als vrouwen; zie medicus & musicus) +# medicus - medici +# musicus - musici +# genus - genera +# index - indices (indexen) +# tempus - tempora +# plurale tantum - pluralia tantum +# singulare tantum - singularia tantum +# opus - opera (opussen) +# casus - casus (casussen) +# collega - (vroeger: collegae) collega's +# medium - media (medium (persoon) - mediums) +# museum - musea (museums) +# jubileum - jubilea (jubileums) +# datum - data (datums) +# decennium - decennia (decenniën) +# preses - presides (presessen) +# quaestor - quaestores (quaestors, quaestoren) +# quaestrix - qaestrices +# matrix - matrices (matrixen) +# +# bewindsman - bewindslieden, bewindslui, bewindsmannen +# politieman - politielui, politielieden, politiemannen +# timmerman - timmerlui, timmerlieden, timmermannen +# tuinman - tuinlui, tuinlieden, tuinmannen +# vakman - vaklui, vaklieden, vakmannen +# visserman - visserlui, visserlieden, vissermannen +# voddenman - voddenlui, voddenlieden, voddenmannen +# voerman - voerlui, voerlieden, voermannen +# vogelman - vogellui, vogellieden, vogelmannen +# zeeman - zeelui, zeelieden, zeemannen + + +patterns = [ + # listed exceptions + (r'kleertjes?$', 'kleed'), + (r'kleren$', 'kleed'), + (r'klederen$', 'kleed'), + (r'steden$', 'stad'), + (r'jongetjes?$', 'jongen'), + (r'excuses$', 'excuus'), + # e/i alternatiom + (fr'{bc}e{bc}en$', r'\1i\2'), # schepen - schip, leden -lid + (fr'{bc}e{bc}eren$', r'\1i\2'), # gelederen - gelid + (fr'ee{bc}jes?$', r'i\1'), # scheepje - schip; scheepjes - schip + # dimunitives + (r'tjes?$', r''), # keutje, keutjes + (r'pjes?$', r''), # boompje, boompjes + (r'kjes?$', r'g'), # koninkje, koningkjes + (r'jes?$', r''), # kapje, kapjes + (r'etjes?$', r''), # tekeningetje, tekeningetjes + (r"'tjes?$", ""), # auto'tje, auto'tjes + (fr'{bv}\1tjes?', r'\1'), # autootje(s) - auto + (fr'{bc}\1etjes?$', r'\1'), # bolletje, bolletjes + (fr'{bc}\1ekes?$', r'\1'), # bolleke, bollekes + # vaatje -> vat, gaatje -> gat, paadje -> pad + (fr'{bv}\1([dt])jes?$', r'\1\2'), + (r'ientjes?$', 'ine'), # machientje(s) -> machine + (r'ietjes?$', 'y'), # babietje(s) -> baby + # plural + (fr'{bc}\1en?$', r'\1'), # bakken (ter) wille + (r'en?$', ''), # leeuwen, banden, woorden, dienste + (r'en$', 'e'), # ribben - ribbe, + (r'en$', 'os'), # epen - epos + (r'a$', r'um'), # musea + (r'a$', 'on'), # lexica - lexicon + (r'zen?$', r's'), # vaarzen, muizen, huize + (r'ven?$', r'f'), # larven, duiven, halve + (fr'{bv}zen?$', r'\1\1s'), # vazen, loze, Genuezen + (fr'{bv}ven?$', r'\1\1f'), # raven, + (fr'{bc}ven?$', r'\1f'), # kalven, halve + (fr'{bc}zen?$', r'\1f'), # vaarzen, + (fr'{bc}veren$', r'\1f'), # kalveren + (fr'{bc}zeren$', r'\1f'), # ?? + (fr'{bv}{bc}en?$', r'\1\1\2'), # manen, Antillianen, rare, + (r'den', ''), # getijden, weiden + (r'iën$', 'ium'), # mitochondriën / mitochondrium + (r's$', ''), # appels, oudooms plural and genitive + (r"s'$", "s"), # genitive plural generaals', Hans' + (r"z'$", 'z'), # Chavez' + (r"sh'$", "sh"), # Bush' + (r"ce'$", 'ce'), # Prince' + (r"'s$", ""), # azalea's + (fr'{bdf}ien$', r'\1'), # koeien + (fr'{bv}\1ien$', r'\1'), # vlooien + (r'iën$', 'ie'), # provinciën + (r'ën$', ''), # zeeën genieën + (fr'{bc}{bv}{bc}iën$', r'\1\2\2\3'), # kleinodiën, sieradiën + (r'i$', 'us'), # politici + (r'era$', 'us'), # genera + (r'lui$', 'man'), # timmerman + (r'lieden$', 'man'), # timmerman + (r'mensen$', 'man'), # brandweermensen + (r'en$', 'man'), # Engelsen/Engelsman, Fransen, Fransman + (r'ices$', 'ex'), # indices + (r'ices$', 'ix'), # matrices + (r'heden$', 'heid'), # gelegenheden + (r'eren$', ''), # kinderen + (r'es$', 'is'), # bases -> basis + (r'ies$', 'y'), # babies -> baby + (fr'{bc}\1eren$', r'\1'), # lammeren + (r'deren$', ''), # hoenderen + (r'nen$', ''), # lendenen + (r'iën', 'ius'), # geniën - genius + ('ia$', 'e'), # singularia + ('ora$', 'us'), # tempora + ('ae$', 'a'), # collegae + ('es$', ''), # praetores + (r'ides$', 'es'), # presides + (r'i$', 'o'), # saldi + (r'sters?$', 'er'), # werkster(s) -> werker + (fr'{bv}\1{bc}sters?$', r'\1\2er'), # maakster(s) -> maker + (r'stertjes?$', 'er'), # werkstertje(s) -> werker + (fr'{bv}\1{bc}stertjes?$', r'\1\2er') # maakstertje(s) -> maker + +] + +spellingcorrections = [ + (fr'{bv}\1\1+{bc}({notv}|$)', r'\1\1\2\3'), # heeeeel -> heel + # heeeele -> hele + (fr'{bv}\1\1+{bc}{bv}', r'\1\2\3'), + +] + +subs = [(re.compile(pat), sub) for pat, sub in patterns] +spellsubs = [(re.compile(pat), sub) for pat, sub in spellingcorrections] + +lemma_alternatives = [('c', 'k'), # productie -> produktie + ('k', 'c'), # helikopter -< helicopter + ('eau', 'o'), # bureau -> buro] + ('pannenkoek', 'pannekoek')] +lemmasubs = [(re.compile(pat), sub) for pat, sub in lemma_alternatives] + + +def istitlecase(wrd: str) -> bool: + if wrd == '': + return False + elif wrd[0].isupper() and all([c.islower() for c in wrd[1:]]): + return True + else: + return False + + +def spellcorr(word: str) -> List[str]: + return spellcorr2(word, spellsubs) + + +def lemma_alt(lemma: str) -> List[str]: + return spellcorr2(lemma, lemmasubs) + + +def spellcorr2(word: str, spellsubs: list) -> List[str]: + results = [] + finalresults = [] + newword = word + for regex, repl in spellsubs: + if regex.search(newword): + newword2 = regex.sub(repl, newword, count=1) + results.append(newword2) + for wrd in results: + finalresults = spellcorr(wrd) + return finalresults + results + + +def longestcommonprefix(word1: str, word2: str) -> str: + result = '' + max = min(len(word1), len(word2)) + for c1, c2 in zip(word1[:max], word2[:max]): + if c1 == c2: + result += c1 + else: + return result + return result + + +def adaptcase(rawword: str, lemma: str) -> str: + result = '' + lcrawword = rawword.lower() + lclemma = lemma.lower() + cmnprefix = longestcommonprefix(lcrawword, lclemma) + prefixlen = len(cmnprefix) + conversion = [] + for lc, wc in zip(lemma[:prefixlen], rawword[:prefixlen]): + if lc.islower(): + newwc = wc.lower() + elif lc.isupper(): + newwc = wc.upper() + else: + newwc = wc + result += newwc + result += rawword[prefixlen:].lower() + return result + + +def adapt_diacritics(rawword: str, lemma: str) -> str: + result = '' + ddrawword = undiacritic(rawword.lower()) + ddlemma = undiacritic(lemma.lower()) + cmnprefix = longestcommonprefix(ddrawword, ddlemma) + prefixlen = len(cmnprefix) + conversion = [] + result = lemma[:prefixlen] + result += rawword[prefixlen:] + return result + + +def undiacritic(wrd: str) -> str: + result = '' + for ch in wrd: + try: + pos = diacritics.index(ch) + result += undiacritics[pos] + except ValueError: + result += ch + return result + + +def normaliselemma(rawword: str, lemma: str, lemmatest=False, keeplastsep=False) -> str: + rawwordparts = rawword.split(hyphen) + lemmaparts = lemma.split(hyphen) + if len(lemmaparts) != len(rawwordparts): + # print(f'Hyphen mismatch: {rawword} v. {lemma}') + result = normaliselemma_simple( + rawword, lemma, lemmatest=lemmatest, keeplastsep=keeplastsep) + else: + results = [] + for lm, wrd in zip(lemmaparts, rawwordparts): + newresultpart = normaliselemma_simple( + wrd, lm, lemmatest=lemmatest, keeplastsep=keeplastsep) + if newresultpart is not None: + results.append(newresultpart) + else: + # print(f'No lemma found for {wrd}') + results.append('') + result = hyphen.join(results) + return result + + +def normaliselemma_simple(rawword: str, lemma: str, lemmatest=False, keeplastsep=False) -> str: + result = None + + word = adaptcase(rawword, lemma) + word = adapt_diacritics(word, lemma) + + for regex, sub in subs: + if result is None: + result = apply(regex, sub, word, lemma, + lemmatest=lemmatest, keeplastsep=keeplastsep) + + if result is None: + altwords = spellcorr(word) + for regex, sub in subs: + for altword in altwords: + if result is None: + result = apply(regex, sub, altword, + lemma, lemmatest=lemmatest) + + return result + + +def treatitem(lemma, word, file=None, store=False): + cleanlemma = lemma.strip() + cleanword = word.strip() + newlemma = normaliselemma(cleanword, cleanlemma) + if file is None: + print(cleanword, cleanlemma, newlemma) + else: + print(cleanword, cleanlemma, newlemma, file=file) + + +if __name__ == '__main__': + + localtest = True + test1 = False + test2 = False + test3 = False + test4 = False # True + reftest = False # True + lemmatest = False # True + + if localtest: + alemma = 'staat_bos_beheer' # 'bewind_man' # 'kleuter_bureau' + word = 'staatsbossenbeheer' # 'bewindslieden' # 'kleuterburo' + reflemma = 'staatsbossenbeheer' # 'kleuterbureau' + newlemma = normaliselemma(word, alemma, keeplastsep=True) + print(newlemma) + + if reftest: + outgoldfilename = './lemmatests/newcompoundlemmas-gold.txt' + goldfilename = './lemmatests/compoundlemmas-gold.txt' + golddata = readcsv.readcsv(goldfilename, sep=tab) + mismatchctr = 0 + newrecs = [] + for _, rec in golddata: + rawalemma = rec[1] + rawword = rec[0] + rawreflemma = rec[2] + alemma = rawalemma.strip() + word = rawword.strip() + reflemma = rawreflemma.strip() + newlemma = normaliselemma(word, alemma) + if newlemma != reflemma: + mismatchctr += 1 + print( + f'Mismatch: {newlemma} =/= {reflemma} for {alemma}/{word}') + if newlemma is not None: + newrec = [word, alemma, newlemma] + else: + newrec = [word, alemma, reflemma] + newrecs.append(newrec) + print(f'{mismatchctr} mismatches found') + with open(outgoldfilename, 'w', encoding='utf8') as outgoldfile: + for newrec in newrecs: + print(tab.join(newrec), file=outgoldfile) + if test1: + outfilename = './lemmatests/compoundlemmasout.txt' + outfile = open(outfilename, 'w', encoding='utf8') + + testfilename = './lemmatests/lemmanormtestset.txt' + externaltestset = readcsv.readcsv(testfilename, sep=';') + + realtestset = externaltestset + + for _, rec in realtestset: + lemma = rec[0] + word = rec[1] + treatitem(lemma, word, file=outfile) + + if test2: + childestestfilename = './lemmatests/childes_compound_telling.txt' + childestestset = readcsv.readcsv(childestestfilename, sep='\t') + + for _, rec in childestestset: + lemma = rec[2] + word = rec[3] + treatitem(lemma, word, file=outfile) + + if test3: + hyphenfilename = './lemmatests/hyphenwordsLassy.xlsx' + header, data = xlsx.getxlsxdata(hyphenfilename) + + for rec in data: + alemma = rec[0].strip() + word = rec[1].strip() + + newlemma = normaliselemma(word, alemma) + mismatchctr = 0 + if newlemma != alemma: + mismatchctr += 1 + print(f'Mismatch: {newlemma} =/= {alemma} for {word}') + print(f'{mismatchctr} mismatches found') + + if test4: + spelltestlist = ['buro', 'produktie', 'kado', 'appelstrooop'] + spelltestlist = ['strooop', 'heeeeele', 'deeeelde', 'strooompje'] + for wrd in spelltestlist: + corrections = spellcorr(wrd) + print(corrections) + lemmalist = ['bureau', 'productie', 'pannenkoek'] + for lemma in lemmalist: + alternatives = lemma_alt(lemma) + print(alternatives) + + if lemmatest: + # newlemma = normaliselemma('A-elementen', 'A-element', lemmatest=True) + # newlemma = normaliselemma('Antillianen', 'Antilliaan', lemmatest=True) + newlemma = normaliselemma( + 'Parlementslid', 'parlementslid', lemmatest=True) + print(newlemma) + lassytyposfn = './lemmatests/lassytypos.xlsx' + lassytypoheader, lassytypos = xlsx.getxlsxdata(lassytyposfn) + lassytyposdict = {} + for rec in lassytypos: + lassytyposdict[rec[0]] = rec[3] + infilename = './lemmatests/LassyKlein_nword+lemma.xlsx' + header, data = xlsx.getxlsxdata(infilename) + for rec in data: + word = rec[0] + reflemma = rec[1] + newlemma = normaliselemma(word, reflemma, lemmatest=True) + if newlemma is None or newlemma != reflemma: + if word in lassytyposdict and lassytyposdict[word] != "bingo": + pass + else: + print(f'{word}\t{newlemma}\t{reflemma}') diff --git a/src/sastadev/query.py b/src/sastadev/query.py index 1388f1c..e69ccb1 100644 --- a/src/sastadev/query.py +++ b/src/sastadev/query.py @@ -26,7 +26,7 @@ def clean(valstr): class Query: def __init__(self, id, cat, subcat, level, item, altitems, implies, original, pages, fase, query, inform, - screening, process, stars, filter, variants, unused1, unused2, comments): + screening, process, literal, stars, filter, variants, unused1, unused2, comments): self.id = id self.cat = cat self.subcat = subcat @@ -41,6 +41,7 @@ def __init__(self, id, cat, subcat, level, item, altitems, implies, original, pa self.inform = inform self.screening = screening self.process = getprocess(process) + self.literal = literal self.stars = clean(stars) self.filter = filter self.variants = variants @@ -77,3 +78,8 @@ def is_post(query): def query_exists(query): result = query.query != "" and query.query is not None return result + + +def is_literal(query): + result = query.literal != '' + return result diff --git a/src/sastadev/queryfunctions.py b/src/sastadev/queryfunctions.py index adf4230..3b1d7a4 100644 --- a/src/sastadev/queryfunctions.py +++ b/src/sastadev/queryfunctions.py @@ -110,9 +110,8 @@ def auxvobij(stree: SynTree, pred: Callable[[SynTree, SynTree, SynTree], bool]) # find the obj1node obj1node = find1(RPnode, 'node[@rel="obj1"]') - # check if they are adjacent if headnode is not None and obj1node is not None: - if pred(headnode, obj1node, stree): + if pred(obj1node, headnode, stree): results.append(RPnode) return results @@ -135,7 +134,7 @@ def vobij(stree: SynTree) -> List[SynTree]: ''' results1 = stree.xpath(vobijxpath) - results2 = auxvobij(stree, adjacent) + results2 = auxvobij(stree, vobijpred) results = results1 + results2 return results @@ -155,3 +154,15 @@ def voslashbij(stree: SynTree) -> List[SynTree]: ''' results = auxvobij(stree, notadjacent) return results + +def vobijpred(obj1node, headnode, stree) -> bool: + #check for adjacency (er naar is ok, er gisteren naar not) + cond1 = adjacent(headnode, obj1node, stree) + + # check whether the obj1node precedes the headnode: daar naar is ok, naar daar is not ok + headposition = int(getattval(headnode, 'end')) + obj1position = int(getattval(obj1node, 'end')) + cond2 = obj1position < headposition + result = cond1 and cond2 + return result + diff --git a/src/sastadev/rawalpinoparsing.py b/src/sastadev/rawalpinoparsing.py index 6c08542..a099153 100644 --- a/src/sastadev/rawalpinoparsing.py +++ b/src/sastadev/rawalpinoparsing.py @@ -2,6 +2,7 @@ import re import urllib.parse import urllib.request +from typing import Optional from lxml import etree # type: ignore @@ -76,7 +77,6 @@ def parse(origsent: str, escape: bool = True): logging.error('parsing failed:', r1.status, r1.reason, sent) return None - def escape_alpino_input(instr: str) -> str: ''' The function escape_alpino_input takes as input a string *str* and returns this string with symbols with a diff --git a/src/sastadev/readmethod.py b/src/sastadev/readmethod.py index 89912b3..04aea76 100644 --- a/src/sastadev/readmethod.py +++ b/src/sastadev/readmethod.py @@ -132,9 +132,9 @@ def read_method(methodname: str, methodfilename: FileName) -> Method: header, data = xlsx.getxlsxdata(methodfilename) idcol, catcol, subcatcol, levelcol, itemcol, altcol, impliescol, \ - originalcol, pagescol, fasecol, querycol, informcol, screeningcol, processcol, starscol, filtercol, \ - variantscol, unused1col, unused2col, commentscol = \ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 + originalcol, pagescol, fasecol, querycol, informcol, screeningcol, processcol, literalcol, starscol, filtercol, \ + variantscol, unused1col, unused2col, commentscol = \ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 headerrow = 0 @@ -159,6 +159,7 @@ def read_method(methodname: str, methodfilename: FileName) -> Method: inform: str = row[informcol] screening: str = row[screeningcol] process: str = row[processcol].strip() + literal: str = row[literalcol].strip() stars: str = row[starscol].strip() filter: str = row[filtercol].strip() variants: str = row[variantscol] @@ -166,7 +167,8 @@ def read_method(methodname: str, methodfilename: FileName) -> Method: unused2: str = row[unused2col] comments: str = row[commentscol] - queries[id] = Query(id, cat, subcat, level, item, altitems, implies, original, pages, fase, query, inform, screening, process, + queries[id] = Query(id, cat, subcat, level, item, altitems, implies, original, pages, fase, query, + inform, screening, process, literal, stars, filter, variants, unused1, unused2, comments) if queries[id].process in [post_process, form_process]: postquerylist.append(id) diff --git a/src/sastadev/reduceresults.py b/src/sastadev/reduceresults.py index b9300b5..0fc4ca3 100644 --- a/src/sastadev/reduceresults.py +++ b/src/sastadev/reduceresults.py @@ -1,11 +1,11 @@ from collections import Counter from typing import Any, Dict, List -from sastadev.allresults import AllResults +from sastadev.allresults import (AllResults, ExactResultsDict, MatchesDict, + ResultsKey) from sastadev.methods import lastuttqidcondition, maxsamplesize -from sastadev.sastatypes import (AnalysedTrees, ExactResultsDict, FileName, - Matches, MatchesDict, MethodName, Position, - QId, ResultsCounter, ResultsDict, +from sastadev.sastatypes import (AnalysedTrees, FileName, Matches, MethodName, + Position, QId, ResultsCounter, ResultsDict, SampleSizeTuple, UttId, UttWordDict) from sastadev.treebankfunctions import getnodeyield @@ -16,10 +16,10 @@ def exact2results(exactresults: ExactResultsDict) -> ResultsDict: :return: dictionary (key=queryid, value is a Counter uttid: count) """ results: ResultsDict = {} - for qid in exactresults: - uttidlist = [uttid for (uttid, _) in exactresults[qid]] + for reskey in exactresults: + uttidlist = [uttid for (uttid, _) in exactresults[reskey]] resultvalue = Counter(uttidlist) - results[qid] = resultvalue + results[reskey] = resultvalue return results @@ -41,7 +41,7 @@ def reduceallresults(allresults: AllResults, samplesizetuple: SampleSizeTuple, m newexactresults: ExactResultsDict = reduceexactresults(allresults.exactresults, uttidlist, cutoffpoint, methodname) # done newcoreresults: Dict[QId, ResultsCounter] = exact2results( - newexactresults) # done + newexactresults) # done newallutts: UttWordDict = reduceallutts( allresults.allutts, uttidlist) # done newallresults = AllResults(allresults.uttcount, newcoreresults, newexactresults, allresults.postresults, @@ -52,10 +52,10 @@ def reduceallresults(allresults: AllResults, samplesizetuple: SampleSizeTuple, m newuttcount: int = len(uttidlist) # done newexactresults: ExactResultsDict = reduceexactresults(allresults.exactresults, uttidlist, cutoffpoint, methodname) # done - newcoreresults: Dict[QId, ResultsCounter] = exact2results( - newexactresults) # done + newcoreresults: Dict[ResultsKey, ResultsCounter] = exact2results( + newexactresults) # done # @@ I assume these need no change - newpostresults: Dict[QId, Any] = allresults.postresults + newpostresults: Dict[ResultsKey, Any] = allresults.postresults newallmatches: MatchesDict = reducematches( allresults.allmatches, uttidlist, cutoffpoint, methodname) # done newfilename: FileName = allresults.filename # done @@ -75,14 +75,14 @@ def reduceexactresults(exactresultsdict: Dict[QId, ExactResultsDict], uttidlist: newexactresultsdict = {} lastuttid = uttidlist[-1] - for qid in exactresultsdict: + for reskey in exactresultsdict: newexactresults = [] - for uttid, position in exactresultsdict[qid]: + for uttid, position in exactresultsdict[reskey]: if (uttid in uttidlist and uttid != lastuttid) or \ - (uttid == lastuttid and cutoffpoint is not None - and not (position > cutoffpoint) and lastuttqidcondition[methodname](qid)): + (uttid == lastuttid and cutoffpoint is not None and + not (position > cutoffpoint) and lastuttqidcondition[methodname](reskey)): newexactresults.append((uttid, position)) - newexactresultsdict[qid] = newexactresults + newexactresultsdict[reskey] = newexactresults return newexactresultsdict @@ -97,13 +97,14 @@ def reduceresults(resultsdict: Dict[QId, Counter], samplesizetuple: SampleSizeTu else: newresultsdict = {} lastuttid = uttidlist[-1] - for qid in resultsdict: + for reskey in resultsdict: newresults = [] - for uttid in resultsdict[qid]: + for uttid in resultsdict[reskey]: if (uttid in uttidlist and uttid != lastuttid) or \ - (uttid == lastuttid and lastuttqidcondition[methodname](qid)): # no condition on the position, we have no info on it + (uttid == lastuttid and lastuttqidcondition[methodname]( + reskey)): # no condition on the position, we have no info on it newresults.append(uttid) - newresultsdict[qid] = Counter(newresults) + newresultsdict[reskey] = Counter(newresults) return newresultsdict @@ -111,19 +112,19 @@ def reducematches(matchesdict: MatchesDict, uttidlist: List[UttId], cutoffpoint: methodname: MethodName) -> MatchesDict: newmatchesdict = {} lastuttid = uttidlist[-1] - for qid, uttid in matchesdict: + for reskey, uttid in matchesdict: if uttid in uttidlist and uttid != lastuttid: - newmatchesdict[(qid, uttid)] = matchesdict[(qid, uttid)] + newmatchesdict[(reskey, uttid)] = matchesdict[(reskey, uttid)] else: - if uttid == lastuttid and lastuttqidcondition[methodname](qid): + if uttid == lastuttid and lastuttqidcondition[methodname](reskey): newmatches: Matches = [] - for match in matchesdict[(qid, uttid)]: + for match in matchesdict[(reskey, uttid)]: (m, tree) = match treeyield = getnodeyield(tree) lefttreeyield = treeyield[: cutoffpoint] if m in lefttreeyield: newmatches.append((m, tree)) - newmatchesdict[(qid, uttid)] = newmatches + newmatchesdict[(reskey, uttid)] = newmatches return newmatchesdict diff --git a/src/sastadev/sasta_explanation.py b/src/sastadev/sasta_explanation.py index c35ad5e..5da4b93 100644 --- a/src/sastadev/sasta_explanation.py +++ b/src/sastadev/sasta_explanation.py @@ -1,21 +1,21 @@ - import copy from typing import List, Optional -from auchann.align_words import align_words +from auchann.align_words import AlignmentSettings, align_words from lxml import etree # import find1, iswordnode, getattval import sastadev.stringfunctions as strf import sastadev.treebankfunctions as tbf -from sastadev.auchannsettings import AlignmentSettings from sastadev.auchannsettings import settings as auchannsettings from sastadev.cleanCHILDEStokens import cleantext -from sastadev.conf import settings +from sastadev.conf import settings as sdsettings from sastadev.lexicon import known_word -from sastadev.metadata import (MetaValue, bpl_node, bpl_word, fromElement, +from sastadev.metadata import (MetaValue, bpl_replacement, fromElement, mkSASTAMeta) from sastadev.sastatok import gettokensplusxmeta +# import find1, iswordnode, getattval +# import find1, iswordnode, getattval from sastadev.sastatoken import Token from sastadev.sastatypes import SynTree from sastadev.tokenmd import TokenListMD @@ -27,16 +27,26 @@ sentenceinitialconjunctions = {'en', 'maar'} # interjections = ['hee', 'hè', 'ja', 'nee', 'kijk'] # interjections used for sentence initial words that can be absent in te beginning of a correction -interjections = ['ja', 'nee', 'kijk', 'oh', 'he', 'hoor', 'hè', 'o', 'hee', 'mama', 'okee', 'hé', 'ah', 'oeh', 'au', 'oja', 'joh', 'jee', 'mam', 'bah', 'jawel', 'mamma', 'ho', 'boem', 'ha', 'sorry', - 'ooh', 'daag', 'haha', 'nou', 'papa', 'pappa', 'toe', 'maar', 'oei', 'aah', 'hallo', 'dankjewel', 'oeps', 'oo', 'toch', 'wauw', 'goh', 'aha', 'vooruit', 'dan', 'tjonge', - 'hèhè', 'jaja', 'hoi', 'waar', 'bb', 'help', 'meneer', 'hi', 'ach', 'ee', 'hup', 'oooh', 'heh', 'm', 'ma', 'sst', 'och', 'tja', 'lieverd', 'hahaha', 'hoera', 'pap', - 'echt', 'lalala', 'hopla', 'da', 'pff', 'hai', 'jongens', 'juffrouw', 'jeetje', 'tot', 'ziens', 'hihi', 'jonge', 'ohh', 'poeh', 'oef', - 'meisje', 'aaah', 'auw', 'meid', 'niet', 'poe', 'en', 'schat', 'wel', 'ai', 'goed', 'xxxx', 'dat', 'doei', 'tjongejonge', 'ooooh', 'hoewel', - 'oke', 'neenee', 'pfff', 'mens', 'ps', 'oow', 'fff', 'juf', 'mevrouw', 'baby', 'dankuwel', 'waw', 'welterusten', 'sehhahahaha', 'hihihi', 'aaaah', 'wee', 'shit', - 'pa', 'grr', 'weltrusten', 'pats', 'weh', 'stouterd', 'dag', 'joepie', 'neej', 'hoho', 'rara', 'joehoe', 'schatje', 'hierzo', 'pffff', 'ahh', 'ahah', 'tjee', - 'liefje', 'pf', 'ahaha', 'hoppa', 'ahahaha', 'verdorie', 'ssst', 'foei', 'gossie', 'ok', 'joe', 'tsja', 'gatverdamme', 'grrr', 'welnee', 'god', 'tjeetje', 'doeg', - 'wah', 'getver', 'ohja', 'hej', 'zak', 'alhoewel', 'neen', 'goedzo', 'ahahah', 'allee', 'jo', 'jongen', 'pardon', 'hihihihi', 'floep', 'lieve', 'gatver', 'kut', 'bro', - 'mja', 'tsjonge', 'hohoho', 'klopt', 'man', 'jezus', 'truste', 'ppf', 'goedemorgen', 'domoor', 'aaaaah', 'okeee', 'yes', 'ahahahaha'] +interjections = ['ja', 'nee', 'kijk', 'oh', 'he', 'hoor', 'hè', 'o', 'hee', 'mama', 'okee', 'hé', 'ah', 'oeh', 'au', + 'oja', 'joh', 'jee', 'mam', 'bah', 'jawel', 'mamma', 'ho', 'boem', 'ha', 'sorry', + 'ooh', 'daag', 'haha', 'nou', 'papa', 'pappa', 'toe', 'maar', 'oei', 'aah', 'hallo', 'dankjewel', + 'oeps', 'oo', 'toch', 'wauw', 'goh', 'aha', 'vooruit', 'dan', 'tjonge', + 'hèhè', 'jaja', 'hoi', 'waar', 'bb', 'help', 'meneer', 'hi', 'ach', 'ee', 'hup', 'oooh', 'heh', 'm', + 'ma', 'sst', 'och', 'tja', 'lieverd', 'hahaha', 'hoera', 'pap', + 'echt', 'lalala', 'hopla', 'da', 'pff', 'hai', 'jongens', 'juffrouw', 'jeetje', 'tot', 'ziens', 'hihi', + 'jonge', 'ohh', 'poeh', 'oef', + 'meisje', 'aaah', 'auw', 'meid', 'niet', 'poe', 'en', 'schat', 'wel', 'ai', 'goed', 'xxxx', 'dat', + 'doei', 'tjongejonge', 'ooooh', 'hoewel', + 'oke', 'neenee', 'pfff', 'mens', 'ps', 'oow', 'fff', 'juf', 'mevrouw', 'baby', 'dankuwel', 'waw', + 'welterusten', 'sehhahahaha', 'hihihi', 'aaaah', 'wee', 'shit', + 'pa', 'grr', 'weltrusten', 'pats', 'weh', 'stouterd', 'dag', 'joepie', 'neej', 'hoho', 'rara', + 'joehoe', 'schatje', 'hierzo', 'pffff', 'ahh', 'ahah', 'tjee', + 'liefje', 'pf', 'ahaha', 'hoppa', 'ahahaha', 'verdorie', 'ssst', 'foei', 'gossie', 'ok', 'joe', 'tsja', + 'gatverdamme', 'grrr', 'welnee', 'god', 'tjeetje', 'doeg', + 'wah', 'getver', 'ohja', 'hej', 'zak', 'alhoewel', 'neen', 'goedzo', 'ahahah', 'allee', 'jo', 'jongen', + 'pardon', 'hihihihi', 'floep', 'lieve', 'gatver', 'kut', 'bro', + 'mja', 'tsjonge', 'hohoho', 'klopt', 'man', 'jezus', 'truste', 'ppf', 'goedemorgen', 'domoor', + 'aaaaah', 'okeee', 'yes', 'ahahahaha'] fillers = ['eh', 'ehm', 'ah', 'boe', 'hm', 'hmm', 'uh', 'uhm', 'ggg', 'mmm', 'ja', 'nee'] allfillers = fillers + ['&-' + filler for filler in fillers] + \ @@ -45,7 +55,6 @@ 'l', 'f', 'm.', 'g.', '@', 'w.', 'y', 'g', 'j', 'j.', 'b.', 'k.', 'v', 'h.', 'z.', 'c.', 'f.', 'i.', 'e'] \ + defaultsettings.fragments - space = ' ' CHAT_explanation = 'Explanation' explannwordlistxpath = f'.//xmeta[@name="{CHAT_explanation}"]/@annotationwordlist' @@ -84,10 +93,10 @@ def explanationasreplacement(tokensmd: TokenListMD, tree: SynTree) -> Optional[T oldtoken = Token(oldword, oldwordpos) if known_word(newword): newtokens = tokenreplace(newtokens, newtoken) - bpl = bpl_node if known_word(oldword) else bpl_word + # bpl = bpl_node if known_word(oldword) else bpl_word meta = mkSASTAMeta(oldtoken, newtoken, name='ExplanationasReplacement', value='ExplanationasReplacement', - cat='Lexical Error', backplacement=bpl) + cat='Lexical Error', backplacement=bpl_replacement) newmetadata.append(meta) result = TokenListMD(newtokens, newmetadata) return result @@ -104,14 +113,13 @@ def islet(token, tree): def finaltokenmultiwordexplanation(tree: SynTree) -> Optional[str]: - # get the multiword explanation and the last tokenposition it occupies # it is assumed that the chat annotations have not been extracted and no metadata have been produced xtokens, xmetalist = gettokensplusxmeta(tree) result = None -# origmetadata = tokensmd.metadata + # origmetadata = tokensmd.metadata origmetadata = xmetalist explanations = [xm for xm in xmetalist if xm.name == 'Explanation'] finalmwexplanations = [] @@ -131,7 +139,8 @@ def finaltokenmultiwordexplanation(tree: SynTree) -> Optional[str]: prefixtokens = resttokens[0:2] todoxtokens = resttokens[2:] elif len(resttokens) >= 1 and \ - (resttokens[0].word.lower() in allfillers or resttokens[0].word.lower() in sentenceinitialconjunctions) and \ + (resttokens[0].word.lower() in allfillers or resttokens[ + 0].word.lower() in sentenceinitialconjunctions) and \ len(xm.annotationwordlist) >= 1 and resttokens[0].word.lower() != xm.annotationwordlist[0].lower(): prefixtokens = resttokens[0:1] todoxtokens = resttokens[1:] @@ -172,7 +181,6 @@ def finaltokenmultiwordexplanation(tree: SynTree) -> Optional[str]: def finalmultiwordexplanation(stree: SynTree) -> Optional[str]: - # get the multiword explanation and the last tokenposition it occupies explannwrdliststr = tbf.find1(stree, explannwordlistxpath) @@ -250,7 +258,7 @@ def finalexplanation_adapttreebank(treebank): newtree = finalexplanation_adapttree(tree) if newtree is None: newtreebank.append(tree) - settings.LOGGER.warning('Final Explanation correction failed') + sdsettings.LOGGER.warning('Final Explanation correction failed') else: newtreebank.append(newtree) return newtreebank @@ -269,7 +277,7 @@ def finalexplanation_adapttree(tree: SynTree) -> SynTree: for el in intreemetadataxml: newmeta = fromElement(el) intreemetadata.append(newmeta) -# intreemetadata = [fromElement(el) for el in intreemetadataxml] + # intreemetadata = [fromElement(el) for el in intreemetadataxml] # adapt the metadata newmetadata = [] @@ -289,7 +297,7 @@ def finalexplanation_adapttree(tree: SynTree) -> SynTree: newmetadata += chatmetadata cleanutt = space.join([token.word for token in cleanutttokens]) - newtree = settings.PARSE_FUNC(cleanutt) + newtree = sdsettings.PARSE_FUNC(cleanutt) sentelem = tbf.find1(tree, './/sentence') sentid = sentelem.attrib['sentid'] newsentelem = tbf.find1(newtree, './/sentence') @@ -297,7 +305,7 @@ def finalexplanation_adapttree(tree: SynTree) -> SynTree: # tbf.showtree(newtree, 'newly parsed tree') if newtree is None: newtree = tree - settings.LOGGER.warning( + sdsettings.LOGGER.warning( 'Parsing for <{cleanutt}> failed. No changes applied') else: newmetaelements = [meta.toElement() for meta in newmetadata] diff --git a/src/sastadev/sastacore.py b/src/sastadev/sastacore.py new file mode 100644 index 0000000..9c886f3 --- /dev/null +++ b/src/sastadev/sastacore.py @@ -0,0 +1,333 @@ +from dataclasses import dataclass +from typing import Any, Callable, Dict, List, Optional, Tuple + +from lxml import etree + +from sastadev.allresults import (AllResults, ExactResultsDict, MatchesDict, + ResultsKey, mkresultskey) +from sastadev.ASTApostfunctions import getastamaxsamplesizeuttidsandcutoff +from sastadev.conf import settings +from sastadev.external_functions import str2functionmap +from sastadev.imply import removeimplies +from sastadev.macros import expandmacros +from sastadev.methods import Method, astamethods, stapmethods, tarspmethods +from sastadev.mismatches import getmarkposition +from sastadev.query import (Query, form_process, is_core, is_literal, is_pre, + post_process, query_exists) +from sastadev.reduceresults import exact2results, reduceallresults +from sastadev.sasta_explanation import finalexplanation_adapttreebank +from sastadev.sastatypes import (FileName, MethodName, Position, QId, + QueryDict, SampleSizeTuple, SynTree, TreeBank, + UttId) +from sastadev.stringfunctions import getallrealwords +from sastadev.targets import get_mustbedone +from sastadev.treebankfunctions import (getattval, getnodeendmap, getuttid, + getxmetatreepositions, getxselseuttid, + getyield, showtree) + +singlewordWquery = """//node[@pt="ww"]/ancestor::node[@cat="top" and count(.//node[@pt!="let" and @pt!="tsw"]) = 1 ] """ + + +@dataclass +class SastaCoreParameters: + annotationinput: bool = False + corr: str = 'corrn' + themethod: Method = None + includeimplies: bool = False + infilename: FileName = None + targets: int = None + + +def doauchann(intreebank: SynTree) -> SynTree: + + # deal with final explanations + fexplanations = True + if fexplanations: + outtreebank = finalexplanation_adapttreebank(intreebank) + else: + outtreebank = intreebank + + # for tree in treebank1: + # showtree(tree, 'na fexplanations') + + # deal with %xlit, %xint + # @@ to be implemented @@ + + return outtreebank + + +def sastacore(origtreebank: Optional[TreeBank], correctedtreebank: TreeBank, + annotatedfileresults: Optional[AllResults], + scp: SastaCoreParameters): + invalidqueries = {} + + annotationinput = scp.annotationinput + if annotationinput: + if not (origtreebank is None and annotatedfileresults is not None): + pass # report an error and exit + else: + if not (origtreebank is not None and annotatedfileresults is None): + pass # report an error and exit + + corr = scp.corr + themethod = scp.themethod + methodname = themethod.name + altcodes = themethod.altcodes + includeimplies = False + infilename = scp.infilename + nodeendmap = {} + targets = scp.targets + + rawexactresults: ExactResultsDict = {} + allmatches: MatchesDict = {} + + # @vanaf nu gaat het om een treebank, dus hier een if statement toevoegen-done + if annotationinput: + allutts = annotatedfileresults.allutts + uttcount = len(allutts) + exactresults = annotatedfileresults.exactresults + analysedtrees = annotatedfileresults.analysedtrees + uttcount = annotatedfileresults.uttcount + coreresults = annotatedfileresults.coreresults + postresults = annotatedfileresults.postresults + allmatches = annotatedfileresults.allmatches + infilename = annotatedfileresults.filename + else: + if origtreebank.tag != 'treebank': + settings.LOGGER.error( + "Input treebank file does not contain a treebank element") + exit(-1) + allutts = {} + uttcount = 0 + # if includeimplies: # not needed anymore, now part of the Tarsp Index + # themethod.queries['T120'].query = singlewordWquery + + # analysedtrees consists of (uttid, syntree) pairs in the order in which they come in + analysedtrees: List[(UttId, SynTree)] = [] + for syntree in correctedtreebank: + temputtid = getuttid(syntree) + uttcount += 1 + + # if temputtid == '118': + # showtree(syntree, 'tree 118') + # settings.LOGGER.error('uttcount={}'.format(uttcount)) + mustbedone = get_mustbedone(syntree, targets) + if mustbedone: + # uttid = getuttid(syntree) + # analysedtrees consists of (uttid, syntree) pairs in order + uttid = getxselseuttid(syntree) + analysedtrees.append((uttid, syntree)) + + doprequeries(syntree, themethod.queries, + rawexactresults, allmatches, invalidqueries) + docorequeries(syntree, themethod.queries, + rawexactresults, allmatches, invalidqueries) + + # showtree(syntree) + if uttid in nodeendmap: + settings.LOGGER.error( + 'Duplicate uttid in sample: {}'.format(uttid)) + nodeendmap[uttid] = getnodeendmap(syntree) + + # uttno = getuttno(syntree) + # allutts[uttno] = getyield(syntree) + allutts[uttid] = getyield(syntree) + + # determine exactresults and apply the filter to catch interdependencies between prequeries and corequeries + # rawexactresults = getexactresults(allmatches) + rawexactresults2 = passfilter(rawexactresults, themethod) + exactresults = rawexactresults2 + + # pas hier de allutts en de rawexactresults2 aan om expansies te ontdoen, gebseerd op de nodeendmap + # @@to be implemented @@ of misschien in de loop hierboven al? + + # @ en vanaf hier kan het weer gemeenschappelijk worden; er met dus ook voor de annotatiefile een exactresults opgeleverd worden + # @d epostfunctions for lemma's etc moeten mogelijk wel aangepast worden + + if includeimplies: + allmatches, rawexactresults = removeimplies( + allmatches, exactresults, themethod) + else: + rawexactresults = exactresults + + # adapt the exactresults positions to the reference + if annotationinput: + exactresults = rawexactresults + else: + exactresults = adaptpositions(rawexactresults, nodeendmap) + + coreresults = exact2results(exactresults) + + postresults: Dict[ResultsKey, Any] = {} + allresults = AllResults(uttcount, coreresults, exactresults, postresults, allmatches, infilename, + analysedtrees, + allutts, annotationinput) + + samplesizefunction = getsamplesizefunction(methodname) + samplesizetuple: SampleSizeTuple = samplesizefunction(allresults) + + postquerylist: List[QId] = [ + q for q in themethod.postquerylist if themethod.queries[q].process == post_process] + formquerylist: List[QId] = [ + q for q in themethod.postquerylist if themethod.queries[q].process == form_process] + + # we assume the reduction must be done before the postqueries + allresults = reduceallresults(allresults, samplesizetuple, methodname) + + dopostqueries(allresults, postquerylist, themethod.queries) + + dopostqueries(allresults, formquerylist, themethod.queries) + + return allresults, samplesizetuple + + +def doqueries(syntree: SynTree, queries: QueryDict, exactresults: ExactResultsDict, allmatches: MatchesDict, + criterion: Callable[[Query], bool], invalidqueries): + # global invalidqueries + uttid = getuttid(syntree) + # uttid = getuttidorno(syntree) + omittedwordpositions = getxmetatreepositions( + syntree, 'Omitted Word', poslistname='annotatedposlist') + # print(uttid) + # core queries + junk = 0 + for queryid in queries: # @@ dit aanpassen voor literals en voor Resultskey; check read_referencefile + # if queryid not in exactresults: # not needed becaysetaken care of below + # exactresults[queryid] = [] + thequeryobj = queries[queryid] + if criterion(thequeryobj): + if query_exists(thequeryobj): + thelistedquery = thequeryobj.query + if isxpathquery(thelistedquery): + expandedquery = expandmacros(thelistedquery) + thequery = "." + expandedquery + try: + matches = syntree.xpath(thequery) + except etree.XPathEvalError as e: + invalidqueries[queryid] = e + matches = [] + else: + thef = str2functionmap[thelistedquery] + matches = thef(syntree) + else: + matches = [] + exactresults[mkresultskey(queryid)] = [] + # matchingids = [uttid for x in matches] + for m in matches: + # showtree(m) + reskey = getreskey(queryid, m, queries) + if m is None: + showtree(syntree, text='in doqueries: Nonematch') + if (reskey, uttid) in allmatches: + allmatches[(reskey, uttid)].append((m, syntree)) + else: + allmatches[(reskey, uttid)] = [(m, syntree)] + exactresult = (uttid, int(getattval(m, 'begin')) + 1) + if reskey in exactresults: + exactresults[reskey].append(exactresult) + else: + exactresults[reskey] = [exactresult] + # if queryid in results: + # results[queryid].update(matchingids) + # else: + # results[queryid] = Counter(matchingids) + + +def docorequeries(syntree: SynTree, queries: QueryDict, results: ExactResultsDict, allmatches: MatchesDict, invalidqueries): + doqueries(syntree, queries, results, allmatches, is_core, invalidqueries) + + +def doprequeries(syntree: SynTree, queries: QueryDict, results: ExactResultsDict, allmatches: MatchesDict, invalidqueries): + doqueries(syntree, queries, results, allmatches, is_pre, invalidqueries) + + +def dopostqueries(allresults: AllResults, postquerylist: List[QId], queries: QueryDict): + # post queries + for queryid in postquerylist: + thequeryobj = queries[queryid] + if query_exists(thequeryobj): + thelistedquery = thequeryobj.query + + # it is assumed that these are all python functions + thef = str2functionmap[thelistedquery] + result = thef(allresults, queries) + allresults.postresults[queryid] = result + + +def passfilter(rawexactresults: ExactResultsDict, method: Method) -> ExactResultsDict: + """ + let only those through that satisfy the filter + :param rawexactresults: dictionary with ResultsKey as key and a Counter as value, exact results + :param method: Method object + :return: a filtered version of rawexactresults: results that pass the filter + """ + # exactresults: ExactResultsDict = defaultdict(list) # hiermee ontstaat een probleem: dictionary size changed in iteration + exactresults: ExactResultsDict = {} + queries = method.queries + for reskey in rawexactresults: + queryid = reskey[0] + query = queries[queryid] + queryfilter = query.filter + thefilter = method.defaultfilter if queryfilter is None or queryfilter == '' else str2functionmap[ + queryfilter] + exactresults[reskey] = [r for r in rawexactresults[reskey] + if reskey in rawexactresults and thefilter(query, rawexactresults, r)] + return exactresults + + +def adaptpositions(rawexactresults: ExactResultsDict, nodeendmap) -> ExactResultsDict: + newexactresults: ExactResultsDict = {} + for qid in rawexactresults: + newlist = [] + for (uttid, position) in rawexactresults[qid]: + newposition = getmarkposition(position, nodeendmap, uttid) + newtuple = (uttid, newposition) + newlist.append(newtuple) + newexactresults[qid] = newlist + return newexactresults + + +def isxpathquery(query: str) -> bool: + cleanquery = query.lstrip() + return cleanquery.startswith('//') + + +def getreskey(qid: QId, m: SynTree, queries: QueryDict) -> ResultsKey: + if m is None: + return mkresultskey(qid) + thequery = queries[qid] + if is_literal(thequery): + litfunc = str2functionmap[thequery.literal] + thevalue = litfunc(m) + return mkresultskey(qid, thevalue) + else: + return mkresultskey(qid) + + +def getsamplesizefunction(methodname: MethodName) -> Callable: + if methodname in astamethods: + result = getastamaxsamplesizeuttidsandcutoff + elif methodname in tarspmethods: + # @@to be implemented + result = getmaxsamplesizeuttidsandcutoff + elif methodname in stapmethods: + # @@to be implemented + result = getmaxsamplesizeuttidsandcutoff + return result + + +def getmaxsamplesizeuttidsandcutoff(allresults: AllResults) -> Tuple[List[UttId], int, Position]: + cutoffpoint = None + words = getallrealwords(allresults) + cumwordcount = 0 + wordcounts: Dict[UttId, Tuple[int, int, int]] = {} + uttidlist = [] + for uttid in allresults.allutts: + basewordcount = sum(words[uttid].values()) + ignorewordcount = 0 # getignorewordcount(allresults, uttid) + wordcount = basewordcount - ignorewordcount + wordcounts[uttid] = (basewordcount, ignorewordcount, wordcount) + uttidlist.append(uttid) + cumwordcount += wordcount + result = (uttidlist, cumwordcount, cutoffpoint) + return result diff --git a/src/sastadev/sastatok.py b/src/sastadev/sastatok.py index 8cf8002..d001438 100644 --- a/src/sastadev/sastatok.py +++ b/src/sastadev/sastatok.py @@ -1,6 +1,7 @@ import re from typing import List, Tuple +import sastadev import sastadev.CHAT_Annotation as sastachat import sastadev.cleanCHILDEStokens from sastadev.metadata import Meta @@ -44,7 +45,6 @@ def alts(pats, grouping=False): retracing = scopeorword + r'\s*\[//\]\s*' + word # p73 whitespace = r'\s+' - # sastaspecials = [r'\[::', r'\[=', r'\[:', r'\[=\?', r'\[x', r'\<', r'\>', r'\[\?\]', r'\[/\]', r'\[//\]', r'\[///\]', r'\[%', r'\]'] sastaspecials = list(sastachat.CHAT_patterns) sastapatterns = sorted(sastaspecials, key=lambda x: len( diff --git a/src/sastadev/sastatypes.py b/src/sastadev/sastatypes.py index 0ca5d98..ad45fe0 100644 --- a/src/sastadev/sastatypes.py +++ b/src/sastadev/sastatypes.py @@ -3,81 +3,92 @@ ''' from collections import Counter -from typing import Any, Callable, Dict, List, Optional, Tuple, Union +from typing import Callable, Dict, List, Optional, Tuple, Union -from lxml import etree # type: ignore -from typing_extensions import TypeAlias +from lxml import etree from sastadev.query import Query from sastadev.sastatoken import Token -AltId: TypeAlias = int -BackPlacement: TypeAlias = int -CapitalName: TypeAlias = str -CountryName: TypeAlias = str -ContinentName: TypeAlias = str -CELEXPosCode: TypeAlias = str -FirstName: TypeAlias = str -LocationName: TypeAlias = str -DCOIPt: TypeAlias = str -DeHet: TypeAlias = str -CELEX_INFL: TypeAlias = str -DCOITuple: TypeAlias = Tuple -Lemma: TypeAlias = str -CorrectionMode: TypeAlias = str # Literal['0','1','n'] -ErrorDict: TypeAlias = Dict[str, List[List[str]]] -Level: TypeAlias = str # in the future perhaps NewType('Level', str) -Item: TypeAlias = str # in the future perhaps NewType('Item', str) -Item_Level: TypeAlias = Tuple[Item, Level] -IntSpan: TypeAlias = Tuple[int, int] -AltCodeDict: TypeAlias = Dict[Item_Level, Item_Level] -QId: TypeAlias = str # in the futute perhaps NewType('QId', str) -UttId: TypeAlias = str # in the future perhaps NewType('UttId', str) -Position: TypeAlias = int # in the future perhapos NewType('Position', int) -PositionStr: TypeAlias = str -Stage: TypeAlias = int -SynTree: TypeAlias = etree._Element # type: ignore -GoldTuple: TypeAlias = Tuple[str, str, Counter] -Item2LevelsDict: TypeAlias = Dict[Item, List[Level]] -Match: TypeAlias = Tuple[SynTree, SynTree] -Matches: TypeAlias = List[Match] -MatchesDict: TypeAlias = Dict[Tuple[QId, UttId], Matches] -MetaElement: TypeAlias = etree.Element -ExactResult: TypeAlias = Tuple[UttId, Position] -ExactResults: TypeAlias = List[ExactResult] -ExactResultsDict: TypeAlias = Dict[QId, ExactResults] # qid -Gender: TypeAlias = str -Penalty: TypeAlias = int -PhiTriple: TypeAlias = Tuple[str, str, str] -OptPhiTriple: TypeAlias = Optional[PhiTriple] -PositionMap: TypeAlias = Dict[Position, Position] -QueryDict: TypeAlias = Dict[QId, Query] -QIdCount: TypeAlias = Dict[QId, int] -MethodName: TypeAlias = str # perhaps in the future NewType('MethodName', str) -FileName: TypeAlias = str # perhaps in the future NewType('FileName', str) -ReplacementMode: TypeAlias = int -ResultsCounter: TypeAlias = Counter # Counter[UttId] # Dict[UttId, int] -ResultsDict: TypeAlias = Dict[QId, ResultsCounter] -Span: TypeAlias = Tuple[PositionStr, PositionStr] -Item_Level2QIdDict: TypeAlias = Dict[Item_Level, QId] -Nort: TypeAlias = Union[SynTree, Token] -ExactResultsFilter: TypeAlias = Callable[[ - Query, ExactResultsDict, ExactResult], bool] -Targets: TypeAlias = int -Treebank: TypeAlias = etree.Element -TreePredicate: TypeAlias = Callable[[SynTree], bool] -TokenTreePredicate: TypeAlias = Callable[[Token, SynTree], bool] -URL: TypeAlias = str -UttTokenDict: TypeAlias = Dict[UttId, List[Token]] -UttWordDict: TypeAlias = Dict[UttId, List[str]] -WordInfo: TypeAlias = Tuple[Optional[CELEXPosCode], - Optional[DeHet], Optional[CELEX_INFL], Optional[Lemma]] -# moved the following to allresuls.py -# CoreQueryFunction: TypeAlias = Callable[[SynTree], List[SynTree]] -# PostQueryFunction: TypeAlias = Callable[[SynTree, allresults.AllResults], List[SynTree]] -# QueryFunction: TypeAlias = Union[CoreQueryFunction, PostQueryFunction] +Level = str # in the future perhaps NewType('Level', str) +Position = int # in the future perhapos NewType('Position', int) +PhiTriple = Tuple[str, str, str] +QId = str # in the futute perhaps NewType('QId', str) +SynTree = etree.Element # type: ignore +TreeBank = etree.Element +UttId = str # in the future perhaps NewType('UttId', str) + +Item = str # in the future perhaps NewType('Item', str) +Item2LevelsDict = Dict[Item, List[Level]] +Item_Level = Tuple[Item, Level] + +AltCodeDict = Dict[Item_Level, Item_Level] +AltId = int AnalysedTrees = List[Tuple[UttId, SynTree]] +BackPlacement = int +CapitalName = str +CountryName = str +ContinentName = str +CELEXPosCode = str +FirstName = str +LocationName = str +DCOIPt = str +DeHet = str +CELEX_INFL = str +DCOITuple = Tuple +Lemma = str +CorrectionMode = str # Literal['0','1','n'] +ErrorDict = Dict[str, List[List[str]]] +Level = str # in the future perhaps NewType('Level', str) +Item = str # in the future perhaps NewType('Item', str) +Item_Level = Tuple[Item, Level] +IntSpan = Tuple[int, int] +AltCodeDict = Dict[Item_Level, Item_Level] +QId = str # in the futute perhaps NewType('QId', str) +UttId = str # in the future perhaps NewType('UttId', str) +Position = int # in the future perhapos NewType('Position', int) +PositionStr = str +Stage = int +SynTree = etree._Element # type: ignore +GoldTuple = Tuple[str, str, Counter] +GoldResults = Dict[QId, GoldTuple] +Item2LevelsDict = Dict[Item, List[Level]] +Match = Tuple[SynTree, SynTree] +Matches = List[Match] +MatchesDict = Dict[Tuple[QId, UttId], Matches] +MetaElement = etree.Element +ExactResult = Tuple[UttId, Position] +ExactResults = List[ExactResult] +ExactResultsDict = Dict[QId, ExactResults] # qid +Gender = str +Penalty = int +PhiTriple = Tuple[str, str, str] +OptPhiTriple = Optional[PhiTriple] +PositionMap = Dict[Position, Position] +QueryDict = Dict[QId, Query] +QIdCount = Dict[QId, int] +MethodName = str # perhaps in the future NewType('MethodName', str) +FileName = str # perhaps in the future NewType('FileName', str) +ReplacementMode = int +ResultsCounter = Counter # Counter[UttId] # Dict[UttId, int] +ResultsDict = Dict[QId, ResultsCounter] SampleSizeTuple = Tuple[List[UttId], int, Optional[PositionStr]] -# TODO: fix -GoldResults = Any +Span = Tuple[PositionStr, PositionStr] +Item_Level2QIdDict = Dict[Item_Level, QId] +Nort = Union[SynTree, Token] +ExactResultsFilter = Callable[[Query, ExactResultsDict, ExactResult], bool] +Targets = int +Treebank = etree.Element +TreePredicate = Callable[[SynTree], bool] +TokenTreePredicate = Callable[[Token, SynTree], bool] +URL = str +UttTokenDict = Dict[UttId, List[Token]] +UttWordDict = Dict[UttId, List[str]] +WordInfo = Tuple[Optional[CELEXPosCode], Optional[DeHet], + Optional[CELEX_INFL], Optional[Lemma]] +Pattern = str +# moved the following to allresuls.py +# CoreQueryFunction = Callable[[SynTree], List[SynTree]] +# PostQueryFunction = Callable[[SynTree, allresults.AllResults], List[SynTree]] +# QueryFunction = Union[CoreQueryFunction, PostQueryFunction] diff --git a/src/sastadev/smallclauses.py b/src/sastadev/smallclauses.py index 69efa7a..5270e53 100644 --- a/src/sastadev/smallclauses.py +++ b/src/sastadev/smallclauses.py @@ -22,7 +22,7 @@ again and the resulting parse tree is subjected to the queries for analysis. For example, by inserting the finite verb *moeten* in the utterance *schoenen aan*, -resuting in *schoenen moeten aan*, *schoenen* can be analysed as a subject noun and *aan* as predicative adjective, +resulting in *schoenen moeten aan*, *schoenen* can be analysed as a subject noun and *aan* as predicative adjective, and the whole utterance as an instance of TARSP *OndVC*. The small clause utterances are often very short, and we analysed utterances with 2 @@ -191,7 +191,7 @@ def locadv(node): result = getattval(node, 'pt') in ['bw', 'vz'] frame = getattval(node, 'frame') result = result and ('loc' in frame or 'er_adverb' in frame) - result = result or rpronoun(node) + result = result or (rpronoun(node) and getattval(node, 'lemma') != 'er') # in samll clauses predicates are no clitics return result diff --git a/src/sastadev/smartcompoundcomparison.py b/src/sastadev/smartcompoundcomparison.py index fe7e211..218dbaa 100644 --- a/src/sastadev/smartcompoundcomparison.py +++ b/src/sastadev/smartcompoundcomparison.py @@ -7,7 +7,7 @@ ''' import editdistance -# from sastadev.normalise_lemma import normaliselemma +from sastadev.normalise_lemma import normaliselemma def reldistance(word, corr): @@ -18,8 +18,7 @@ def reldistance(word, corr): def iscompound(word, corr, rawcorrlemma): debug = False - corrlemma = rawcorrlemma - # corrlemma = normaliselemma(corr, rawcorrlemma, keeplastsep=True) TODO: fix + corrlemma = normaliselemma(corr, rawcorrlemma, keeplastsep=True) corrlemmaparts = corrlemma.split('_') if len(corrlemmaparts) == 1: return False diff --git a/src/sastadev/stapforms.py b/src/sastadev/stapforms.py index af15ab3..9094806 100644 --- a/src/sastadev/stapforms.py +++ b/src/sastadev/stapforms.py @@ -5,7 +5,7 @@ from openpyxl import load_workbook -from sastadev.allresults import AllResults +from sastadev.allresults import AllResults, mkresultskey from sastadev.conf import settings from sastadev.forms import getformfilename @@ -14,18 +14,18 @@ zerocount = 0 basexl = os.path.join(settings.SD_DIR, 'data', 'form_templates', 'STAP Excel VUmc 2018.xlsx') -NS = 'S001' -OS = 'S002' -PV = 'S003' -SGG = 'S004' -VT = 'S005' -VD = 'S006' -N = 'S007' -BvBep = 'S008' -zelfvnw3 = 'S009' -BBp = 'S010' -BBt = 'S011' -BBo = 'S012' +NS = mkresultskey('S001') +OS = mkresultskey('S002') +PV = mkresultskey('S003') +SGG = mkresultskey('S004') +VT = mkresultskey('S005') +VD = mkresultskey('S006') +N = mkresultskey('S007') +BvBep = mkresultskey('S008') +zelfvnw3 = mkresultskey('S009') +BBp = mkresultskey('S010') +BBt = mkresultskey('S011') +BBo = mkresultskey('S012') AG = 33 Ucol = 21 diff --git a/src/sastadev/stringfunctions.py b/src/sastadev/stringfunctions.py index 671413c..6398c1a 100644 --- a/src/sastadev/stringfunctions.py +++ b/src/sastadev/stringfunctions.py @@ -27,17 +27,17 @@ consonants = 'bcdfghjklmnpqrstvwxz\u00E7' # \u00E7 is c cedilla dutch_base_vowels = barevowels + aiguvowels + \ - gravevowels + tremavowels + circumflexvowels + gravevowels + tremavowels + circumflexvowels vowels = dutch_base_vowels dutch_base_diphthongs = ['aa', 'ee', 'ie', 'oo', 'uu', 'ij', 'ei', 'au', 'ou', 'ui', 'eu', 'oe'] dutch_y_diphthongs = ['y' + d for d in dutch_base_vowels] + [d + 'y' for d in dutch_base_vowels] # ryen gaat nog fout ye alleen samen nemen aan begin van woord dutch_y_triphthongs = ['y' + d for d in dutch_base_diphthongs] + \ - [d + 'y' for d in dutch_base_diphthongs] + [d + 'y' for d in dutch_base_diphthongs] dutch_trema_diphthongs = ['äa', "ëe", 'ïe', 'öo', 'üu', 'ëi'] dutch_diphthongs = dutch_base_diphthongs + \ - dutch_y_diphthongs + dutch_trema_diphthongs + dutch_y_diphthongs + dutch_trema_diphthongs dutch_base_triphthongs = ['aai', 'eeu', 'ooi', 'oei'] dutch_y_tetraphthongs = ['y' + d for d in dutch_base_triphthongs] dutch_triphthongs = dutch_base_triphthongs + dutch_y_triphthongs @@ -102,7 +102,7 @@ def charrange(string: str) -> str: syllableheadsre = re.compile(syllableheadspat) monosyllabicpat = r'^' + consonants_star + \ - syllableheadspat + consonants_star + r'$' + syllableheadspat + consonants_star + r'$' monosyllabicre = re.compile(monosyllabicpat) diff --git a/src/sastadev/syllablecount.py b/src/sastadev/syllablecount.py index da8358e..c9d7b87 100644 --- a/src/sastadev/syllablecount.py +++ b/src/sastadev/syllablecount.py @@ -21,7 +21,6 @@ ieuwpattern = r'([EeIi]e)(u)(w)' ieuwre = re.compile(ieuwpattern) - syllable_exception_dictionary = { 'cacao': 2, 'cue': 1, 'camargue': 3, 'bye': 1, 'Paraguay': 3} syll1vseqs = ['aau', 'ai', 'ay', 'eoi', 'eui', 'ey', 'eau', @@ -40,7 +39,6 @@ syll3vseqs = ['aaieo', 'aaieoo', 'aoi', 'eao', 'eeeie', 'eeeii', 'eoa', 'ioa', 'ioui', 'oeieo', 'oeieoo'] - voweltierpattern = f'[{vowels}]+' voweltierre = re.compile(voweltierpattern) @@ -115,7 +113,8 @@ def getfirsttremavowelpos(word: str) -> int: def test1(): - wordlist = ['B-kant', 'ABC-biljet', 'A-B-C-actie', 'cue', 'aan', 'na', 'baan', 'cadeau', 'chaos', 'naäpen', 'be-edigen', 'haaibaai', 'iaen', 'iaën', + wordlist = ['B-kant', 'ABC-biljet', 'A-B-C-actie', 'cue', 'aan', 'na', 'baan', 'cadeau', 'chaos', 'naäpen', + 'be-edigen', 'haaibaai', 'iaen', 'iaën', 'eeuw', 'kieuw', ] for word in wordlist: vt = getvoweltier(word) @@ -126,7 +125,8 @@ def test1(): def test2(): - reflist = [('B-kant', 2), ('ABC-biljet', 3), ('A-B-C-actie', 5), ('cue', 1), ('aan', 1), ('na', 1), ('baan', 1), ('cadeau', 2), ('chaos', 2), ('naäpen', 3), + reflist = [('B-kant', 2), ('ABC-biljet', 3), ('A-B-C-actie', 5), ('cue', 1), ('aan', 1), ('na', 1), ('baan', 1), + ('cadeau', 2), ('chaos', 2), ('naäpen', 3), ('be-edigen', 4), ('haaibaai', 2), ('iaen', 2), ('iaën', 3), ('eeuw', 1), ('kieuw', 1), ('koeieoog', 3), ('expressfout', 2), ('desavoueer', 4)] diff --git a/src/sastadev/tarspform.py b/src/sastadev/tarspform.py index 2ed83c6..3737c35 100644 --- a/src/sastadev/tarspform.py +++ b/src/sastadev/tarspform.py @@ -9,6 +9,7 @@ from sastadev.conf import settings from sastadev.counterfunctions import counter2liststr from sastadev.forms import getformfilename +from sastadev.allresults import mkresultskey ordA = ord('A') comma = ',' @@ -117,13 +118,15 @@ def mktarspform(allresults, _, in_memory=False): for (rowctr, colctr) in basesheet: curval = str(basesheet[(rowctr, colctr)]) if is_id(curval): - newval = getval(allresults, curval) + curvalreskey = mkresultskey(curval) + newval = getval(allresults, curvalreskey) # write newval to the new sheet newvalstr = val2str(newval) worksheet.write(rowctr, colctr, newvalstr) elif is_idc(curval): urval = idc2id(curval) - newval = getval(allresults, urval) + urvalreskey = mkresultskey(urval) + newval = getval(allresults, urvalreskey) cval = len(newval) newvalstr = val2str(cval) worksheet.write(rowctr, colctr, newvalstr) diff --git a/src/sastadev/tblex.py b/src/sastadev/tblex.py index 2c5a17b..07076b2 100644 --- a/src/sastadev/tblex.py +++ b/src/sastadev/tblex.py @@ -1,5 +1,5 @@ """ -The module *tblex* contains functiond that require function +The module *tblex* contains functions that require functions from the lexicon module and from the treebankfunctions module """ diff --git a/src/sastadev/treebankfunctions.py b/src/sastadev/treebankfunctions.py index e4d4a90..f9844e8 100644 --- a/src/sastadev/treebankfunctions.py +++ b/src/sastadev/treebankfunctions.py @@ -1,16 +1,17 @@ -''' +""" various treebank functions -''' +""" -# import sys import re # import logging from copy import copy, deepcopy +# import sys from typing import Any, Callable, Dict, List, Optional, Tuple from lxml import etree +from sastadev.anonymization import pseudonymre # from sastadev.lexicon import informlexiconpos, isa_namepart_uc, informlexicon, isa_namepart # import lexicon as lex from sastadev.conf import settings @@ -21,11 +22,13 @@ UttId) from sastadev.stringfunctions import allconsonants +# from sastadev.tblex import recognised_wordnode, recognised_lemmanode, recognised_wordnodepos, recognised_lemmanodepos + class Metadata: - ''' + """ contains 3 elements, each a string: type, name, value - ''' + """ def __init__(self, thetype, thename, thevalue): self.type = thetype @@ -118,9 +121,12 @@ def md2XMLElement(self): countattvalxpathtemplate = 'count(.//node[@{att}="{val}"])' countcompoundxpath = 'count(.//node[contains(@lemma, "_")])' +monthnames = ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', + 'september', 'oktober', 'november', 'december'] + def adjacent(node1: SynTree, node2: SynTree, stree: SynTree) -> bool: - ''' + """ :param node1: :param node2: :param stree: syntactic structure containing *node1* and *node2* @@ -128,7 +134,7 @@ def adjacent(node1: SynTree, node2: SynTree, stree: SynTree) -> bool: The function *adjacent* determines whether *node1* is adjacent to *node1* in syntactic structure *stree*, and it works correctly in inflated syntactic structures. The two nodes must be nodes for words. - ''' + """ yieldnodes = getnodeyield(stree) for i, n in enumerate(yieldnodes): if yieldnodes[i] == node1: @@ -140,7 +146,7 @@ def adjacent(node1: SynTree, node2: SynTree, stree: SynTree) -> bool: def immediately_precedes(node1: SynTree, node2: SynTree, stree: SynTree) -> bool: - ''' + """ :param node1: :param node2: :param stree: syntactic structure containing *node1* and *node2* @@ -148,7 +154,7 @@ def immediately_precedes(node1: SynTree, node2: SynTree, stree: SynTree) -> bool The function *immediately_precedes* determines whether *node1* immediately precedes *node1* in syntactic structure *stree*, and it works correctly in inflated syntactic structures. The two nodes must be nodes for words. - ''' + """ yieldnodes = getnodeyield(stree) for i, n in enumerate(yieldnodes): if yieldnodes[i] == node1: @@ -159,7 +165,7 @@ def immediately_precedes(node1: SynTree, node2: SynTree, stree: SynTree) -> bool def immediately_follows(node1: SynTree, node2: SynTree, stree: SynTree) -> bool: - ''' + """ :param node1: :param node2: :param stree: syntactic structure containing *node1* and *node2* @@ -167,7 +173,7 @@ def immediately_follows(node1: SynTree, node2: SynTree, stree: SynTree) -> bool: The function *immediately_follows* determines whether *node1* immediately follows *node1* in syntactic structure *stree*, and it works correctly in inflated syntactic structures. The two nodes must be nodes for words. - ''' + """ return immediately_precedes(node2, node1, stree) @@ -327,6 +333,7 @@ def noxpathsentid(syntree: SynTree) -> List[UttId]: results = [child.attrib['sentid']] return results + # put the next one in comments, see below for a different definition # def getsentid(syntree: SynTree) -> Optional[UttId]: # result = getqueryresult(syntree, noxpathquery=noxpathsentid) @@ -381,12 +388,12 @@ def reclastmainclauseof(node: SynTree, current: SynTree) -> SynTree: return result -def getrelchildof(node: SynTree, rel: str) -> SynTree: - ''' +def getrelchildof(node: SynTree, rel: str) -> Optional[SynTree]: + """ gets the first child node with rel=rel under a node. It should always return a word node (so should have a pt attribute; it does not deal properly with conjunction :return: node with grammatical relation rel - ''' + """ if node is None: return None for child in node: @@ -432,13 +439,13 @@ def getextendedheadof(node: SynTree) -> SynTree: def valmerge(v1: str, v2: str, vallist: List[str]) -> str: - ''' + """ presupposes that v1 and v2 occur in the vallist :param v1: :param v2: :param vallist: :return: - ''' + """ v1ind = vallist.index(v1) v2ind = vallist.index(v2) newind = max(v1ind, v2ind) @@ -727,12 +734,12 @@ def getmarkedyield(wordlist: List[str], positions: List[Position]) -> List[str]: def addmetadata(stree: SynTree, meta: Metadata) -> SynTree: - ''' + """ adds meta of class Metadata to stree :param stree: :param meta: type Metadata :return: stree - ''' + """ if stree is None: result = stree elif meta is None: @@ -771,35 +778,35 @@ def istrueclausalnode(thenode: SynTree) -> bool: def iscompound(node: SynTree) -> bool: - ''' + """ The function *iscompound* determines whether a node is a node for a compound word. This is the case if the *lemma* attribute contains the compound separator *compoundsep* .. autodata:: treebankfunctions::compoundsep - ''' + """ lemma = getattval(node, 'lemma') result = compoundsep in lemma return result def isdiminutive(node: SynTree) -> bool: - ''' + """ The function *isdiminutive* checks whether *node* is a node for diminutive word. This is the case if the attribute *graad* has the value *dim*. - ''' + """ graad = getattval(node, 'graad') result = graad == 'dim' return result def issubstantivised_verb(node: SynTree) -> bool: - ''' + """ The function *issubstantivised_verb* checks whether a node is a node for a substantivised verb (i.e. if *pt* = *ww* and *positie* = *nom*) - ''' + """ nodept = getattval(node, 'pt') nodepositie = getattval(node, 'positie') result = nodept == 'ww' and nodepositie == 'nom' @@ -807,17 +814,17 @@ def issubstantivised_verb(node: SynTree) -> bool: def getsiblings(node: SynTree) -> List[SynTree]: - ''' + """ The function *getsiblings* returns the list of sibling nodes of *node* - ''' + """ parent = node.getparent() siblings = [n for n in parent if n != node] return siblings def showtn(tokennode: SynTree) -> str: - '''requires the node to be a node for a token (word)''' + """requires the node to be a node for a token (word)""" if tokennode is None: result = '' else: @@ -833,11 +840,11 @@ def showtns(tokennodelist: List[SynTree]) -> str: def all_lower_consonantsnode(node: SynTree) -> bool: - ''' + """ The function *all_lower_consonantsnode* checks whether *node* is a node for a word that consists of all lower case consonants. - ''' + """ word = getattval(node, 'word') result = all([c.islower() for c in word]) result = result and allconsonants(word) @@ -845,24 +852,24 @@ def all_lower_consonantsnode(node: SynTree) -> bool: def sasta_long(node: SynTree) -> bool: - ''' + """ The function sasta_long checks whether the length of the *word* attribute of the node is greater or equal to *min_sasta_length*: .. autodata:: treebankfunctions::min_sasta_length - ''' + """ word = getattval(node, 'word') result = len(word) >= min_sasta_length return result def spec_noun(node: SynTree) -> bool: - ''' + """ The function *spec_noun* checks whether the node is node of *pt* *spec* which is a name or name part (as determined by the attributes *pos* and *frame*). - ''' + """ pt = getattval(node, 'pt') pos = getattval(node, 'pos') frame = getattval(node, 'frame') @@ -874,10 +881,10 @@ def spec_noun(node: SynTree) -> bool: def is_duplicate_spec_noun(node: SynTree) -> bool: - ''' + """ The function *is_duplicate_spec_noun* checks whether there is any duplicate of the word among its siblings (ignoring case). - ''' + """ siblings = getsiblings(node) result = True word = getattval(node, 'word') @@ -894,6 +901,120 @@ def onbvnwdet(node: SynTree) -> bool: return result +# this function moved to tblex +# def asta_recognised_lexnode(node: SynTree) -> bool: +# """ +# The function *asta_recognised_lexnode* determines whether *node* should count as a +# lexical verb in the ASTA method. +# +# This is the case if *pt* equals *ww* and the node is not a substantivised verb as +# determined by the function *issubstantivised_verb*: +# +# .. autofunction:: treebankfunctions::issubstantivised_verb +# +# """ +# if issubstantivised_verb(node): +# result = False +# else: +# result = getattval(node, 'pt') == 'ww' +# return result + + +def isspecdeeleigen(node: SynTree) -> bool: + pt = getattval(node, 'pt') + spectype = getattval(node, 'spectype') + result = pt == 'spec' and spectype == 'deeleigeb' + return result + + +def ismonthname(node: SynTree) -> bool: + lemma = getattval(node, 'lemma') + result = lemma in monthnames + return result + + +# this function moved to tblex +# def asta_recognised_nounnode(node: SynTree) -> bool: +# """ +# The function *asta_recognised_nounnode* determines whether *node* should count as a +# noun in the ASTA method. +# +# This is the case if +# +# * either the node meets the conditions of *sasta_pseudonym* +# +# .. autofunction:: treebankfunctions::sasta_pseudonym +# +# * or the node is part of name (pt = *spec*, spectype= *deeleigen*) +# +# .. autofunction:: treebankfunctions::isspecdeeleigen +# +# * or the node is a month name (these are not always nouns in Alpino) +# +# .. autofunction:: treebankfunctions::ismonthname +# +# * or the node meets the conditions of *spec_noun* +# +# .. autofunction:: treebankfunctions::spec_noun +# +# * or the node meets the conditions of *is_duplicate_spec_noun* +# +# .. autofunction:: treebankfunctions::is_duplicate_spec_noun +# +# * or the node meets the conditions of *sasta_long* +# +# .. autofunction:: treebankfunctions::sasta_long +# +# * or the node meets the conditions of *recognised_wordnodepos* +# +# .. autofunction:: treebankfunctions::recognised_wordnodepos +# +# * or the node meets the conditions of *recognised_lemmanodepos(node, pos)* +# +# .. autofunction:: treebankfunctions::recognised_lemmanodepos(node, pos) +# +# However, the node should: +# +# * neither consist of lower case consonants only, as determined by *all_lower_consonantsnode*: +# +# .. autofunction:: treebankfunctions::all_lower_consonantsnode +# +# * nor satisfy the conditions of *short_nucl_n*: +# +# .. autofunction:: treebankfunctions::short_nucl_n +# +# """ +# +# if issubstantivised_verb(node): +# pos = 'ww' +# else: +# pos = 'n' +# result = sasta_pseudonym(node) +# result = result or isspecdeeleigen(node) +# result = result or ismonthname(node) +# result = result or spec_noun(node) +# result = result or is_duplicate_spec_noun(node) +# result = result or sasta_long(node) +# result = result or recognised_wordnodepos(node, pos) +# result = result or recognised_lemmanodepos(node, pos) +# result = result and not (all_lower_consonantsnode(node)) +# result = result and not (short_nucl_n(node)) +# return result + +# this function moved to tblex +# def asta_recognised_wordnode(node: SynTree) -> bool: +# result = sasta_pseudonym(node) +# result = result or spec_noun(node) +# result = result or is_duplicate_spec_noun(node) +# result = result or sasta_long(node) +# result = result or recognised_wordnode(node) +# result = result or recognised_lemmanode(node) +# result = result or isnumber(node) +# result = result and not (all_lower_consonantsnode(node)) +# result = result and not (short_nucl_n(node)) +# return result + + def isnumber(node: SynTree) -> bool: word = getattval(node, 'word') thematch = numberre.match(word) @@ -902,25 +1023,25 @@ def isnumber(node: SynTree) -> bool: def sasta_short(inval: str) -> bool: - ''' + """ The function *sasta_short* determines whether the string *inval* is short, i.e, with a length smaller or equal than *sasta_short_length*: .. autodata:: treebankfunctions::sasta_short_length - ''' + """ result = len(inval) <= sasta_short_length return result def short_nucl_n(node: SynTree) -> bool: - ''' + """ The function *short_nucl_n* determines whether *node* is a node for a word with *pt* equal to *n*, relation *nucl*, and whose *word* attribute is short (as determined by the function *sasta_short*) .. autofunction:: treebankfunctions::sasta_short - ''' + """ pt = getattval(node, 'pt') rel = getattval(node, 'rel') word = getattval(node, 'word') @@ -928,19 +1049,8 @@ def short_nucl_n(node: SynTree) -> bool: return result -#: The constant *sasta_pseudonyms* list the strings that replace names for -#: pseudonymisation purposes. -sasta_pseudonyms = ['NAAM', 'VOORNAAM', 'ACHTERNAAM', 'ZIEKENHUIS', 'STRAAT', 'PLAATS', 'PLAATSNAAM', 'KIND', 'BEROEP', - 'OPLEIDING'] -#: The constant *pseudonym_patternlist* contains regular expressions for pseudonyms -#: based on elements from the *sasta_pseudonyms* (pseudonym + number). -pseudonym_patternlist = [r'^{}\d?$'.format(el) for el in sasta_pseudonyms] -pseudonym_pattern = vertbar.join(pseudonym_patternlist) -pseudonymre = re.compile(pseudonym_pattern) - - def sasta_pseudonym(node: SynTree) -> bool: - ''' + """ The function *sasta_pseudonym* determines whether the *word* attribute of *node* is a SASTA pseudonym. It uses the *pseudonymre* regular expression, which is created by joining @@ -953,7 +1063,7 @@ def sasta_pseudonym(node: SynTree) -> bool: .. autodata:: treebankfunctions::pseudonym_patternlist - ''' + """ word = getattval(node, 'word') match = pseudonymre.match(word) result = match is not None @@ -963,6 +1073,7 @@ def sasta_pseudonym(node: SynTree) -> bool: nodeformat = '{}/{}{}' nodeformatplus = nodeformat + '[' + # @@need to add a variant that returns a string @@ -1004,11 +1115,11 @@ def simpleshow2(stree: SynTree, showchildren: bool = True) -> None: def showflatxml(elem: SynTree) -> str: - ''' + """ :param elem: xml element :return: string that represents the element and its immediate children - ''' + """ start = '<{}>'.format(elem.tag) end = ''.format(elem.tag) middle = ['<{}/>'.format(child.tag) for child in elem] @@ -1018,11 +1129,11 @@ def showflatxml(elem: SynTree) -> str: def uniquenodes(nodelist: List[SynTree]) -> List[SynTree]: - ''' + """ :param nodelist: list of nodes all from a single syntactic structure :return: nodelist without duplicates. Two nodes are considered duplicates if the begin and end attributes are identical - ''' + """ done = [] resultlist = [] for node in nodelist: @@ -1126,12 +1237,12 @@ def getbasicindexednodesmap(stree: SynTree) -> Dict[str, SynTree]: return indexednodes -def nodecopy(node: SynTree) -> SynTree: - ''' +def nodecopy(node: SynTree) -> Optional[SynTree]: + """ The function *nodecopy* copies a node without its children :param node: node, an lxml.etree Element :return: a node with no children, otherwise a copy of the input node - ''' + """ if node is None: return None else: @@ -1147,6 +1258,7 @@ def bareindexnode(node: SynTree) -> bool: # print(props2str(get_node_props(node)), result, file=sys.stderr) return (result) + # herdefinieren want met UD hebben terminale nodes wel children (maar geen children met tag=node) @@ -1157,11 +1269,11 @@ def terminal(node: SynTree) -> bool: def oldindextransform(stree: SynTree) -> SynTree: - ''' + """ produces a new stree in which all index nodes are replaced by their antecedent nodes :param stree: input stree :return: stree with all index nodes replaced by the nodes of their antecedents - ''' + """ indexednodesmap = getindexednodesmap(stree) # for ind, tree in indexednodesmap.items(): @@ -1172,7 +1284,7 @@ def oldindextransform(stree: SynTree) -> SynTree: def indextransform(stree: SynTree) -> SynTree: - ''' + """ :param stree: input stree :return: stree with all index nodes replaced by the nodes of their antecedents @@ -1192,7 +1304,7 @@ def indextransform(stree: SynTree) -> SynTree: .. autofunction:: treebankfunctions::indextransform2 - ''' + """ basicindexednodesmap = getbasicindexednodesmap(stree) # for ind, tree in indexednodesmap.items(): @@ -1205,7 +1317,7 @@ def indextransform(stree: SynTree) -> SynTree: # deze robuust maken tegen andere nodes dan node (metadata, alpino_ds etc) # waarschijnlijk is node.tag == 'node'in baseindexnode voldoende -def indextransform2(stree: SynTree, indexednodesmap: Dict[str, SynTree]) -> SynTree: +def indextransform2(stree: SynTree, indexednodesmap: Dict[str, SynTree]) -> Optional[SynTree]: """ The function *indextransform2* takes as input a syntactic structure *stree* and an index-SynTree dictionary. It creates a new tree in which each bare index node in *stree* with index *i* is replaced by its antecedent @@ -1241,7 +1353,7 @@ def indextransform2(stree: SynTree, indexednodesmap: Dict[str, SynTree]) -> SynT return newstree -def getstree(fullname: FileName) -> etree._ElementTree: +def getstree(fullname: FileName) -> Optional[SynTree]: try: thefile = open(fullname, 'r', encoding='utf8') except FileNotFoundError as e: @@ -1286,7 +1398,7 @@ def getstree(fullname: FileName) -> etree._ElementTree: streestrings = {} -streestrings[1] = ''' +streestrings[1] = """ @@ -1328,9 +1440,9 @@ def getstree(fullname: FileName) -> etree._ElementTree: -''' +""" -streestrings[2] = ''' +streestrings[2] = """ @@ -1402,7 +1514,7 @@ def getstree(fullname: FileName) -> etree._ElementTree: -''' +""" strees = {} for el in streestrings: @@ -1464,14 +1576,14 @@ def adaptsentence(stree: SynTree) -> SynTree: def transplant_node(node1: SynTree, node2: SynTree, stree: SynTree) -> SynTree: - ''' + """ replace node1 by node2 in stree Only do so if node1 and node2 have no children and if their spans are identical :param node1: node to be replaced in stree :param node2: node to replace node1 in stree :param stree: tree in which the replacement takes place :return: the stree in which the input parameter is modified - ''' + """ # find the parent of node1 # determine the index of node1 sentid = getsentid(stree) @@ -1505,12 +1617,12 @@ def transplant_node(node1: SynTree, node2: SynTree, stree: SynTree) -> SynTree: def get_parentandindex(node: SynTree, stree: SynTree) -> Optional[Tuple[SynTree, int]]: - ''' + """ :param node: node to find the parent of :param stree: stree to find the parent of node in :return: (parentnode::node, index::int) or None - ''' + """ nodespan = getspan(node) idx = 0 @@ -1535,24 +1647,28 @@ def getspan(node: SynTree) -> Span: def lbrother(node: SynTree, tree: SynTree) -> Optional[SynTree]: nodebegin = getattval(node, 'begin') + def condition(n): return getattval(n, 'end') == nodebegin + result = findfirstnode(tree, condition) return result def rbrother(node: SynTree, tree: SynTree) -> Optional[SynTree]: nodeend = getattval(node, 'end') + def condition(n): return getattval(n, 'begin') == nodeend + result = findfirstnode(tree, condition) return result def infl_lbrother(node: SynTree, tree: SynTree) -> Optional[SynTree]: - ''' + """ :param node: the node for the relevant word :param tree: the syntactic structure that contains *node* :return: The function *infl_lbrother* returns the node for the word that immediately precedes the word for *node* if there is one, otherwise None - ''' + """ nodeyield = getnodeyield(tree) for i, n in enumerate(nodeyield): if nodeyield[i] == n and i > 0: @@ -1561,11 +1677,11 @@ def infl_lbrother(node: SynTree, tree: SynTree) -> Optional[SynTree]: def infl_rbrother(node: SynTree, tree: SynTree) -> Optional[SynTree]: - ''' + """ :param node: the node for the relevant word :param tree: the syntactic structure that contains *node* :return: The function *infl_lbrother* returns the node for the word that immediately follows the word for *node* if there is one, otherwise None - ''' + """ nodeyield = getnodeyield(tree) for i, n in enumerate(nodeyield): if nodeyield[i] == n and i < len(nodeyield) - 1: @@ -1573,7 +1689,7 @@ def infl_rbrother(node: SynTree, tree: SynTree) -> Optional[SynTree]: return None -def findfirstnode(tree: SynTree, condition: Callable[[SynTree], bool]) -> SynTree: +def findfirstnode(tree: SynTree, condition: Callable[[SynTree], bool]) -> Optional[SynTree]: if condition(tree): return tree else: @@ -1632,7 +1748,7 @@ def strliststr2list(liststr: str, sep: str = comma) -> List[str]: return cleanlist -def find1(tree: SynTree, xpathquery: str) -> SynTree: +def find1(tree: SynTree, xpathquery: str) -> Optional[SynTree]: if tree is None: return None results = tree.xpath(xpathquery) @@ -1684,7 +1800,7 @@ def gettreepos(origpos: PositionStr, reverseindex: List[PositionStr]) -> Positio return result -def deletewordnode(tree: SynTree, begin: Position) -> SynTree: +def deletewordnode(tree: SynTree, begin: Position) -> Optional[SynTree]: newtree = deepcopy(tree) if newtree is None: return newtree @@ -1715,18 +1831,18 @@ def showtree(tree: SynTree, text: Optional[str] = None) -> None: def deletechildlessparent(thenode: SynTree) -> None: - ''' + """ deletes thenode if it has no children, and if its parent is childless after that, applies itself to the parent :param thenode: :return: - ''' + """ if list(thenode) == []: theparent = thenode.getparent() theparent.remove(thenode) deletechildlessparent(theparent) -def olddeletewordnodes(tree: SynTree, begins: List[Position]) -> SynTree: +def olddeletewordnodes(tree: SynTree, begins: List[Position]) -> Optional[SynTree]: # print('tree:') # etree.dump(tree, pretty_print=True) newtree = deepcopy(tree) @@ -1762,6 +1878,7 @@ def olddeletewordnodes(tree: SynTree, begins: List[Position]) -> SynTree: return newtree + # redefine: no children with tag == 'node' (because of UD extensions ) @@ -1778,7 +1895,7 @@ def deletewordnodes(tree: SynTree, begins: List[Position]) -> SynTree: return newtree -def deletewordnodes2(tree: SynTree, begins: List[Position]) -> SynTree: +def deletewordnodes2(tree: SynTree, begins: List[Position]) -> Optional[SynTree]: if tree is None: return tree for child in tree: @@ -1796,7 +1913,7 @@ def deletewordnodes2(tree: SynTree, begins: List[Position]) -> SynTree: elif 'cat' in child.attrib and childless(child): tree.remove(child) # tree begin en end bijwerken - if tree. tag == 'node': + if tree.tag == 'node': newchildren = [n for n in tree] if newchildren != []: (minbegin, maxend) = getbeginend(newchildren) @@ -1830,7 +1947,7 @@ def olddeletewordnodes2(tree: SynTree, begins: List[Position]): def treeinflate(stree: SynTree, start: int = 10, inc: int = 10) -> None: - ''' + """ The function *treeinflate* adapts the input tree *stree* in such a way that: * for word nodes: the int value of the *begin* attribute (ib) is changed to str(newib =(ib + 1) * 10), and the value of the *end* attribute to str(newib + 1) @@ -1848,7 +1965,7 @@ def treeinflate(stree: SynTree, start: int = 10, inc: int = 10) -> None: **Remark** This should be changed for words so that newib = start + (ib * inc) and newie = newib + 1 - ''' + """ # fatstree = deepcopy(stree) if stree is None: pass @@ -1877,7 +1994,7 @@ def isidentitymap(dct: Dict[Any, Any]) -> bool: return result -def updatetokenpos(stree: SynTree, tokenposdict: PositionMap) -> SynTree: +def updatetokenpos(stree: SynTree, tokenposdict: PositionMap) -> Optional[SynTree]: if stree is None: return stree if isidentitymap(tokenposdict): @@ -1963,7 +2080,7 @@ def getptsubclass(pt): def subclasscompatible(sc1, sc2): result = (sc1 == sc2) or \ - (sc1 in ['pr', 'refl'] and sc2 in ['pr', 'refl']) or\ + (sc1 in ['pr', 'refl'] and sc2 in ['pr', 'refl']) or \ (sc1 in ['pr', 'pers'] and sc2 in ['pr', 'pers']) or \ (sc1 in ['init', 'versm'] and sc2 in ['init', 'versm']) return result @@ -1984,12 +2101,12 @@ def fatparse(utterance: str, tokenlist: List[Token]) -> SynTree: def update_cleantokenisation(stree: SynTree, begin: PositionStr) -> SynTree: - ''' + """ updates the tokenisation info of the cleaned utterance :param stree: tree, will be modified :param begin: value of the begin attribute of the deleted wordnode :return: None - ''' + """ intbegin = int(begin) oldcleanedtokmeta = find1(stree, '//xmeta[@name="cleanedtokenisation"]') cleanedtokmeta = copy(oldcleanedtokmeta) @@ -2038,10 +2155,10 @@ def getbeginend(nodelist: List[SynTree]) -> Span: def normalisebeginend(stree: SynTree) -> None: - ''' + """ :param stree: syntactic structure :return: stree with the values of begin and end attributes normalised - ''' + """ # etree.dump(stree, pretty_print=True) # begins = [getattval(node, 'begin') for node in stree.xpath('.//node[@pt or @pos]')] # we must include indexed nodes but not have duplicates begins = {getattval(node, 'begin') @@ -2051,12 +2168,12 @@ def normalisebeginend(stree: SynTree) -> None: def normalisebeginend2(stree: SynTree, sortedbegins: List[PositionStr]) -> None: - ''' + """ :param stree: syntactic structure :param sortedbegins: sorted list of begin values of @pt or @pos nodes :return: None - ''' + """ children = list(stree) for child in children: normalisebeginend2(child, sortedbegins) @@ -2076,12 +2193,12 @@ def normalisebeginend2(stree: SynTree, sortedbegins: List[PositionStr]) -> None: def updatebeginend(stree: SynTree, begin: PositionStr) -> None: # do not use this anymore - ''' + """ updates the begin and end values of nodes in a tree in which a word node with begin=begin has been removed :param stree: Element_tree, input tree, which is modified :param begin: (string representation of an integer): value of the begin attribute of the word node that has been removed :return: None - ''' + """ children = list(stree) for child in children: updatebeginend(child, begin) diff --git a/src/sastadev/tryderegularize.py b/src/sastadev/tryderegularize.py new file mode 100644 index 0000000..f5e36a9 --- /dev/null +++ b/src/sastadev/tryderegularize.py @@ -0,0 +1,14 @@ +from deregularise import correctinflection + +trylist = ['ebakt', 'sebakt', 'sebakte'] + +def tryme(): + for el in trylist: + corrections = correctinflection(el) + print(f'{el}:') + for correction in corrections: + print(correction) + + +if __name__ == '__main__': + tryme() \ No newline at end of file diff --git a/src/sastadev/tryexcelfilter.py b/src/sastadev/tryexcelfilter.py new file mode 100644 index 0000000..c8b6976 --- /dev/null +++ b/src/sastadev/tryexcelfilter.py @@ -0,0 +1,41 @@ +from xlsx import mkworkbook +## too difficult must be integrated in xlsx mkworkbook and xlsx_writerow + +header = ['data1', 'data2', 'infor'] + +data = [[1, 2, 'yes'], + [3, 4, 'yes'], + [5, 6, 'no'], + [7, 8, 'no'] + ] + +outfullname = 'testfilter.xlsx' + +wb = mkworkbook(outfullname, [header], data, freeze_panes=(1,0)) +ws = wb.get_worksheet_by_name('Sheet1') + +# Set the autofilter. +worksheet.autofilter('A1:D51') + +# Add the filter criteria. The placeholder "Region" in the filter is +# ignored and can be any string that adds clarity to the expression. +worksheet.filter_column(0, 'Region == East') + +# Hide the rows that don't match the filter criteria. +row = 1 +for row_data in (data): + region = row_data[0] + + # Check for rows that match the filter. + if region == 'East': + # Row matches the filter, display the row as normal. + pass + else: + # We need to hide rows that don't match the filter. + worksheet.set_row(row, options={'hidden': True}) + + worksheet.write_row(row, 0, row_data) + + # Move on to the next worksheet row. + row += 1 +wb.close() \ No newline at end of file diff --git a/src/sastadev/trygaatie.py b/src/sastadev/trygaatie.py new file mode 100644 index 0000000..0c4ac9f --- /dev/null +++ b/src/sastadev/trygaatie.py @@ -0,0 +1,24 @@ +from sastadev.corrector import gaatie + + +testset = [('kan-ie', 'kan ie'), + ('wil-ie', 'wil ie'), + ('moet-ie', 'moet ie'), + ('gaat-ie', 'gaat ie'), + ('moettie', 'moet ie'), + ('gaatie', 'gaat ie') + ] + +def trygaatie(): + errorfound = False + for wrd, corr in testset: + results = gaatie(wrd) + if results != [corr]: + print(f'Error: {results} != [{corr}]') + errorfound = True + + if errorfound: + raise AssertionError + +if __name__ == '__main__': + trygaatie() \ No newline at end of file diff --git a/src/sastadev/update_inflectioncorrection.py b/src/sastadev/update_inflectioncorrection.py new file mode 100644 index 0000000..02ba647 --- /dev/null +++ b/src/sastadev/update_inflectioncorrection.py @@ -0,0 +1,38 @@ +""" +The module *update_inflectioncorrection* generates a new version of the file inflectioncorrection. +It reads the file *irregverbfilename* and generates paradigms by using the function *makeparadigm* +""" + +import os +from sastadev.conf import settings +from sastadev.deregularise import (correctionfullname, getcorrections, + makeparadigm, tab) + + +# read the irregular verbs + +irregverbfilename = r"./data/DutchIrregularVerbs.tsv" +irregverbfile = open(irregverbfilename, 'r', encoding='utf8') + +forms = {} +for line in irregverbfile: + if line[-1] == '\n': + line = line[:-1] + row = line.split(tab) + forms[row[0]] = row + +irregverbfile.close() + +correction = {} +# initialisatie +for el in forms: + triples = makeparadigm(el, forms) + for wrong, meta, good in triples: + if good != wrong: + correction[wrong] = good, meta + + +with open(correctionfullname, 'w', encoding='utf8') as correctionfile: + for w in correction: + print(w, correction[w][0], correction[w] + [1], sep=tab, file=correctionfile) diff --git a/src/sastadev/vuandnonwords.py b/src/sastadev/vuandnonwords.py new file mode 100644 index 0000000..f55e994 --- /dev/null +++ b/src/sastadev/vuandnonwords.py @@ -0,0 +1,68 @@ +from sastadev.vunonwordlexicons import filledpauseslexicon, nomlulexicon, normalize, vuwordslexicon + + + +def markfilledpauses(utt): + newtokens = [] + tokens = utt.split() + for token in tokens: + if token in filledpauseslexicon: + newtoken = f'{fillermarking}{token}' + else: + newtoken = token + newtokens.append(newtoken) + oututt = space.join(newtokens) + return oututt + +def marknomluwords(utt): + newtokens = [] + tokens = utt.split() + ltokens = len(tokens) + for i, token in enumerate(tokens): + if token in nomlulexicon: + if (i < ltokens -1 and not tokens[i+1].startswith('[:')) or i == ltokens - 1: + newtoken = f'{nonwordmarking}{token}' + else: + newtoken = token + else: + newtoken = token + newtokens.append(newtoken) + oututt = space.join(newtokens) + return oututt + +def containsrealwords(utt): + utt, _ = cleantext(utt, repkeep=False) + cleanutt = normalize(utt) + tokens = cleanutt.split() + for token in tokens: + if token not in filledpauseslexicon and \ + token not in nomlulexicon and \ + token not in vuwordslexicon and \ + token not in interpunctions and \ + token[0] != '=': + return True + return False + + +def markvuwords(utt): + newtokens = [] + cleanutt = normalize(utt) + tokens = cleanutt.split() + if not containsrealwords(utt): + for token in tokens: + if token in vuwordslexicon: + newtoken = f'{nonwordmarking}{token}' + else: + newtoken = token + newtokens.append(newtoken) + else: + newtokens = [] + if len(tokens) >= 2 and tokens[0] in vuwordslexicon and tokens[1] == comma: + newtokens.append(f'{nonwordmarking}{tokens[0]}') + newtokens.extend(tokens[1:]) + else: + newtokens = tokens + oututt = space.join(newtokens) + return oututt + + diff --git a/src/sastadev/vunonwordlexicons.py b/src/sastadev/vunonwordlexicons.py new file mode 100644 index 0000000..539755c --- /dev/null +++ b/src/sastadev/vunonwordlexicons.py @@ -0,0 +1,59 @@ +from sastadev.lexicon import known_word, initializelexicon +import re +import os +from sastadev.conf import settings + + +space = ' ' +interpunction = """.,/:;?!"'""" + + + + + + +# initialize lexicons +lexiconfoldername = 'filledpauseslexicon' + +filledpauseslexiconfilename = 'filledpauseslexicon.txt' +filledpauseslexiconfullname = os.path.join(settings.SD_DIR, lexiconfoldername, filledpauseslexiconfilename) +filledpauseslexicon = initializelexicon(filledpauseslexiconfullname) + + + + +nomlulexiconfilename = 'notanalyzewords.txt' +nomlulexiconfullname = os.path.join(lexiconfoldername, nomlulexiconfilename) +nomlulexicon = initializelexicon(nomlulexiconfullname) + +vuwordslexiconfilename = 'vuwordslexicon.txt' +vuwordslexiconfullname = os.path.join(lexiconfoldername, vuwordslexiconfilename) +vuwordslexicon = initializelexicon(vuwordslexiconfullname) + + +junk = 0 + + +def alldutchwords(correct: str) -> bool: + newcorrect = normalize(correct) + words = newcorrect.split() + result = all([isvalidtoken(word) for word in words]) + return result + + +def isvalidtoken(wrd:str) -> bool: + result = known_word(wrd) or wrd in interpunction + return result + + +def normalize(utt): + #replace interpunction by space + interpunction but not when preceded by = or [ or (; this is a bit ad hoc maybe uese the sastadev chat tokenization + newutt = utt + newutt = re.sub(r"([^=0\[\(])([\?\.!,;>'])", r'\1 \2', newutt) + newutt = re.sub(r"([<'])", r'\1 ', newutt) + tokens = newutt.split() + newutt = space.join(tokens) + return newutt + + + diff --git a/tests/deregularise_test.py b/tests/deregularise_test.py index 356556b..a2f8da6 100644 --- a/tests/deregularise_test.py +++ b/tests/deregularise_test.py @@ -3,90 +3,38 @@ import pytest from sastadev.conf import settings -from sastadev.deregularise import (correctionfilename, getcorrections, +from sastadev.deregularise import (correctionfilename, correctinflection, makeparadigm, tab) +thelist = [('daan', 'gedaan'), ('vervald', 'vervallen'), ('opgevald', 'opgevallen'), + ('overvald', 'overvallen'), ('oververvald', 'oververvallen'), ('gevalt', 'gevallen'), + ('ebakt', 'gebakken'), ('sebakt', 'gebakken'), ('sebakte', 'gebakken'), + ('slaapte', 'sliep'), ('geslaapt', 'geslapen'), + ('sliepten', 'sliepen'), ('sliepte', 'sliep'), + ('aaneengeloopt', 'aaneengelopen'), + ('gekijken', 'gekeken'), ('gekeekt', 'gekeken'), ('uitgekijken', 'uitgekeken'), + ('uitgekeekt', 'uitgekeken') -@pytest.mark.skip(reason='test code does not work') -def test_deregularise(): # noqa: C901 - # read the irregular verbs - - irregverbfilename = 'DutchIrregularVerbs.tsv' - irregverbfile = open(irregverbfilename, 'r', encoding='utf8') - - forms = {} - for line in irregverbfile: - if line[-1] == '\n': - line = line[:-1] - row = line.split(tab) - forms[row[0]] = row - - irregverbfile.close() - - correction = {} - # initialisatie - for el in forms: - triples = makeparadigm(el, forms) - # (regularpastsg, regularpastpl, pastparticiple, pastpartwithe, wrongpastpart, wrongpastpart2, wrongpastpart2a, wrongenpastpart) = regular - # (goodpastsg, goodpastpl, goodpastpart, goodpastpartwithe, goodpastpart, goodpastpart, goodpastpart, goodpastpart) = goodforms + ] - # print(el, stem, stemFS, takesge, regularpastsg, regularpastpl, pastparticiple, pastpartwithe, wrongpastpart) - - # fill the lookup table - - for wrong, meta, good in triples: - if good != wrong: - correction[wrong] = good, meta +# @pytest.mark.skip(reason='test code does not work') +def test_deregularise(): # noqa: C901 - # if goodpastsg != regularpastsg: - # correction[regularpastsg] = goodpastsg - # if goodpastpl != regularpastpl: - # correction[regularpastpl] = goodpastpl - # if goodpastpart != pastparticiple: - # correction[pastparticiple] = goodpastpart - # if goodpastpartwithe != pastpartwithe: - # correction[pastpartwithe] = goodpastpartwithe - # if goodpastpart != wrongpastpart: - # correction[wrongpastpart] = goodpastpart - # if goodpastpart != wrongpastpart2: - # correction[wrongpastpart2] = goodpastpart - # if goodpastpart != wrongpastpart2a: - # correction[wrongpastpart2a] = goodpastpart - # if goodpastpart != wrongenpastpart: - # correction[wrongenpastpart] = goodpastpart + for wrong, good in thelist: + cands = correctinflection(wrong) + for cand, m in cands: + print(f'({wrong}, {good}, {m})' ) - # test - uniquewords = {w for (w, _, _) in triples} - for w in uniquewords: - for corrected, meta in getcorrections(w, correction): - print(w, corrected, meta) + if cand != good: + pass - for wrong, good in [('daan', 'gedaan'), ('vervald', 'vervallen'), ('opgevald', 'opgevallen'), - ('overvald', 'overvallen'), ('oververvald', 'oververvallen'), ('gevalt', 'gevallen')]: - cands = getcorrections(wrong, correction) if cands == []: print('WRONG', wrong, '', good) for cand, m in cands: - if cand == good: - print('OK', wrong, cand, good, m) - else: + if cand != good: print('WRONG', wrong, cand, good, m) + errorfound = True - testlist = ['kijken', 'gaan', 'eten'] - for el in testlist: - triples = makeparadigm(el, forms) - # (regularpastsg, regularpastpl, pastparticiple, pastpartwithe, wrongpastpart, wrongpastpart2, wrongpastpart2a, wrongenpastpart) = regular - # (goodpastsg, goodpastpl, goodpastpart, goodpastpartwithe, goodpastpart, goodpastpart1, goodpastpart2, goodpastpart3) = goodforms - uniquewords = {w for (w, _, _) in triples} - for (w, _, _) in triples: - for corrected, m in getcorrections(w, correction): - print(w, corrected, m) - for w in ['sliepten', 'sliepte', 'aaneengeloopt', 'gekijken', 'gekeekt', 'uitgekijken', 'uitgekeekt']: - for corrected, m in getcorrections(w, correction): - print(w, corrected, m) - correctionfile = open(os.path.join( - settings.SD_DIR, correctionfilename), 'w', encoding='utf8') - for w in correction: - print(w, correction[w][0], correction[w] - [1], sep=tab, file=correctionfile) +if __name__ == '__main__': + test_deregularise() \ No newline at end of file diff --git a/tests/iedims_test.py b/tests/iedims_test.py index 50bac7d..cd29623 100644 --- a/tests/iedims_test.py +++ b/tests/iedims_test.py @@ -1,93 +1,7 @@ -import csv +from sastadev.iedims import getjeforms -import pytest +iewords = ['poppie', 'kassie', 'boekie'] -from sastadev import lexicon -from sastadev.iedims import (bigfilesep, getbaseinlexicon, getjeforms, - getjeformsnolex, slash) - -testset = [('cluppie', ['clubje', 'clupje']), ('bakkie', ['bakje']), ('dakkie', ['dakje']), ('darmpie', ['darmpje']), - ('doppie', ['dopje']), ('rapie', ['raapje']), ('huisie', - ['huisje']), ('kassie', ['kasje', 'kastje']), - ('vrachie', ['vrachje', 'vrachtje']), - ('dorpie', ['dorpje']), ('verfie', ['verfje']), ('fessie', [ - 'fesje', 'fezje']), ('vessie', ['vestje']), - ('feessie', ['feestje']), ('beessie', ['beestje']), ('meissie', ['meisje'])] - -testlexicon = ['clubje', 'bakje', 'dakje', 'darmpje', 'dopje', 'raapje', 'huisje', - 'kasje', 'kastje', 'vrachtje', 'dorpje', 'verfje', 'fezje', 'vestje', 'feestje', 'beestje', 'meisje'] - - -def localtest(theregex, replaces, testlist): - for (w, g) in testlist: - m = theregex.match(w) - for repl in replaces: - r = theregex.sub(repl, w) - if r == g: - print('OK: {}:{}'.format(w, r)) - else: - print('NOT OK: {} yields {} but it should be {}'.format(w, r, g)) - - -def readbigtestset(infilename): - results = [] - with open(infilename, mode='r', encoding='utf8') as infile: - myreader = csv.reader(infile, delimiter=bigfilesep) - rowctr = 0 - for row in myreader: - rowctr += 1 - if rowctr == 1: - continue # skip the header - newpair = (row[0], [row[2]]) - results.append(newpair) - return results - - -def report(results, ieform, jeforms, logfile): - aresultinlexiconfound = False - aresultOK = False - if ieform in jeforms: - print('OK: {}:{}'.format(ieform, ieform), file=logfile) - else: - for result in results: - if result in jeforms: - aresultOK = True - if lexicon.informlexicon(result): - aresultinlexiconfound = True - print('OK: {}:{}'.format(ieform, result), file=logfile) - elif ieform != result: - base = getbaseinlexicon(result) - if base is not None: - aresultinlexiconfound = True - print('OK: {}:{} ({} in lexicon)'.format( - ieform, result, base), file=logfile) - else: - print('replacement for {} not in lexicon: {}'.format( - ieform, result), file=logfile) - if not aresultOK: - print('NOT OK: {} : {}; should be: {}'.format( - ieform, slash.join(results), slash.join(jeforms)), file=logfile) - elif not aresultinlexiconfound: - print('No replacements for: {} : {} found in the lexicon'.format( - ieform, slash.join(results)), file=logfile) - - -@pytest.mark.skip(reason='test code does not work') -def test_iedims(): - # debugresults = getjeformsnolex('hachje') - debugresults = getjeformsnolex('schoffie') - testfilename = 'iediminutives/iedimsgold2.csv' - bigtestset = readbigtestset(testfilename) - testset = bigtestset - logfilename = 'iediminutives/iedims.log' - logfile = open(logfilename, 'w', encoding='utf8') - for (ieform, jeforms) in testset: - results = getjeformsnolex(ieform) - report(results, ieform, jeforms, logfile) - - -def test_iedims_je(): - iewords = ['poppie', 'kassie', 'boekie'] - jewords = [getjeforms(word) for word in iewords] - - assert jewords == [['popje', 'poptje', 'poptje', 'pobje', 'pobje'], ['kasje', 'kastje', 'kastje', 'kazje', 'kazje'], ['boekje', 'boekje', 'boekje']] \ No newline at end of file +for ieword in iewords: + jewords = getjeforms(ieword) + print(jewords) \ No newline at end of file diff --git a/tests/mkref_dereg.py b/tests/mkref_dereg.py new file mode 100644 index 0000000..a0b612c --- /dev/null +++ b/tests/mkref_dereg.py @@ -0,0 +1,7 @@ +from deregularise_test import thelist +from sastadev.deregularise import correctinflection + +for wrong, good in thelist: + cands = correctinflection(wrong) + for cand, m in cands: + print(f"('{wrong}', '{good}', '{m}')" ) diff --git a/tests/mksyllcounttest.py b/tests/mksyllcounttest.py new file mode 100644 index 0000000..3e75748 --- /dev/null +++ b/tests/mksyllcounttest.py @@ -0,0 +1,89 @@ +import os +import re +from collections import Counter, defaultdict +from typing import Dict, List + +from sastadev.celexlexicon import dmwdict +from sastadev.stringfunctions import tremavowels +from sastadev.syllablecount import (getfirsttremavowelpos, getvoweltier, + vowelsylldict) +from sastadev.xlsx import add_worksheet, mkworkbook + +maxexamples = 10 +vseqs = Counter() +examples = defaultdict(list) +status = {} + +qupattern = fr'([Qq])([Uu])([^{tremavowels}])' +qure = re.compile(qupattern) + +yogapattern = '^y' +yogare = re.compile(yogapattern) + +ouillpattern = r'(ou)(i)(ll)' +ouillre = re.compile(ouillpattern) + +ieuwpattern = r'([EeIi]e)(u)(w)' +ieuwre = re.compile(ieuwpattern) + + +def reduceexamples(examples: Dict[str, List]) -> Dict[str, List]: + reducedexamples = {} + for vseq, examplelist in examples.items(): + lexamplelist = len(examplelist) + if lexamplelist <= maxexamples: + reducedexamples[vseq] = examplelist + else: + jump = lexamplelist // maxexamples + reducedexamplelist = [] + for i in range(10): + theindex = i * jump + selectedexample = examplelist[theindex] + reducedexamplelist.append(selectedexample) + reducedexamples[vseq] = reducedexamplelist + return reducedexamples + + +for word in dmwdict: + reducedword = word + # remove u after q unless followed by tremavowel + reducedword = qure.sub(r'\1\3', reducedword) + # remove y at the beginning of a word (yoga v. halcyon) will not work in compounds hulpyogi + reducedword = yogare.sub(r'', reducedword) + # oui -> ou before ll + reducedword = ouillre.sub(r'\1\3', reducedword) + # ieuw, eeuw -> iew, eew + reducedword = ieuwre.sub(r'\1\3', reducedword) + vt = getvoweltier(reducedword) + for vs in vt: + if vs not in vseqs: + check = len(vs) == 1 or getfirsttremavowelpos( + vs) >= 0 or vs in vowelsylldict + ok = 'ok' if check else 'no' + status[vs] = ok + examples[vs].append(word) + vseqs.update(vt) + +header = ['vseq', 'frq'] +data = sorted(vseqs.items(), key=lambda item: item[1], reverse=True) +exampleheader = ['vseq', 'status', 'examples'] +reducedexamples = reduceexamples(examples) +exampledata = [] +for vseq in vseqs: + vseq_status = status[vseq] if vseq in status else 'unknown' + if vseq in reducedexamples: + examplestr = ', '.join(reducedexamples[vseq]) + else: + examplestr = "$$$" + print(f'Vowel sequence {vseq} not in examples') + row = [vseq, vseq_status, examplestr] + exampledata.append(row) +sortedexampledata = sorted(exampledata, key=lambda el: el[0]) + +outfilename = 'CELEXvowelsequences.xlsx' +outpath = r'D:\Dropbox\jodijk\Utrecht\Projects\SASTA emer\syllablecount' +outfullname = os.path.join(outpath, outfilename) + +wb = mkworkbook(outfullname, [header], data, sheetname='Freq') +add_worksheet(wb, [exampleheader], sortedexampledata, sheetname='Examples') +wb.close() diff --git a/tests/noncompletion.py b/tests/noncompletion.py new file mode 100644 index 0000000..e42e0ea --- /dev/null +++ b/tests/noncompletion.py @@ -0,0 +1,10 @@ +import re + +re1 = '^(.*)\((.*?)\)(.*)$' + +teststrings = ['stapel(bed)', 'he(vi)g', '(aan)val'] + +for teststr in teststrings: + annotated = re.sub(re1, r'\1\3', teststr) + annotation = re.sub(re1, r'\1\2\3', teststr) + print(teststr, annotated, annotation) diff --git a/tests/test_explanation.py b/tests/test_explanation.py index 864ab19..7bc3730 100644 --- a/tests/test_explanation.py +++ b/tests/test_explanation.py @@ -6,7 +6,14 @@ space = ' ' -@pytest.mark.skip(reason='test code does not work') +#@pytest.mark.skip(reason='test code does not work') + +space = ' ' + +#print(dir(sasta_explanation)) + + +@pytest.mark.skip(reason="test not working") def test(): # treetotest = 9 infullname = r"D:\Dropbox\jodijk\Utrecht\Projects\SASTADATA\Auris\outtreebanks\DLD07_corrected.xml"