Texinmatning med Swype Kandidatexamensarbete i datateknik DD143X dkand13 MATTIS KANCANS ENVALL MATTISKE@KTH.SE AXEL LEWENHAUPT AXELLEW@KTH.SE Handledare: Anders Askenfelt Stockholm, 2013-04-12
Abstract Typing is probably always going to be an current topic, with the absolute goal of transferring text between the user and a technical device freely. This study means to examine a typing technique, where user-drawn continuous lines on a virtual keyboard are transfered into words, also known as swype. The results show that using a fairly simple algorithm combined with a few optimizations, it is possible to implement a swype accurate enough to be considered a realistic alternative to current typing methods on devices with touch screens. Sammanfattning Textinmatning kommer troligtvis alltid vara ett aktuellt ämne, där målet är att användaren skall kunna förmedla text till teknisk apparatur obehindrat. Denna rapport undersöker en textinmatningsmetod där kontinuerliga streck på ett tangentbord översätts till ord, även känt som swype. Resultaten visar att det med en förållandevis enkel algoritm och ett fåtal optimeringar, är fullt möjligt implementera ett swype tillräckligt noggrant för att vara ett realistiskt alternativ till nuvarande inmatningsmetoder för enheter med pekskärm.
Förord Arbetet har bestått av tre delar: Algoritmutforskning, användartestning och rapportförfattande. Vi har båda två deltagit i samtliga delar, men arbetet har inom delarna fördelats enligt följande: Axel Lewenhaupt slutförde vår algoritm, bearbetade och sammanställde testdata samt gjorde grafer. Mattis Kancans Envall gjorde mobilappen, genomförde användartester samt stod för stor del av rapportens slutgiltiga innehåll. Tillsammans gjorde vi algoritmutforskningar, optimeringar av vår valda algoritm och rapporten. Vi vill tacka vår handledare Anders Askenfelt för god assistans.
Innehåll Introduktion 1 Syfte, frågeställning och avgränsning................... 2 Teoretisk bakgrund 3 Definitioner................................. 3 Avsett ord............................... 3 Felmätning.............................. 3 Vad är en tydlig kurva?....................... 3 Teknisk bakgrund............................. 3 Datastrukturen Trie......................... 3 Metoder och algoritmer 5 Att spela in en kurva............................ 5 Att hitta en vändpunkt.......................... 5 Triealgoritmen............................... 5 Implementerade optimeringar....................... 6 Minimerade punktavstånd...................... 6 Minimerade omvägar......................... 6 Dubbelteckningar.............................. 7 Resultat 8 Minimerade punktavstånd......................... 9 Minimerade omvägar............................ 10 Båda optimeringar............................. 11 Diskussion 12 Svårtydda ord................................ 12 Insamling av testdata........................ 12 Dubbelteckningar........................... 12 Jämförelse optimeringarna emellan.................... 12 Tänkbara optimeringar.......................... 13 Maskininlärning............................ 13 Ordföljdsanalys............................ 13 Bättre dubbelteckningshantering.................. 13 Minskat antal mätpunkter...................... 13 Komprimerade grenar i trie..................... 14 Prestanda.................................. 14 Slutsats 15
Introduktion Förekomsten av så kallade smarta telefoner med pekskärm har ökat markant de senaste åren. Populariteten grundas bland annat i intuitiv interaktion med menyer och stor skärm i förhållande till sitt behändiga fickformat. Men fickformatet kommer på bekostnad av antalet fysiska knappar och detta medför en stor nackdel för produktkategorin; textinmatning. Alla användningsområden som behöver mer än minimal textinmatning utförs därför hellre på en enhet med ett fysiskt tangentbord, till exempel en bärbar dator[2]. Det finns idag flera alternativ för att underlätta textinmatning[3] på enheter med pekskärm, däribland autokorrigering (eng. autocorrect), taligenkänning och swype. Swype är en textinmatningsteknik där användaren i stället för att skriva varje bokstav enskilt, drar ett streck som går igenom varje bokstav i ordet i den ordning de förekommer. Figur 1: Exempel på hur ordet ramp skrivits med swype som textinmatningsmetod. En kurva besöker utan avbrott bokstäverna i ordet i tur och ordning. 1
Syfte, frågeställning och avgränsning Denna studie syftar undersöka ifall swype realistiskt kan vara en lösning på textinmatningsproblemet hos mobila enheter med pekskärm. Fokus ligger i att presentera ett tänkbart tillvägagångssätt för svepande inmatningar och bedöma dess potential. Vidare kommer tänkbara optimeringsalternativ att diskuteras, samt svagheter hos swype som inmatningsmetod påvisas, för att utreda: Hur träffsäker kan tolkning av enstaka, fristående ord göras med swype som textinmatningsmetod? Eftersom studien endast presenterar ett förslag till algoritm samt tänkbara optimeringsalternativ och inte gör anspråk på att algoritmen är färdigoptimerad, faller det inte inom studiens ram att jämföra algoritmen med andra inmatningsmetoder eller andra lösningar för samma inmatningsmetod. 2
Teoretisk bakgrund Definitioner Avsett ord Det avsedda ordet är det ord som användaren haft i åtanke när den svepande gesten utförts. Det avsedda ordet kan betraktas som ett facit för algoritmen. Felmätning Det finns i dagsläget inget konsensus för felmätning vid ordigenkänning. Vanligt förekommande är att med någon modell beräkna avståndet mellan det resulterande ordet och det avsedda, för att avgöra hur fel ett identifierat ord är. Exempel på en vanlig sådan modell är Levenshteinavstånd [1]. I denna studie kommer en enklare felmätningsmodell användas, som vi valt att kalla felkvot: felkvoten = ɛ(o 2) ɛ(o 1) 1, om a = 1 ( ɛ(oa) ɛ(o 1) 1 ), annars. där O x är det x:e ordet vår algoritm föreslår som avsett ord och ɛ(o x ) är hur troligt algoritmen finner ordet som avsett, normerat mellan 0 1 där lägre är bättre. a är placeringen som det avsedda ordet fått bland de sorterade orden. Således motsvarar alltså det övre fallet när a = 1, att algoritmen har funnit det avsedda ordet som mest troligt och alltså lyckats. Felkvoten motsvarar den procentuella skillnaden mellan det avsedda ordet och det bästa icke avsedda ordet. Felkvoten har dessutom gjorts negativ i de fall då algoritmen misslyckats med att identifiera det avsedda ordet, för att tydliggöra detta. Vad är en tydlig kurva? En av de viktigaste premisserna för denna studie är att kurvan som analyseras faktiskt syftar till ett ord, eftersom detta tillåter förkastande av otydliga kurvor. En tydlig kurva är en kurva med tydlig begynnelse- och slutpunkt, tydliga vändningar, rimliga avstånd till de bokstäver kurvan antyder samt små omvägar bokstäverna emellan. Antagandet om tydliga kurvor minskar drastiskt värdemängden tänkbara ord och således behöver färre kurvor efterbehandlas. Dessutom behöver inte tydandet av kurvan göras allt för avancerad eftersom t.ex. vändpunkter skall vara skarpa. Teknisk bakgrund Datastrukturen Trie En trie, också känt som prefixträd, är en datastruktur avsedd att lagra elementföljder (ofta text) effektivt med avseende på insättning och uppslagning, samt 3
där gemensamma pre- eller postfix är vanligt förekommande. En trie är ett grafträd där alla barn med en gemensam förälder har samma prefix. Varje nod i trädet lagrar precis ett element samt ifall det finns en elementföljd som slutar med noden ifråga. Således är det möjligt att finna en lagrad elementföljd genom att lägga ihop alla element noderna i vägen till roten. Figur 2: Exempel på en trie med orden mat, matt, man och eld. Bokstäver i en kvadrat representerar förekomsten av ett ord. Triens styrkor är att insättning, uppslagning och borttagning går fort O(m), där m är antalet element i elementföljden som skall lagras och det är mycket lätt att hitta ord med gemensamma prefix. Minneseffektiviteten kan variera kraftigt, beroende på andelen gemensamma prefix.[6] Som exempel skulle lagring av ordet el i figur 2 vara helt gratis, medan ord med begynnelsebokstav skilt från m och e är relativt dyra att lagra. Läsaren bör observera att varje ändnod i trien alltid representerar en lagrad elementföljd, eller lite slarvigt uttryckt är sann. [6] 4
Metoder och algoritmer Att spela in en kurva En kurva representeras av en följd koordinater med tidsstämpel, som representerar var testpersonen dragit fingret vid given tidpunkt. Dessa samlas i vårt fall in m.h.a. en egenutvecklad android-app och sparas i json-format 1. Tidsintervallet mellan punkterna beror helt på hårdvaran. Telefonen som använts i denna studie har en 110 mm skärmstorlek i diameter och 58,3% av skärmen används som tangentbord, vilket gav en knappstorlek på 8 11 mm för varje bokstav på tangentbordet. Att hitta en vändpunkt Att hitta de punkter där kurvan vänder är användbart av flera anledningar, främst eftersom det kan användas för att identifiera ordet som svepts. En vändning indikerar att den bokstav nåtts som skulle antydas och att kurvan bytt riktning mot nästa bokstav i ordet. Således kan en vändpunkt betyda att en av bokstäverna i närheten skall inkluderas, sannolikt den närmsta. Vändpunkter är även mycket användbara i felsökningssyfte, då de underlättar tydandet av kurvor som exempelvis överlappar mycket och annars lätt uppfattas som plottriga. En vändpunkt kan hittas med linjärsökning: Välj tre punkter med ett givet avstånd sinsemellan, där avståndet punkterna emellan avgör hur skarpa vändpunkter som eftersöks. Låt punkterna spänna upp en triangel och beräkna vinkeln vid den mellersta punkten av de tre, lämpligen med cosinussatsen. Denna vinkel kan användas för att identifiera en vändpunkt. Därefter flyttas alla punkterna och processen upprepas tills hela kurvan undersökts. Triealgoritmen Algoritmen exekveras i tre steg. Först beräknas värdemängden av tänkbara ord från ordlistan. För varje bokstav inom ett givet avstånd l från kurvans startpunkt påbörjas en vandring från noderna som håller dessa bokstäver i trien. För varje barn till dessa noder, som representerar nästkommande bokstav i något möjligt ord, undersöks om den återstående delen av kurvan någonstans befinner sig inom avståndet l från bokstaven. Om detta villkor uppfyllts så förbrukas kurvan fram till den nyfunna punkten och så upprepas det sistnämnda steget för nodens barn i trien. Att algoritmen förbrukar kurvan och endast använder den återstående delen ser till att bokstäverna inte kan inkluderas i omkastad ordning. Varje nod i trien indikerar ifall ett ord slutar med bokstaven för noden ifråga. Varje gång en sådan nod stöts på i iterationen jämförs den också mot kurvans slut; skulle villkoret uppfyllas är detta en del av värdemängden och således ett möjligt ord. 1 Ett sätt att (de-)serialisera data till text. http://www.json.org 5
Figur 3: Avståndet till en bokstav beräknas med linjärsökning längs kurvan. Figuren illustrerar en pågående iteration där bokstäverna A och V matchats. Fortsättningsvis kan inga bokstäver hittas på den streckade delen av kurvan och endast bokstäver som kan resultera i ord med AV som prefix i trien kommer att testas. Nästa steg i algoritmen beräknar ett värde för hur troligt det är att kurvan antyder varje ord i värdemängden. Detta diskuteras ytterligare under optimeringar, men exempelvis kan genomsnittsavståndet till varje bokstav i ordet användas. Algoritmen avslutas med att sortera dessa värden, och det bästa värdet är då förhoppningsvis det ord som användaren haft i åtanke. Implementerade optimeringar Minimerade punktavstånd Den enklaste formen av algoritmen placerar varje bokstav på den första punkt på kurvan där avståndet till punkten underskrider en given konstant. Men eftersom kurvan för en avsedd bokstav sannolikt går närmre än denna konstant, ger en efterbehandling där punktera flyttas närmre de bokstäver de associerats till bättre precision. Detta kan exempelvis göras iterativt. Minimerade omvägar Om algoritmen endast skulle ta hänsyn till huruvida bokstäverna i ett ord besöks i rätt ordning, samt hur nära kurvan kommer dessa bokstäver, kommer den förbise ett par viktiga egenskaper som skiljer ett ord från ett annat. Genom att straffa ord som placerar två bokstäver med onödig omväg emellan, kan kurvor som uppenbarligen antyder ytterligare en bokstav emellan de två bokstäverna i fråga premieras. Figur 3 antyder exempelvis en bokstav mellan A och V, eftersom användaren annars hade valt den kortare vägen mellan bokstäverna. Genom att beräkna den genomsnittliga omvägen mellan varje inkluderat bokstavspar, dvs. kvoten mellan längden av kurvans väg och fågelvägen, kan ett straffvärde för ordet beräknas och vägas in i slutbedömningen av ordet. 6
Dubbelteckningar Ett enkelt sätt att hantera dubbelteckningar är att för varje förekomst av dubbelteckning, vid iteration över trien, placera den andra bokstaven i dubbelteckningen på samma punkt på kurvan som den första bokstaven. 7
Resultat Samtliga test har utförts på en ordlista 2 med 71838 svenska ord. Femton personer har bidragit med totalt 390 textinmatningar. Felaktiga inmatningar har i enlighet med försökets premiss om korrekt indata (se avsnitt 2.1.3) exkluderats. Detta inbegriper testdata där användaren uppenbarligen har skrivit fel, t.ex. där kurvan uppenbarligen missat en eller flera bokstäver eller besöker bokstäverna i fel ordning. Totalt Korrekta Fel % Top 4 Top 4 (%) Minsta punktavstånd 390 144 246 36,9 334 73,3 Minimala omvägar 390 270 120 69,2 375 85,6 Båda 390 333 57 85,4 375 96,2 Tabell 1: Optimeringseffekterna i siffror. Minimering av omvägar är den enskilt bästa optimeringen för att finna det avsedda ordet, men skillnaden är mindre mellan optimeringarna ifall de avsedda ordet tillåts återfinnas bland de fyra mest troliga orden. Diagrammen i fig 4-6 ger läsaren en uppfattning om testresultaten i stort. Storleken av enskilda testfall med onormala värden har sekundärt intresse. Varje stapel motsvarar ett ord. Testfallen har delats in i två kategorier, beroende på ifall algoritmen lyckats identifiera det avsedda ordet eller ej, för att illustrera förhållandet mellan antalet testfall där algoritmen lyckats respektive misslyckats. Kategoriernas har inte sorterats inbördes. Tidsåtgång totalt: Tidsåtgång i genomsnitt: 2942 ms 7,54 ms Tabell 2: Exekveringstid för 390 ord och alla optimeringar påslagna. Tested kördes på en Core2 Quad CPU Q9550 med endast en tråd. 2 Den Stora Svenska Ordlistan: http://extensions.libreoffice.org/extension-center/ swedish-spelling-dictionary-den-stora-svenska-ordlistan 8
Minimerade punktavstånd Figur 4: Resultat med minimerade punktavstånd som enda optimering. Antal korrekta ord: 144 av 390. I figur 4 framgår att med felkvoten enbart baserad på kvoten mellan kurvans avstånd och fågelavståndet mellan bokstäverna, kan förhållandevis goda resultat uppnås. Viktigt att inse är att ord med negativ stapel inte nödvändigtvis har fått ett dåligt värde, utan endast att ett annat ord fått ett bättre. Därför bör noteras att spridningen i stapelhöjd är liten. 9
Minimerade omvägar Figur 5: Felkvot med minimerade omvägar som enda optimering. Antal korrekta ord: 270 av 390. Figur 5 visar med fler höga felkvoter att minimerade omvägar bättre tolkar kurva till ord än minimerade punktavstånd. Intressant är även att spridningen i felkvoterna överlag är större, och framförallt att fler ord med extrema värden förekommer. 10
Båda optimeringar Figur 6: Resultatet med båda optimeringarna. Antal korrekta ord: 333 av 390. När båda optimeringar används lyckas algoritmen identifiera 85,4% av alla ord och många av de ord som misslyckas är nära det korrekta ordet, vilket de små felstaplarna i figur 6 antyder. 11
Diskussion Svårtydda ord En klar nackdel men swype som inmatningsmetod är att vissa ord kan bli mycket svåra att urskilja. För att urskilja vilket ord som avsetts skulle mycket subtila positioner där användaren börjar vända behöva identifieras. Figur 7: Exempel på ett ord som är mycket svårt att tyda. Står det kota, kora eller möjligen korsa? Insamling av testdata Vid insamlandet av våra testdata användes en telefon med förhållandevis stor skärm och en betydande del av den användes till just textinmatningen. Vid kommersiellt användande skulle troligen inte så stor skärmyta kunna undvaras till tangentbordet. Om algoritmen användes på en telefon med mindre skärmyta är träffsäkerheten sannolikt inte tillräcklig för att algoritmen skulle kunna användas rakt av. Dubbelteckningar Dubbelteckningar är vanligt förekommande i det svenska språket och behöver hanteras på något sätt. Lösningen med att helt enkelt slå samman dubbeltecknade bokstäver är uppenbarligen inte optimal, eftersom den inte gör någon skillnad på exempelvis mata och matta. När en dubbelteckning förekommer och dubbelteckningen är det enda som skiljer två ord, är det i vår algoritm odefinierat vilket ord som kommer först. Detta diskuteras vidare under 5.3 Tänkbara optimeringar. Jämförelse optimeringarna emellan Som tidigare nämnts i anslutning till tabell 1 är skillnaden mellan optimeringarna större i kolumnen för antalet korrekta än i kolumnen för top 4. Punktavståndsoptimeringen tar ingen hänsyn till kurvans längd eller utseende i övrigt, varför vissa typer av ord premieras. Ett delord av ett längre ord kommer ha samma avstånd till alla de gemensamma bokstäverna, men sannolikht är att någon av 12
det längre ordets bokstäver försämrar ordets snitt. När detta sker är det längre ordet endast något sämre och hamnar sannolikt strax efter i rankingen, vilket överensstämmer också med att det avsedda ordet i många (73%) fall återfinns bland de fyra första av algoritmens föreslagna ord, vilket framgår i Tabell 2. Omvägsoptimeringen har redan konstaterats individuellt bättre, men vi bedömmer att punktavståndsoptimeringens stabilare resultat ger algoritmen bättre översende för otydliga kurvor, där användaren till exempel tagit en oavsiktlig omväg men fortfarande besöker samtliga bokstäver i ordet. De båda algoritmerna kompletterar alltså varandra väl eftersom de tar hänsyn till olika saker, vilket vi tror är en betydande orsak till vårt goda resultat. Tänkbara optimeringar Maskininlärning Vi tror att kurvigenkänning skulle kunna vara en metod att tolka kurvor som annars ter sig antyda två olika ord. Till exempel skulle studier där användare får skriva samma ord flera gånger kunna bidra med insikter om hur subtila skillnader i kurvor kan uppkomma av små skillnader i bokstavsföljder. Ordföljdsanalys Ordföljdsanalys är ytterligare ett verktyg som skulle kunna användas när en kurva påträffas som tycks kunna antyda två ord. Enstaka bokstavsändringar kan ge helt nya innebörder och böjningsändelser kan verifieras med hjälp av grammatiska regler, vilket troligen skulle kunna öka precisionen markant. Bättre dubbelteckningshantering Det finns flera lösningar på hur dubbelteckningar kan hanteras. En av de vanligast kommersiellt förekommande är att klottra eller göra en liten loop på bokstaven som skall dubbeltecknas[5]. En annan lösning är att helt enkelt hålla fingret stilla en kort stund på bokstaven innan resten av kurvan skrivs. Båda lösningar skulle kunna implementeras som påbyggnad till vår algoritm, och därmed ge vår algoritm en chans att klara de testfall där två ord endast skiljs av en dubbelteckning. Minskat antal mätpunkter I våra tester varierar antalet mätpunkter per svept längdenhet ganska mycket, framför allt beroende på hur fort testpersonen sveper. Eftersom både huvudalgoritmen och optimeringar itererar över testpunkterna har detta förhållandevis stor inverkan på prestandan. Ifall punkterna ligger för tätt tillför varje punkt inte så mycket ny information. Redan vid inspelandet av kruvan skulle mätpunkter som kommer för nära inpå föregående kunna filtreras, och därmed förbättra prestandan betydligt. 13
Komprimerade grenar i trie Andra implementationer av trie kan komprimera grenar där det fortsättingsvis endast existerar en väg. Detta sparar utrymme och beroende på implementation kan det även minska det nödvändiga antalet iterationer något. Denna optimering görs till en kostand av högre implementationskomplexitet och långsammare insättningar, men det senare behöver inte påverka triealgoritmen eftersom den ser trien som konstant och troligen kommer ha den förberäknad. Det finns också implementationer som låter varje kjedja utmynna i ett binärträd för att minska minnesanvändningen. [6] Prestanda Trots att inga optimeringar gjorts med avseende på beräkningsprestanda är algoritmen snabb. Ett ord tolkas på en dator i genomsnitt på ca 8 ms. Även om algoritmen skulle köras på en mobil enhet, med en faktor upp emot kanske 50 i exekveringstid, skulle fortfarande algoritmen klara de riktlinjer för vad användare uppfattar som responsivt med god marginal[4]. Detta betyder främst att det finns gott om utrymme för fler optimeringar eller att ta hänsyn till användarfel i större utsträckning. 14
Slutsats Trots triealgoritmens enkelhet kan den med endast två rättframma optimeringar producera förvånansvärt goda resultat. Med god prestandamarginal, potential för fler optimeringar och hantering av specialfall, skulle triealgoritmen som föreslås i denna studie sannolikt kunna vidareutvecklas till en väl fungerande textinmatningsapplikation. 15
Referenser [1] Levenshtein distance. http://xlinux.nist.gov/dads//html/ Levenshtein.html, 2008. (Hämtad 12 April 2013). [2] United states patent us7453439. 2008. http://www.freepatentsonline. com/7453439.pdf. [3] Per Ola Kristensson. Discrete and continuous shape writing for text entry and control. 2007. http://liu.diva-portal.org/smash/get/diva2: 23594/FULLTEXT01. [4] Robert B. Miller. Response time in man-computer conversational transactions. 1968. http://theixdlibrary.com/pdf/miller1968.pdf. [5] Inc. Nuance Communications. Swype basics. http://www.swype.com/ tips/swype-basics/. (Hämtad 12 April 2013). [6] Hugh E. Williams Steffen Heinz, Justin Zobel. Burst Tries: A Fast, Efficient Data Structure for String Keys. http://ww2.cs.mu.oz.au/~jz/fulltext/ acmtois02.pdf. 16