Grundläggande textanalys, VT2013

Relevanta dokument
Innehåll GRAMMATIKKONTROLL I GRANSKA. Datorstöd för skrivande. Problemställning. Ola Knutsson

Innehåll. Grammatikkontroll i Granska. Problemställning. Datorstöd för skrivande. Vilka metoder finns? Granskas uppbyggnad

Bootstrapping för substantivtaggning

Statistisk grammatikgranskning

Taggning av räkneord som årtal eller andra räkneord, Språkteknologi 2D1418, HT 01 Jonas Sjöbergh, , 15 oktober 2001

Innehåll. Datorstöd för skrivande och grammatikkontroll Ola Knutsson DH2418 Språkteknologi. Datorstöd för skrivande. Vilka metoder finns?

Grundläggande Textanalys VT Språkgranskning (2) Eva Pettersson

Grim. Några förslag på hur du kan använda Grim. Version 0.8

Granskas regelspråk. Ola Knutsson. Uppdaterad IPLab, Nada, KTH

Lingvistik I Delmoment: Datorlingvistik

Innehåll. Definition av språkgranskningsverktyg. Datorn som skrivverktyg. Ola Knutsson KTH CSC, SPRÅKGRANSKNINGSVERKTYG

Stavningskontroll. Metoder och tillämpningar inom språkteknologin. ht Allmänt om språkgranskning. Stavningskontroll.

Språkgranskningsverktyg, vt 2009

Grundläggande Textanalys VT Språkgranskning (2) Eva Pettersson

Inkongruens och särskrivna sammansättningar en beskrivning av två typer av fel och möjligheten att granska dem automatiskt

Introduktion till språkteknologi. Datorstöd för språkgranskning

Inkongruens och särskrivna sammansättningar

3. Granskas regelspråk

Grundläggande textanalys. Joakim Nivre

språkgranskning, ht 2007

Grundläggande Textanalys VT Språkgranskning (1) Eva Pettersson

Obesvarade frågor från F1

Granskas regelspråk. Tentativ version, Ola Knutsson IPLab, Nada, KTH

Varför är morfologi viktigt? Morfologisk analys och generering. Vad är ett ord (idag vs. i dag) Kan man inte lägga alla ord i en lexikonfil?

Skrivstöd. Joakim Nivre. Introduktion till språkteknologi. Skrivstöd. Inledning. Orsaker till stavfel. Detektering av icke-ord

Grundläggande textanalys, VT 2011 Stavnings- och grammatikkontroll i Microsoft Word. Eva Pettersson UU/Convertus

Svårigheter med kurslitteraturen

Grundläggande textanalys, VT2013

Gränssnitt för FakeGranska. Lars Mattsson

Word- sense disambiguation

grammatik Ordklasser, nominalfraser, substantiv

Maskinöversättning och språkgranskning, ht 2006

Kongruensböjningen av adjektivet påverkas av substantivets genus och numerus.

Grundläggande Textanalys VT Språkgranskning (1) Eva Pettersson

Kungliga Tekniska Högskolan Patrik Dallmann

språkgranskning, ht 2007

Lingvistik I Delmoment: Datorlingvistik

Skrivstöd. Varför bry sig om stavning? Hur används stavningskontroll? Christian Hardmeier

Lingvistik I Delmoment: Datorlingvistik

Målet är att ge maskiner förmågan att plocka ut information ur

ORDKLASSERNA I. Ett sätt att sortera våra ord

12 Programstege Substantiv

Maskinöversättning och språkgranskning. F6: Grammatikkontroll

En arbetsdag på kontoret kan innehålla. Så klarar man språkkontrollen DATORER RICKARD DOMEIJ

Datorlingvistisk grammatik

Obesvarade frågor från F4

Språkgranskningsverktyg. F1: Introduktion

Språkpsykologi/psykolingvistik

Behov av språklig granskning. Granska och automatisk språkgranskning av svensk text. Datorn som språkgranskare

DATORSTÖDD SPRÅKGRANSKNING OCH

Morfologi och automatisk morfologisk analys och generering. Varför är morfologi viktigt? Vad är ett ord (idag vs. i dag)

Inlämningsuppgift: Pronomenidentifierare

Innehåll. Språkinlärning: mänsklig och datorstödd. Olika typer av program för datorstödd språkinlärning. Varför datorer i språkutbildning?

Dependensregler - Lathund

Ryska pronomen. Pronomen är en sluten ordklass som består av många undergrupper. Pronomina kan fungera självständigt eller förenat

Morfologi, särdrag, lexikon och syntax. När är det bra med morfologi? Vad är ett ord? Morfem. Stam och affix

Grammatik för språkteknologer

2. Utgångspunkter och angreppssätt för automatisk språkgranskning

Hur går det till att lära svenska? En studie om svenska som andraspråksinlärares talade språk

Två-nivåmodellen, TWOL. 2D1418 Språkteknologi, Nada KTH Höstterminen 2004 Lisa Lagerkvist, Me-01

Grammatifix Svensk grammatikkontroll i MS Word

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Språkgranskningsverktyg, vt 2009

Språkgranskningsverktyg, vt 2008

Det görar ingenting om du frågar mycket. SFI-elevers semantiska och morfologiska utveckling

Grammatisk teori II Attributvärdesgrammatik

Grammatik, det fixar väl datorn?

Språkets struktur och funktion, 7,5 hp

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Parsning i Granska. Föreläsningens innehåll. Granskas uppbyggnad. Inspiration och förebilder. Regelmatchning/parsning. Granskas regelspråk

Föreläsning 5: Modellering av frasstruktur. 729G09 Språkvetenskaplig databehandling Lars Ahrenberg

Grundläggande textanalys, VT2012

4. Bedömning av delprov C

En samling fårskallar

Introduktion till programmering och Python Grundkurs i programmering med Python

729G09 Språkvetenskaplig databehandling

PROV ORDKLASSER SV Förklara vad ett konkret substantiv är och ge två exempel (3p)

Granskaprojektet: Rapport från arbetet med granskningsregler och kommentarer. *** Rickard Domeij Ola Knutsson IPLab, Nada, KTH

Har adjektivets a och e former någon reell betydelse i dagens svenska? Om den så kallade sexusböjningen. Theres Brännmark Grammatikdagen 17 mars 2017

Vidareutvecklat korpusverktyg med Granska som grund EMMA JOHANSSON

Träningshäfte ordklasser (Venus)

729G09 Språkvetenskaplig databehandling

Grammatiska morfem kan också vara egna ord, som t ex: och på emellertid

specialpedagogik/grundskola/122_inkludering_och_delaktighet_flersprakighet

Allmänt om programvaror och filer i Windows.

Grammatik för språkteknologer

Morfologi, språktyper och skriftsystem. Allmän Grammatik och Fonetik HT10 Dag 2

Datorn har utvecklats till vårt viktigaste. Datorn som språkgranskare SPRÅKTEKNOLOGI OLA KNUTSSON

Föreläsning 2. Operativsystem och programmering

Grammatik för språkteknologer

Svenskans struktur, 7,5 hp Tentamensexempel 1

Uttryck, satser och strömhantering

Labb 2: Syntax och ordklasstaggning. Att arbeta med grammatiskt analyserade data

Språkgranskningsverktyg. Grammatikkontroll i Word

Kungl. Tekniska högskolan NADA Grundformer med Stava

FOR BETTER UNDERSTANDING. Kom igång med. WordFinder Snabbguide

DANTEK ELEVWEB HJÄLP. Dantek ElevWeb Hjälp. Version 1 Copyright 2016 by Dantek AB. Sidan 1

NetBeans 5.5. Avsikt. Projektfönster

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Svenska språket 1, delkurs 2 Språkets byggstenar 714G47 Svenska språket Svenska språkets byggstenar 714G57

Transkript:

Grundläggande textanalys, VT2013 evelina.andersson@lingfil.uu.se Rum 9-2035 http://stp.ling.uu.se/~evelina/uv/uv13/gta/ (Tack till Sofia Gustafson-Capkovâ för material.)

Idag - Stavningskontroll - Granska - Laboration 3 - Fördjupningsuppgift 2

Varför behöver vi stavnings- och grammatikkontroll? 3

Varför behöver vi stavnings- och grammatikkontroll? - För att upptäcka slarvfel 4

Varför behöver vi stavnings- och grammatikkontroll? - För att upptäcka slarvfel - Stilkontroll Är man konsekvent när man skriver: ska skall mej - mig 5

Varför behöver vi stavnings- och grammatikkontroll? - För att upptäcka slarvfel - Stilkontroll Är man konsekvent när man skriver: ska skall mej - mig Minusord: - talspråk - ålderdomliga - byråkratiska 6

Varför behöver vi stavnings- och grammatikkontroll? - För att upptäcka slarvfel - Stilkontroll Är man konsekvent när man skriver: ska skall mej - mig Minusord: - talspråk - ålderdomliga - byråkratiska - Andraspråksinlärning 7

Varför behöver vi stavnings- och grammatikkontroll? - För att upptäcka slarvfel - Stilkontroll Är man konsekvent när man skriver: ska skall mej - mig Minusord: - talspråk - ålderdomliga - byråkratiska - Andraspråksinlärning - Dyslexi 8

Varför är inte stavningskontroll tillräckligt? 9

Varför är inte stavningskontroll tillräckligt? - Vi kan hitta icke-ord: råf får 10

Varför är inte stavningskontroll tillräckligt? - Vi kan hitta icke-ord: råf får - Men vi missar följande: om lexikonet inte är tillräckligt stort missar vi särskrivna sammansättningar: hus vagn husvagn 11

Varför är inte stavningskontroll tillräckligt? - Vi kan hitta icke-ord: råf får - Men vi missar följande: om lexikonet inte är tillräckligt stort missar vi särskrivna sammansättningar: hus vagn husvagn stavfel som är riktiga ord (real word errors): Du er duktig på att går. 12

Vad gör grammatikkontroll? 13

Vad gör grammatikkontroll? - Accepterar de korrekta grammatiska strukturerna 14

Vad gör grammatikkontroll? - Accepterar de korrekta grammatiska strukturerna - Känner igen och talar om de grammatiska fel som finns i texten fokuserar på de fel som är lätt att hitta 15

Vad gör grammatikkontroll? - Accepterar de korrekta grammatiska strukturerna - Känner igen och talar om de grammatiska fel som finns i texten fokuserar på de fel som är lätt att hitta - Ger ersättningsförslag för: ogrammatiska strukturer felaktiga ordformer 16

Grammatikkontrollens faser 17

Grammatikkontrollens faser - Feldetektering(detection) Fel i nominalfrasen(np): den röda stolarna 18

Grammatikkontrollens faser - Feldetektering(detection) Fel i nominalfrasen(np): den röda stolarna - Feligenkänning (recognition) numeriusinkongruens: artikel huvudord: den röda stolarna 19

Grammatikkontrollens faser - Feldetektering(detection) Fel i nominalfrasen(np): den röda stolarna - Feligenkänning (recognition) numeriusinkongruens: artikel huvudord: den röda stolarna - Feldiagnos (diagnosis) artikeln står i singularis istället för pluralis: den de substantivet står i pluralis istället för singularis: stolarna stolen 20

Grammatikkontrollens faser - Feldetektering(detection) Fel i nominalfrasen(np): den röda stolarna - Feligenkänning (recognition) numeriusinkongruens: artikel huvudord: den röda stolarna - Feldiagnos (diagnosis) artikeln står i singularis istället för pluralis: den de substantivet står i pluralis istället för singularis: stolarna stolen - Felkorrigering(correction) de röda stolarna den röda stolen 21

Problem 22

Problem - Hur kan man hitta så många fel som möjligt utan att alltför många korrekta meningar bedöms som felaktiga? 23

Problem - Hur kan man hitta så många fel som möjligt utan att alltför många korrekta meningar bedöms som felaktiga? - Komplexa strukturer: Exempel: De i stycket 7 stadgade punkterna. 24

Problem - Hur kan man hitta så många fel som möjligt utan att alltför många korrekta meningar bedöms som felaktiga? - Komplexa strukturer: Exempel: De i stycket 7 stadgade punkterna. - Begränsning på meningsnivå: Exempel: Jag såg bra datorer i butiken. Den vara ganska dyr. 25

Problem - Hur kan man hitta så många fel som möjligt utan att alltför många korrekta meningar bedöms som felaktiga? - Komplexa strukturer: Exempel: De i stycket 7 stadgade punkterna. - Begränsning på meningsnivå: Exempel: Jag såg bra datorer i butiken. Den vara ganska dyr. - Hur gör man med dialekter? Exempel: Denna stolen är svart. 26

Granska 27

Granska - Utvecklat på Nada, KTH - Använder ett lexikon och en samling regler 28

Granska uppbyggnad Tokeniseraren Tokeniserar med hjälp av reguljära uttryck Taggaren Lexikon(SUC och SAOL) Statistik(SUC) Regelmatcharen 300 granskningsregler ordböjningsfunktion Grafiskt gränsnitt 29

Granska uppbyggnad Exempel på taggningar: kvinnan kvinna nn.utr.sin.def.nom hade ha vb.prt.akt.aux gått gå vb.sup.akt 30

Granska Körexempel Källa: http://skrutten.nada.kth.se/granska/ 31

Granska Körexempel Skriv in en mening här. Skicka iväg meningen till Granska. Källa: http://skrutten.nada.kth.se/granska/ 32

Granska Körexempel - Resultat Källa: http://skrutten.nada.kth.se/granska/ 33

Granska Körexempel - Resultat detection Källa: http://skrutten.nada.kth.se/granska/ 34

Granska Körexempel - Resultat detection diagnosis Källa: http://skrutten.nada.kth.se/granska/ 35

Granska Körexempel - Resultat detection diagnosis Källa: http://skrutten.nada.kth.se/granska/ correction 36

Granska Skapa regler 37

Granska Skapa regler - Först skapar men en kategori som man kan samla reglerna i ( jämför klass i java) 38

Granska Skapa regler - Först skapar men en kategori som man kan samla reglerna i ( jämför klass i java) - Sedan skapar man reglerna och talar om i vilken varje regel tillhör (jämför metoder i java) 39

Granska Deklarera en kategori Syntaxen för att deklarera en kategori ser ut så här: category regelkategori info("exempelregler") link ("url" "namn på länk") 40

Granska Deklarera en kategori Syntaxen för att deklarera en kategori ser ut så här: category regelkategori info("exempelregler") link ("url" "namn på länk") category reserverat ord som talar om att vi skapar en kategori 41

Granska Deklarera en kategori Syntaxen för att deklarera en kategori ser ut så här: category regelkategori info("exempelregler") link ("url" "namn på länk") category reserverat ord som talar om att vi skapar en kategori regelkategori samlingsnamn för de regler man skapar 42

Granska Deklarera en kategori Syntaxen för att deklarera en kategori ser ut så här: category regelkategori info("exempelregler") link ("url" "namn på länk") category reserverat ord som talar om att vi skapar en kategori regelkategori samlingsnamn för de regler man skapar info("exempelregler") innehåller en generell kommentar om reglerna 43

Granska Deklarera en kategori Syntaxen för att deklarera en kategori ser ut så här: category regelkategori info("exempelregler") link ("url" "namn på länk") category reserverat ord som talar om att vi skapar en kategori regelkategori samlingsnamn för de regler man skapar info("exempelregler") innehåller en generell kommentar om reglerna link("url", "namn på länk") 44 innehåller håller url:en till sidan med mer information om reglerna

Granska Exempel Så här skapar man kategorin minaregler: category minaregler info("mina regler") link("" "") 45

Granska Deklarera en regel Syntaxen för att skapa en regel ser ut så här: regelnamn@regelkategori X_0()... X_n() konsekvens_0... konsekvens_n 46

Granska Deklarera en regel Syntaxen för att skapa en regel ser ut så här: regelnamn@regelkategori X_0(),..., X_n() konsekvens_0... konsekvens_n regelnamn Namnet på regeln 47

Granska Deklarera en regel Syntaxen för att skapa en regel ser ut så här: regelnamn@regelkategori X_0(),..., X_n() konsekvens_0... konsekvens_n regelnamn Namnet på regeln regelkategori Vilken kategori regeln tillhör 48

Granska Deklarera en regel Syntaxen för att skapa en regel ser ut så här: regelnamn@regelkategori X_0(),..., X_n() konsekvens_0... konsekvens_n X_0(),..., X_n() Matchningsvariabler som måste vara uppfyllda innan man kan använda regeln. 49

Granska Deklarera en regel Syntaxen för att skapa en regel ser ut så här: regelnamn@regelkategori X_0(),..., X_n() konsekvens_0... konsekvens_n konsekvens_0... konsekvens_n Det som ska hända när man exekverar regeln. 50

Granska Exempel tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) 51

Granska Exempel1 tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) tabortdubletter namnet på regeln 52

Granska Exempel1 tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) tabortdubletter namnet på regeln minaregler den kategori av regler som regeln tillhör 53

Granska Exempel1 tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) tabortdubletter namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1 det första ordet som vi hittar 54

Granska Exempel1 tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) tabortdubletter namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1 det första ordet som vi hittar ORD2(text=ORD1.text) den lexikala strängen för ORD2 måste vara samma som för ORD1 55

Granska Exempel1 tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) tabortdubletter namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1 det första ordet som vi hittar ORD2(text=ORD1.text) den lexikala strängen för ORD2 måste vara samma som för ORD1 mark(ord1, ORD2) markera ORD1 och ORD2 56

Granska Exempel1 tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) tabortdubletter namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1 det första ordet som vi hittar ORD2(text=ORD1.text) den lexikala strängen för ORD2 måste vara samma som för ORD1 mark(ord1, ORD2) ORD1.delete() markera ORD1 och ORD2 ta bort ORD1 57

Granska Exempel1 tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) tabortdubletter namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1 det första ordet som vi hittar ORD2(text=ORD1.text) den lexikala strängen för ORD2 måste vara samma som för ORD1 mark(ord1, ORD2) ORD1.delete() corr() markera ORD1 och ORD2 ta bort ORD1 talar om att man vill ändra på något 58

Granska Exempel1 tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) talar om att regeln är en granskningsregel för stavnings- och grammatikkontroll 59

Granska Exempel1 Exekvering tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) indata: ett träd träd utdata: 60

Granska Exempel1 Exekvering tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) indata: ett träd träd utdata: 61

Granska Exempel1 Exekvering tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) indata: ett träd träd utdata: 62

Granska Exempel1 Exekvering tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) indata: ett träd träd utdata: ett träd träd 63

Granska Exempel1 Exekvering tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) indata: ett träd träd utdata: ett träd träd träd träd 64

Granska Exempel1 Exekvering tabortdubbletter@minaregler ORD1(), ORD2(text=ORD1.text) mark(ord1 ORD2) corr(ord1.delete()) indata: ett träd träd utdata: ett träd träd träd träd träd 65

Ersättningsförslag 66

Ersättningsförslag - ORD1.delete() -- tar bort ordet ORD1 67

Ersättningsförslag - ORD1.delete() -- tar bort ordet ORD1 - ORD1.insert(ORD2) -- sätter in ORD2 före ORD1 68

Ersättningsförslag - ORD1.delete() -- tar bort ordet ORD1 - ORD1.insert(ORD2) -- sätter in ORD2 före ORD1 - ORD1.join(ORD2) -- sätter ihop ORD1 och ORD2 till ett ord ORD1ORD2 69

Ersättningsförslag - ORD1.delete() -- tar bort ordet ORD1 - ORD1.insert(ORD2) -- sätter in ORD2 före ORD1 - ORD1.join(ORD2) -- sätter ihop ORD1 och ORD2 till ett ord ORD1ORD2 - ORD1.replace(ORD2) -- ersätter ORD1 med ORD2 70

Ersättningsförslag - ORD1.delete() -- tar bort ordet ORD1 - ORD1.insert(ORD2) -- sätter in ORD2 före ORD1 - ORD1.join(ORD2) -- sätter ihop ORD1 och ORD2 till ett ord ORD1ORD2 - ORD1.replace(ORD2) -- ersätter ORD1 med ORD2 - form(ord1.särdrag:=särdragsvärde) -- ersätter särdrag med särdragsvärde 71

Hur känner vi igen sammansättningar? 72

Hur känner vi igen sammansättningar? - enklaste strategin: ord = ord + ord Exempel: hus + bil = husbil 73

Hur känner vi igen sammansättningar? - enklaste strategin: ord = ord + ord Exempel: hus + bil = husbil - bättre strategi: ord = förled + ord Exempel: skola + bok = skolbok tangent + bord = tangentbord 74

Hur känner vi igen sammansättningar? - enklaste strategin: ord = ord + ord Exempel: hus + bil = husbil - bättre strategi: ord = förled + ord Exempel: skola + bok = skolbok tangent + bord = tangentbord - positivt: minskar antal felaktiga bedömningar 75

Hur känner vi igen sammansättningar? - enklaste strategin: ord = ord + ord Exempel: hus + bil = husbil - bättre strategi: ord = förled + ord Exempel: skola + bok = skolbok tangent + bord = tangentbord - positivt: minskar antal felaktiga bedömningar - negativt: kan öka antalet missade fel 76

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) sammansattning namnet på regeln 77

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) sammansattning namnet på regeln minaregler den kategori av regler som regeln tillhör 78

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) sammansattning namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1(wordcl=dt) det första ordet vi hittar och som har ordklassen artikel(dt) 79

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) sammansattning namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1(wordcl=dt) det första ordet vi hittar och som har ordklassen artikel(dt) ORD2(wordcl=nn & gender!=ord1.gender) ordet som kommer efter ORD1 måste vara ett substantiv(nn) och inte ha samma genus(gender) som ORD1 80

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) ORD2(wordcl=nn & gender!=ord1.gender) ordet som kommer efter ORD1 måste vara ett substantiv(nn) och inte ha samma genus(gender) som ORD1 ORD3(wordcl=nn & gender=ord1.gender) ordet som kommer efter ORD1 måste vara ett substantiv(nn) och ha samma genus(gender) som ORD1 81

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) mark(ord2, ORD3) markera ORD2 och ORD3 82

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) mark(ord2, ORD3) ORD3.real_text markera ORD2 och ORD3 - ordets teckensträng 83

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) mark(ord2, ORD3) ORD3.real_text join() markera ORD2 och ORD3 - ordets teckensträng - sätter ihop två strängar till en 84

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) mark(ord2, ORD3) ORD3.real_text join() corr() markera ORD2 och ORD3 - ordets teckensträng - sätter ihop två strängar till en - talar om att man vill ändra på något 85

Granska Exempel2 sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) mark(ord2, ORD3) ORD3.real_text join() corr() markera ORD2 och ORD3 - ordets teckensträng - sätter ihop två strängar till en - talar om att man vill ändra på något talar om att regeln är en granskningsregel för stavnings- och grammatikkontroll 86

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: 87

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: 88

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: 89

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: 90

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: 91

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: 92

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: en spel korg 93

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: en spel korg spel korg spel 94

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: en spel korg spel korg spelkorg 95

Granska Exempel2 Exekvering sammansattning@minaregler ORD1(wordcl=dt), ORD2(wordcl=nn & gender!=ord1.gender), ORD3(wordcl=nn & gender=ord1.gender) mark(ord2 ORD3) corr(ord2.join(ord3.real_text)) indata: en <dt.utr.sin.ind> spel <nn.neu.sin.ind.nom> korg <nn.utr.sin.ind.nom> utdata: en spel korg spel korg spelkorg 96

Kongruensfel Exempel: det stora katten Hur skriver vi en regel för att upptäcka att det ska bytas ut mot den? 97

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) 98

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) nykongruens namnet på regeln 99

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) nykongruens minaregler namnet på regeln den kategori av regler som regeln tillhör 100

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) nykongruens namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1(wordcl=dt) det första ordet vi hittar och som har ordklassen artikel(dt) 101

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) Nykongruens namnet på regeln minaregler den kategori av regler som regeln tillhör ORD1(wordcl=dt) det första ordet vi hittar och som har ordklassen artikel(dt) ORD2(wordcl=jj) det andra ordet vi hittar och som har ordklassen adjektiv(jj) 102

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) wordcl=nn % ordet måste vara ett substantiv 103

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) wordcl=nn % ordet måste vara ett substantiv gender!=ord1.gender % ordet får inte ha samma genus som % ORD1 104

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) wordcl=nn % ordet måste vara ett substantiv gender!=ord1.gender % ordet får inte ha samma genus som % ORD1 gender==ord2.gender % ordet ska ha samma genus som % ORD2 105

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) num=ord2.num % ordet ska ha samma numerus som ORD2 106

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) spec=ord2.spec % ordet ska ha samma species som ORD2 107

Granska Exempel3 nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) ORD3 är ett substantiv(nn), har inte samma genus som ORD1, har samma genus som ORD2, har samma numerus som ORD2 och samma species som ORD2. 108

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> 109

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> 110

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> 111

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> 112

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> 113

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> 114

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> 115

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> 116

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> utdata: det stora katten 117

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> utdata: det stora katten den <dt.utr.sin.def> 118

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> utdata: det stora katten den <dt.utr.sin.def> 119

Granska Exempel3 Exekvering nykongruens@minaregler ORD1(wordcl=dt), ORD2(wordcl=jj), ORD3(wordcl=nn & gender!=ord1.gender & gender=ord2.gender & num=ord2.num & spec=ord2.spec) mark(ord1 ORD2 ORD3) corr(ord1.form(gender:=ord3.gender)) indata: det <dt.neu.sin.def> stora <jj.pos.utr/neu.sin.def.nom> katten <nn.utr.sin.def.nom> utdata: det stora katten den <dt.utr.sin.def> stora katten 120

Alternativa ersättningsförslag Exempel: en dator Ersättningsförslag: en dator några datorer Hur skriver man en regel för detta? 121

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet 122

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet DT(wordcl=dt) det första ordet är en artikel(dt) 123

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet DT(wordcl=dt) det första ordet är en artikel(dt) NN(wordcl=nn & num!=dt.num) det andra ordet är ett substantiv(nn) och har inte samma numerus(num) som artikeln 124

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet corr(dt.form(num:=nn.num)) artikeln får samma numerus som substantivet 125

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet corr(dt.form(num:=nn.num)) artikeln får samma numerus som substantivet corr(nn.form(num:=dt.num)) substantivet får samma numerus som artikeln 126

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet 127

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet indata: en <dt.utr.sin.ind> datorer <nn.utr.plu.ind.nom> 128

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet indata: en <dt.utr.sin.ind> datorer <nn.utr.plu.ind.nom> 129

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet indata: en <dt.utr.sin.ind> datorer <nn.utr.plu.ind.nom> 130

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet indata: en <dt.utr.sin.ind> datorer <nn.utr.plu.ind.nom> 131

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet indata: en <dt.utr.sin.ind> datorer <nn.utr.plu.ind.nom> utdata: några <dt.utr/neu.plu.ind> datorer 132

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet indata: en <dt.utr.sin.ind> datorer <nn.utr.plu.ind.nom> utdata: en dator <nn.utr.sin.ind.nom> några <dt.utr/neu.plu.ind> datorer 133

Alternativa ersättningsförslag Exempel tvacorr@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) corr(dt.form(num:=nn.num)) % byt ut artikeln corr(nn.form(num:=dt.num)) % byt ut substantivet indata: en <dt.utr.sin.ind> datorer <nn.utr.plu.ind.nom> utdata: en dator <nn.utr.sin.ind.nom> några <dt.utr/neu.plu.ind> datorer 134

Hoppa mellan reglerna 135

Hoppa mellan reglerna - Reglerna i granska exekveras i samma ordning som de står i 136

Hoppa mellan reglerna - Reglerna i granska exekveras i samma ordning som de står i - För att hoppa frammåt i reglerna, kan man använda jump(läge) 137

Hoppa mellan reglerna - Reglerna i granska exekveras i samma ordning som de står i - För att hoppa frammåt i reglerna, kan man använda jump(läge) - För att skapa ett läge skriver man läge: 138

Hoppa mellan reglerna - Reglerna i granska exekveras i samma ordning som de står i - För att hoppa frammåt i reglerna, kan man använda jump(läge) - För att skapa ett läge skriver man läge: - Regelsamlingen blir då så här: regler... läge-etikett: fler regler... 139

Hoppa mellan reglerna - Reglerna i granska exekveras i samma ordning som de står i - För att hoppa frammåt i reglerna, kan man använda jump(läge) - För att skapa ett läge skriver man läge: - Regelsamlingen blir då så här: regler... läge-etikett: fler regler... - Om man vill hoppa till början av reglerna kan man skriva jump(beginlabel) 140

Hoppa mellan reglerna - Exempel minjump@minaregler DT(wordcl=dt), NN(wordcl=nn & num!=dt.num) mark(dt, NN) jump(etikett)... etikett: När jump(etikett) körs, hoppar man ner till etikett. 141

Nästa gång Minsta redigeringsavstånd (för strängar) - Fler verktyg 142