3. I begynnelsen var
Inkasso
Men jeg har jo betalt!
Hvorfor skjønner de ikke det?
4. Kan dette være
grunnen?
Masse tall som er lette å skrive feil
5. Ønsker de at vi skal
skrive feil?
Slik kunne det sett ut
Slik ser det ut
hvis de ville hatt færre feil
6.
7. Jeg produserer KID numre
og andre koder som kan rettes,
og jeg retter dem når de har fått feil
Dette konseptet må ofte
forklares
8. Luhn-10 Øyhus*
715815555022 feil 5736475462384 7 feil
71581555 022 korrekt 5736475 6238497 rettet
44409219198046644795 f. 5521 5505064 00 feil
44490219198046644795 k. 552155505064000 rettet
44400219198046644794 f. 834 38968350407 feil
44400219198066444794 k. 834738968550407 rettet
urettet rettet
*Variant med 10 000 000 000 koder og 15 siffer
9. Luhn-10 Øyhus*
Oppdager 90% av feil Oppdager 99.999% av feil
Retter alltid enkeltfeil, og
Retter ingen feil
vanligvis flere
1 ekstra siffer 5 ekstra siffer
Intet er justerbart Alt er justerbart
*Variant med 10 000 000 000 koder og 15 siffer
10. *Variant med 10 000 000 000 koder og 15 siffer
Denne ble valgt fordi 10 000 000 000 KID numre er
omtrentlig nok for å unikt identifisere alle regninger i
Skandinavia i 10 år.
Det ville da vært nok å bare fylle ut KID.
11. Hvor mye feil er det?
Sånn omtrentlig?
KID nummer 3.6%
Konto-nummer 5.1%
Dato 1.1%
Beløp 0.9%
Andel feil funnet ved etterkontroll 2.8%
Andel gjenværende feil i kontonummer 8%
Resultatene er fra Kai Olsens forsking:
“Customer Errors in Internet Banking”
12. Noen eksempler på
Søk med retting
fra telefonkatalogen
og
findsim.com
13. Søkes: "Jaha Kendosi" Søketid 0.3 sekunder
% Avvik Navn Gate Nr PostNr. Sted Tlf.
5 117 Yahia El Qendouci Kolstadg 7 0652 Oslo 47890792
5 119 Yahia El Qendouci Kolstadgata 7 0652 Oslo 46265813
4 119 Qendouci Yahia El Kolstadgata 7 0652 Oslo 45405242
2 127 Monique Jaha Sandakerveien 140 0484 Oslo 93869192
1.8 128 Katja Kandolin Thomas Heftyes G 8A 0264 Oslo 47611491
1.5 130 Sinnarajah Kandiah Ensjøveien 31B 0661 Oslo 41788254
Diana Amendoeira
1.3 131 Lutvannsv 36 0676 Oslo 97518159
Maciel Hjørungnes
1.3 131 Jahn Kenneth Sanne Lundliveien 1 0580 Oslo 47335333
1.3 131 Sivarajah Kandiah Høyenhallveien 64 0678 Oslo 91663955
1.2 132 Kumar Dahal Kingos gate 18 0457 Oslo 96837595
1.0 134 Yara Industrial AS 41404242
14. Søkes: "Emerita 22224B24" Søketid 0.4 sekunder
% Avvik Navn Gate Nr PostNr Sted Tlf
29 101 Emerita Lumasac Manuel Gunnulvsvei 14 670 Oslo 22274874
6 116 Ingun Emelie Hansen Dynekilgata 15 569 Oslo 22224924
3 122 Bent Kure Hammerstads gate 23D 363 Oslo 22442414
3 123 Emerita Roy Johannessen Nuggerudveien 5 1089 Oslo 96678014
2 125 Berit Engh Hammerstads gate 21B 363 Oslo 22468249
2.0 127 Marita Vidvei Bjelland 95260797
1.4 131 Enervital helse & velvære Cort Adelers gate 33 254 Oslo 97000488
1.3 132 Rosario Brian Demeza James Grimstadgata 24B 464 Oslo 40331241
1.0 134 Juvenal Benemerito Jimenez Dr.Dedichens vei 66 675 Oslo 92224998
1.0 134 Bente Lund Sorgenfrigata 24B 365 Oslo 48054656
0.9 135 Knut Erik Borge Rief Sorgenfrigata 24B 365 Oslo 93262456
15. Søkes: "Tor Olav Fogstad" Søketid 0.3 sekunder
% Avvik Navn Gate Nr PostNr. Sted Tlf.
43 91 Thor Olav Drege Fougstadsgate 2 0173 Oslo 90966897
14 102 Tor Olav Augestad Biskop Gunnerus' G 6 0155 Oslo 41551179
6 111 Per Olav Rogstad Nydalsv 28 0484 Oslo 92420211
4 114 John Olav Togstad Langerudhaugen 12B 1187 Oslo 22289141
2 119 Per Olav Kalsheim Fougstads G 22B 0173 Oslo 93007856
2 121 Tor Olav Jacobsen Ostadalsveien 52 0753 Oslo 21947024
1.2 127 Tor Olav Bjørnstad Slettenv 8 1177 Oslo 91593694
1.1 128 Per Olav Grønnevik Bogstadv 62C 0366 Oslo 93646406
1.1 128 Knut Olav Krohn Lakså Fougstads gate 41A 0173 Oslo 97180908
0.9 130 Knut Olav Folkestad Akersg 55 0180 Oslo 93037727
0.8 131 Victor Lazarev Bogstadv 27B 0355 Oslo 90232609
16. Nummeropplysning
• Folk vet at nummeropplysningene ikke
klarer vanskelige spørsmål, og at internett
er billigere
• Søk med retting gjør det mulig å opplyse
raskere fordi operatøren kan slurveskrive
fort og alikevel få riktig svar
20. Noen søketips
• Det er bedre å skrive mye galt enn lite og
riktig, fordi det gir mere informasjon
• Skriv det slik det låter
• Mellomrom og store forbokstaver kan være
nyttige hint for søkemotoren
21. Vask av adresselister,
Rens av databaser
Postfordeling, pakkeutsendelser,
direktereklame, kundelister, og lignende, har
problemer med gale data, gale adresser.
Disse feilene forsøkes rettes med mange
systemer som sammenligner data, og adresser.
Søk med retting
sammenligner mye bedre
22. Forskningssjef i Google, Peter Norvigs staveretter:
"""Spelling Corrector.
Copyright 2007 Peter Norvig.
Open source code under MIT license: http://www.opensource.org/licenses/mit-license.php
"""
import re, collections
def words(text): return re.findall('[a-z]+', text.lower())
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
NWORDS = train(words(file('big.txt').read()))
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def edits1(word):
s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [a + b[1:] for a, b in s if b]
transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]
replaces = [a + c + b[1:] for a, b in s for c in alphabet if b]
inserts = [a + c + b for a, b in s for c in alphabet]
return set(deletes + transposes + replaces + inserts)
def known_edits2(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
def known(words): return set(w for w in words if w in NWORDS)
def correct(word):
candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
return max(candidates, key=NWORDS.get)
23. Norvig Øyhus
Retter opptil 3 feil Retter opptil 200 feil
Retter hele søk,
Retter enkeltord
på tvers av ord
Alle feil er like sannsynlige Variabel feilsannsynlighet
Søker i millioner av
Søker i tusener av ord
adresser og låt-navn
Finner sannsynligste feil Integrerer alle feilene
Kjører på Googles
Kjører på en server
serverpark
27. Tekniske detaljer
• Bruker ikke indekser
• Massivt sekvensielt søk
• Systemet kan parallelliseres til ønsket
hastighet, med lite overhead
• Alle kjerner brukes effektivt i parallell
28. Tekniske detaljer
• Programmert i Assembler med SSE4 128
bit, C, og C++
• SSE4, Streaming SIMD Extensions, brukes til
å kjøre 16 utregninger i parallell per kjerne
• Intels SSE 4.1 ser ut til å være bedre, med
ca 30% større ytelse her
29. Tekniske detaljer
• Minne-utlegg optimalisert for hastighet.
16 GB/s på DDR2 6400
• Trenger mer enn 32 ganger databasens
størrelse i RAM for forhåndsutregninger
som øker hastigheten ca 25 ganger, og tar
under ett minutt å regne ut
• Begrensingen på 200-300 feil skyldes
begrensinger i standard flyttall, og kan
fjernes, og har blitt fjernet ved anledning
30. Slik programmerer jeg
SSE4 assembler
makroer i GCC
/* max16(signed chars) gjoer foelgende:
* if(a>b) a=b;
* PS: Mulig at disse to avhengige instruksjonene senker
* prosessoren. Faar se paa det senere. Splitting?
* Hvorfor PADDB i stedet for PADDSB? De er ekvivalente her,
* og droppingen av satureringen gjoer det kanskje raskere.
*/
#define qmax16(a,b) asm("psubsb %1, %0 n"
"paddb %1, %0 "
:"+x" (a)
:"%x" (b), "x" (0)
);