The Swype Input Method Degree Project in Computer Science Mattis Kancans Envall mattiske@kth.se Axel Lewenhaupt axellew@kth.se 12 april 2013 Abstract Typing is probably always going to be an contemporary topic, with the absolute goal of transferring text between the user and a technical device freely. This report means to examine a typing technique, where user drawn continuous lines on a virtual keyboard get transfered into words, also known as swype. The report concludes 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. Rapporten finner att det med en förållandevis enkel algoritm och ett fåtal optimeringar är fullt möjligt implementera ett swype tillräckligt nogrannt för att vara ett realistiskt alternativ till nuvarande inmatningsmetoder för enheter med pekskärm.
Innehåll 1 Introduktion 1 1.1 Syfte, frågeställning och avgränsning................ 2 2 Teoretisk bakgrund 3 2.1 Definitioner.............................. 3 2.1.1 Avsett ord........................... 3 2.1.2 Felmätning.......................... 3 2.1.3 Vad är en tydlig kurva?................... 3 2.2 Teknisk bakgrund........................... 4 2.2.1 Datastrukturen Trie..................... 4 3 Metoder och algoritmer 5 3.1 Att spela in en kurva......................... 5 3.2 Att hitta en vändpunkt....................... 5 3.3 Triealgoritmen............................ 5 3.3.1 Beskrivning.......................... 5 3.4 Implementerade optimeringar.................... 6 3.4.1 Minimera punktavstånd................... 6 3.4.2 Minimera omvägar...................... 6 3.5 Dubbelteckningar........................... 6 4 Resultat 7 4.1 Minimerade omvägar......................... 8 4.2 Minimerade punktavstånd...................... 9 4.3 Båda optimeringar.......................... 10 5 Diskussion 11 5.1 Svårtydda ord............................. 11 5.1.1 Insamling av testdata.................... 11 5.1.2 Dubbelteckningar....................... 11 5.2 Jämförelse optimeringarna emellan................. 11 5.3 Tänkbara optimeringar....................... 12 5.3.1 Bättre dubbelteckningshantering.............. 12 5.3.2 Minskat antal mätpunkter.................. 12 5.3.3 Komprimerade grenar i trie................. 12 5.4 Prestanda............................... 12 6 Slutsats 12
1 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 till bekostnad av antalet fysiska knappar och detta medför en stor brist 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 sträck som skär 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
1.1 Syfte, frågeställning och avgränsning Denna rapport 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 ämnas diverse tänkbara optimeringsalternativ 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 rapporten endast presenterar ett förslag till algoritm samt tänkbara optimeringsalternativ och inte anspråkar att algoritmen är färdigoptimerad, faller det inte inom rapportens omfattning att jämföra algoritmen med andra inmatningsmetoder eller ens andra lösningar för samma inmatningsmetod. 2
2 Teoretisk bakgrund 2.1 Definitioner 2.1.1 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 i betraktas som ett facit för algoritmen. 2.1.2 Felmätning Det finns i dagsläget inget consensus 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 ansett, normerat 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. Den observante läsaren inser att 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. 2.1.3 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. 3
2.2 Teknisk bakgrund 2.2.1 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 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 håller. Figur 2: Exempel på en trie med orden mat, matt, man och eld. Bokstäver i en kvadrat representerar alltså 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, medans ord med begynnelsebokstav skilt från m och e är relativt dyrlagrade. Läsaren bör observera att varje ändnod i trien alltid representerar en lagrad elementsföljd, eller lite slarvigt uttryckt är sann. [6] 4
3 Metoder och algoritmer 3.1 Att spela in en kurva En kurva representeras av en följd koordinater med tidsstämpel, som representerar var testpersonen dragit vid given tidpunkt. Dessa samlas i vårt fall in m.h.a. en egenutvecklad android-app och sparas i json-format 1. Telefonen som används har en 110 mm skärmstorlek i diameter och 58,3% av skärmen används som tangentbord. 3.2 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 hjälper människor tyda 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 avgör hur skarpa vändpunkter som eftersöks. Låt punkterna spänna en triangel och beräkna vinkeln vid den mellersta punkten av de tre, lämpligen med cosinussatsen. Denna vinkel kan nu användas för att identifiera en vändpunkt. Därefter flyttas alla punkterna och processen upprepas tills hela kurvan undersökts. 3.3 Triealgoritmen 3.3.1 Beskrivning 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 ju representerar nästkommande bokstav i möjliga 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å konsumeras kurvan fram till den nyfunna punkten och så upprepas det sistnämnda steget för nodens barn i trien. Att algoritmen konsumerar kurvan och endast använder den återstående delen ser till att bokstäverna inte inkluderas i omkastad ordning. Som bekant, talar varje nod i trien om 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. 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. Exempelvis kan genomsnittsavståndet till 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. varje bokstav i ordet användas, detta diskuteras ytterligare som optimeringar. 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. 3.4 Implementerade optimeringar 3.4.1 Minimera punktavstånd Den enklaste formen av algoritmen kommer att placera varje bokstav för det ord som testas på den första punkt på kurvan där avståndet till punkten underskrider en given konstant. Eftersom det sannolikt finns en punkt på kurvan som är närmre, ger en efterbehandling där dessa punkter flyttas närmre de bokstäver de associerats till bättre precision. 3.4.2 Minimera 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:en och V :et, 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. för kvoten mellan längden av kurvans väg och fågelvägen, de närliggande bokstäverna emellan, kan ett straffvärde för ordet beräknas och vägas in i slutbedömningen av ordet. 3.5 Dubbelteckningar Ett enkelt sätt att hantera dubbelteckningar är att helt enkelt placera den andra bokstaven i varje dubbelteckning på samma punkt i kurvan som den tidigare, för varje förekomst av dubbelteckning vid iteration över trien. 6
4 Resultat Samtliga test har utförts på en ordlista 2 med 71838 svenska ord. Femton personer har kontribuerat med totalt 390 textinmatningar. Felaktiga inmatningar har i enlighet med försökets premiss om korrekt indata (se Vad är en tydlig kurva? sida 3) exkluderats. Detta involverar testdata där användaren uppenbarligen har skrivit fel, t.ex. där kurvan uppenbarligen missat en eller flera bokstäver eller skär 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. Ovan syns att minimering av omvägar är den enskilt bästa optimeringen för att finna det avsedda ordet, men också att skillnaden är mindre optimeringarna emellan ifall de avsedda ordet tillåts återfinnas bland de fyra mest troliga orden. Diagrammen som följer har har beskurits till ± 300 % eftersom de främst ämnar ge läsaren en uppfattning om testresultaten i stort och storleken för enskilda testfall med anormala 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: 2942ms 7.54ms Tabell 2: Tiden det tar i testet med 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 7
4.1 Minimerade omvägar Figur 4: Skillnaden mellan fågelvägen och kurvsträckan. Antal korrekta: 270 av 390. I figur 4 ser man lätt att genom att endast vikta felkvoten på hur lång omväg kurvsträckan är i jämförelse med fågelavståndet mellan bokstäverna kan man få en bra viktning. Det är också värt att poängtera att bara för att en stapel är negativ måste inte det rätta ordet fått ett dåligt värde, utan endast att något annat ord har fått ett bättre värde. 8
4.2 Minimerade punktavstånd Figur 5: Resultatet med minimerade punktavstånd som enda optimering. Antal korrekta: 144 av 390. Att endast använda viktning i avseende på avståndet mellan bokstäverna och kurvan ger inget entydigt svar på vilket ord som användaren försökte skriva, vilket går att se i figur 5. Trots den stora andelen av ord där det rätta ordet inte hade bäst viktning ser man i tabell 1 att ordet användaren försökte skriva finns med bland de fyra första orden i 73% av fallen. 9
4.3 Båda optimeringar Figur 6: Båda optimeringarna. Antal korrekta: 333 av 390. När båda viktningarna kombinaras fås ett resultat där de flesta svepningarna resulterade i att rätt ord fick bäst viktning, vilket kan ses i figur 6. Ifall man även ser på tabell 1 ser man att i över 95% av fallen finns det rätta ordet med bland de 4 översta resultaten. 10
5 Diskussion 5.1 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 kunna avslöja Figur 7: Exempel på ett ord som är väldigt svårt att tyda. Står det kota, kora eller möjligen korsa? 5.1.1 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 skärm användes till just textinmatningen. Vid kommersiellt användande skulle troligen inte så stor skärmyta undvaras tangentbordet, vilket tyder på att om algoritmen användes på en telefon med mindre skärmyta är träffsäkerheten sannolikt inte är tillräcklig för att algoritmen skulle kunna användas rakt av. 5.1.2 Dubbelteckningar Dubbelteckningar är vanligt förekommande i det svenska språket, varför vi kände oss tvungna att hantera dem på något sätt. Lösningen med att helt enkelt slå samman dubbeltecknade bokstäver är uppenbarligen inte optimal, eftersom den inte egentligen gör någon skillnad på exempelvis mata och matta, vilket bör hållas i åtanke när våra resultat tolkas; i de fall när en dubbelteckning förekommer och dubbelteckningen är det enda som skiljer från ett annat, är det i vår algoritm odefinierat vilket ord som kommer först. Detta diskuteras vidare under Tänkbara optimeringar. 5.2 Jämförelse optimeringarna emellan I beskrivningen till tabell 1 uppmärksammas att skillnaden mellan optimeringarna är större i kolumnen för antalet korrekta än i kolumnen för top 4. Detta är troligen ett resultat av att optimeringen för minsta punktavståndet inte lägger vikt vid kurvans längd. 11
5.3 Tänkbara optimeringar 5.3.1 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]. Ytterligare en lösning är att helt enkelt hålla fingret stilla en kort stund på bokstaven innan resten av kurvan skrivs. Detta skulle absolut kunna implementeras som påbyggnad till vår algoritm, och skulle ge algoritmen en chans att klara de testfall där två ord endast skiljs av en dubbelteckning. 5.3.2 Minskat antal mätpunkter I våra tester varierar antalet förekommande mätpunkter per svept längdenhet ganska stort, framförallt beroende på hur fort testpersonen sveper. Eftersom både huvudalgoritmen och optimeringar itererar över testpunkterna har dessa förhållandevis stor inverkan på prestandan. Ifall punkterna sitter för tätt tillför varje punkt inte så mycket ny information, varför hårdvaran skulle kunna filtrera antalet mätpunkter och kunna påverka prestandan med en betydande faktor. 5.3.3 Komprimerade grenar i trie Andra implementationer av trie kan komprimera grenar där det fortsättingsvis endast existerar en väg. Detta spara utrymme och kan beroende på implementation ä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] 5.4 Prestanda Trots att inga optimeringar gjorts med avseende på prestanda är algoritmen snabb. Ett ord tolkas på en dator i genomsnitt på ca 8ms. Även om algoritmen skulle köras på en långsam mobiltelefon, med en faktor upp emot 50 i exekveringstid, skulle fortfarande algoritmen klara de riktlinjer för vad människor 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. 6 Slutsats Trots triealgoritmens enkelhet kan den med endast två rättframma optimeringar och producera förvånansvärt goda resultat. Med god prestandamarginal, potential för fler optimeringar och hantering av specialfall, skulle triealgoritmen som 12
föreslås i denna rapport sannolikt kunna vidareutvecklas till en väl fungerande textinmatningsapplikation. 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. [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. 13