Mikbe

RSS-feed

Automagi: finne kjønn fra navn

En magisk hattJeg er en stor fan av automagi. For meg er det et sikkert tegn på kvalitet når en dings, et program eller en webapplikasjon gjør noe for meg som er smart, flott, pent og kanskje viktigst: uventet. Det kan dreie seg om småtterier, ting som du selv hadde brukt bare få sekunder på å fikse, men som utvikleren likevel har tatt seg tid til å fri deg for. Eller at programvaren finner opplysninger som du trodde du måtte strebe lenger etter. Eller funksjoner som ikke er åpenbare, men som likevel aktiveres når du trenger dem, via automagi.

Google har en del slike eksempler. For meg ga valutakalkulatoren deres en slik opplevelse. Jeg prøvde å finne en valutakalkulator via Google, da det viste seg at Google hadde allerede laget funksjonen rett i søkemotoren! Steike, hvor praktisk.

Facebook har også mye automagi. Når et nytt par kommer i minifeeden, og “are now officially in a relationship”, finner Facebook automagisk fram et bilde av paret. Selvfølgelig er det ikke noe teknisk vanskelig når de allerede har taggsystemet, men det er likevel godt kommet på.

I all min fascinasjon av slike funksjoner må jeg selvsagt lage noen selv når jeg har sjansen.

Finne kjønn fra fornavn

Et prosjekt jeg holder på med på fritiden, noen ganger, innimellom alle TV-seriene og sovinga og GT5P-spillinga, inneholder en brukerregistrering.Scriptet tipper at \ Av og til kan det være kjekt å vite hvilket kjønn en bruker er.

Min oppdagelse var at i de aller fleste tilfeller, det vil si alle på min Facebook-venneliste, pluss alle jeg fant på diverse websider med navnelister, kunne man automatisk finne ut hvilket kjønn brukeren er. Det må tas høyde for bugs, slik at det må gå an å angi kjønn selv, men med en slik metode kan man foreslå kjønn — og i de aller fleste tilfeller ha rett.

  1. function autosex($name) {
  2. // Main rule: vowels are girls, consonants are boys.
  3. $girl = array('a', 'e', 'i', 'o', 'u', 'y', 'æ', 'ø', 'å');
  4. $boy = array('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'z');
  5. // Exeptions (either whole names, or endings)
  6. array_push($girl, 'lin', 'unn', 'it', 'id', 'ig', 'borg', 'bjørg', 'ild', 'rin', 'vår', 'iken', 'ritt', 'th', 'bet', 'inger', 'sti', 'stin', 'liv', 'run', 'hildur', 'lillian', 'lilian', 'vigdis', 'ren', 'iv', 'inn', 'ann', 'agnes', 'helen', 'ett', 'len', 'ill', 'il', 'marion', 'rakel', 'gjerd', 'maj', 'carmen', 'ljot', 'dagmar', 'edel', 'ellinor', 'ester', 'evelyn', 'frøydis', 'gerd', 'rud', 'vor', 'nnah', 'dis', 'iris', 'ret', 'reth', 'miriam', 'mor', 'aug', 'sarah', 'sidsel', 'sissel', 'siw', 'vivian', 'summer');
  7. array_push($boy, 'andre', 'andré', 'helge', 'ingo', 'roberto', 'sondre', 'onny', 'arne', 'tle', 're', 'arild', 'tommy', 'ståle', 'rve', 'ole', 'rune', 'pelle', 'jarle', 'frode', 'inge', 'agne', 'dino', 'kenneth', 'henry', 'ove', 'finn', 'rje', 'aute', 'brede', 'mike', 'ola', 'emil', 'stig', 'olai', 'skild', 'skil', 'tony', 'vid', 'kai', 'ludvig', 'åge', 'age', 'asle', 'audunn', 'børge', 'cato', 'denny', 'egil', 'gisle', 'rry', 'hugo', 'jo', 'remi', 'roy', 'sigve', 'viggo', 'willy', 'kjetil', 'bertil', 'yngve');
  8.  
  9. // Known bugs: Ari, Carola, Ali
  10.  
  11. // Checks for each sex. If exeption is invoked, this gives higher priority of the determinition.
  12. foreach ($girl as $end) {
  13. $n = strlen($end);
  14. $lc = substr($name, 0-$n);
  15. if (strtolower($end) == strtolower($lc)) { $sg = 1; if ($n > 1) { $girl_exept = 1; } }
  16. }
  17. foreach ($boy as $end) {
  18. $n = strlen($end);
  19. $lc = substr($name, 0-$n);
  20. if (strtolower($end) == strtolower($lc)) { $sb = 1; if ($n > 1) { $boy_exept = 1; } }
  21. }
  22.  
  23. if ($sg) { $s = 'g'; }  // The order determines the priority
  24. if ($sb) { $s = 'b'; }
  25.  
  26. if ($girl_exept) { $s = 'g'; }
  27. if ($boy_exept) { $s = 'b'; }
  28.  
  29. return $s;
  30. }

Sjekk demo av funksjonen »

Funksjonen er enkel, og muligens mest et proof-of-concept. Likevel fungerer den forbausende godt. Foreløpig vet jeg bare om tre navn som ikke fungerer: Ari, Ali og Carola.

Funksjonen kan for eksempel kalles opp via AJAX for å finne kjønnet, og så sette dette som “selected” i et select-element.

Det kan godt hende det finnes bedre metoder også. En metode som kan være enda mer pålitelig, er å sjekke Statistisk sentralbyrås navnestatistikk for hvert kjønn, og sammenlikne disse.

Finner du noen flere navn som ikke fungerer? Skriv en kommentar!

7 kommentarer

  1. Espen sier: ()

    Veldig bra artikkel! Det er så banalt enkelt; småting som gjør en glad.

    Å hente data fra statistisk sentralbyrå blir tungt og ressurskrevende, og det er ikke krise om testen slår feil ut. Det er jo et forslag.

    Små ideer som er for banale til å bli husket på er fint:)

  2. Mikbe » Arkiv » Finne tidssone via JavaScript sier: ()

    [...] blir mye automatisering av småtterier på web her i starten av blogggen. Den første posten var om å finne kjønn ut i fra fornavn. Denne gangen er det tidssone vi skal [...]

  3. Kim Silkebækken sier: ()

    “Scriptet tipper at KALLE er ei jente” :P

  4. admin sier: ()

    Kim: Hehe! Noen bugger er det. Heldigvis er de aller fleste veldig enkle å fikse. I tilfellet Kalle, som omtrent 0,0015 prosent av befolkningen heter ([1] [2]), vil det være bare å legge inn “kalle” som et unntak i $boy. :)

  5. Magnus Holm sier: ()

    Jeg ble jo pent til til å lage et program som henter ut kjønnet via SSB. Bruker i snitt 0,6 sek for å finne riktig.

  6. Mikael sier: ()

    There you go. :-) Ingenting å si på den hastigheten!

  7. Daniel sier: ()

    Idun og Tyri slå feil ut.

Kommenter




XHTML: Du kan bruke disse taggene: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>