Case: Anbefalinger

In [1]:
import bibdata
import numpy
In [2]:
[peter_plys, smilla, cirkeline, cykelmyggen, berlin, paris, strikning, 
   q84, kafka] = [8955, 8214, 616, 580, 149, 278, 126, 29, 688]
In [3]:
def distance(a, b):
    return numpy.linalg.norm(a - b)

Genrerummet bør også kunne bruges til, at finde litterære anbefalinger.

Lad os vælge en bog og derefter finde afstanden fra denne til alle andre bøger. Vi inkluderer titel/forfatter for at gøre resultatet mere læsbart. Når vi skriver [:10] betyder det, at vi kun viser de første 10 resultater i stedet for hele listen.

In [4]:
distances_from_peter_plys = [
    (distance(bibdata.genres[peter_plys], bibdata.genres[other_book]), 
        bibdata.title_creator(other_book)) 
    for other_book in range(0, 10000)
]
distances_from_peter_plys[:10]
Out[4]:
[(1.4011684494447065, 'Fifty shades - E. L. James (book)'),
 (1.4332511957653991, 'Journal 64 : krimithriller - Jussi Adler-Olsen (book)'),
 (1.4319693083341756,
  'Marco effekten : krimithriller - Jussi Adler-Olsen (book)'),
 (1.4377953467714748, 'Taynikma - Jan Kjær (f. 1971) (book)'),
 (1.4561631856697466, 'De glemte piger : krimi - Sara Blædel (book)'),
 (1.4390826249649267,
  'Den grænseløse : krimithriller - Jussi Adler-Olsen (book)'),
 (1.2877310264792368, 'Vildheks - Lene Kꜳberbøl (book)'),
 (1.4363966653595654, 'Dødesporet : krimi - Sara Blædel (audiobook)'),
 (1.4501109638315552, 'Dødsenglen : krimi - Sara Blædel (book)'),
 (1.4287816916279745,
  'Flaskepost fra P : krimithriller - Jussi Adler-Olsen (book)')]

Hvis vi nu sorterer listen af bøger efter afstanden til den valgte bog, så får vi en liste af anbefalinger.

In [5]:
sorted(distances_from_peter_plys)[:10]
Out[5]:
[(0.0,
  'Peter Plys : komplet samling fortællinger og digte - A. A. Milne (book)'),
 (0.53454719612995338,
  'Bogen om Emil fra Lønneberg : samlet udgave med alle historierne om Emil fra Lønneberg - Astrid Lindgren (book)'),
 (0.53718166508329679,
  'Astrid Lindgrens allerbedste historier - Ingrid Vang Nyman (book)'),
 (0.54053996866025411,
  'Mumitrolden : de samlede striber - Tove Jansson (book)'),
 (0.5654914190345337,
  'Klatremus og de andre dyr i Hakkebakkeskoven - Thorbjørn Egner (book)'),
 (0.57263271765819757,
  'Pippi Langstrømpe går om bord - Astrid Lindgren (audiobook)'),
 (0.57288576301783933, 'Bogen om Pippi Langstrømpe - Astrid Lindgren (book)'),
 (0.58822503022521333,
  'Anne Marie Helger læser Vinden i piletræerne - Anne Marie Helger (audiobook)'),
 (0.60406738110296454,
  'Pippi Langstrømpe i Sydhavet - Astrid Lindgren (audiobook)'),
 (0.61582753873808027,
  'Han er her endnu - Emil fra Lønneberg - Astrid Lindgren (book)')]

Vi kan nu definere dette i en funktion, hvor vi kun returnerer titlerne. Hvis man i programmering har et par data: rec = (afstand, titel) kan man få fat i titel ved at skrive rec[1] (og få fat i afstand ved at skrive rec[0]).

In [6]:
def recommendations(book):
    return [recommendation[1] for recommendation in
        sorted([
            (distance(bibdata.genres[book], bibdata.genres[other_book]), 
                bibdata.title_creator(other_book)) 
            for other_book in range(0, 10000)])]

Med denne funktion kan vi så udforske anbefalingerne til forskellige bøger:

In [7]:
recommendations(smilla)[:10]
Out[7]:
['Frøken Smillas fornemmelse for sne : roman - Peter Høeg (book)',
 'Den kroniske uskyld - Klaus Rifbjerg (audiobook)',
 'Vinter-Eventyr - Karen Blixen (book)',
 'Kongens Fald - Johannes V. Jensen (f. 1873) (book)',
 'Ved Vejen - Herman Bang (book)',
 'Rend mig i traditionerne - Leif Panduro (audiobook)',
 'Kronprinsessen : roman - Hanne-Vibeke Holst (book)',
 'Det forsømte forår - Hans Scherfig (book)',
 'Drageløberen - Khaled Hosseini (book)',
 'Pelle Erobreren : barndom - Martin Andersen Nexø (book)']
In [8]:
recommendations(cirkeline)[:10]
Out[8]:
['Cirkeline bliver til - Hanne Hastrup (book)',
 'Godmorgen Cirkeline - Hanne Hastrup (book)',
 'Cirkeline - tæl til 10 - Hanne Hastrup (book)',
 'Godnat Cirkeline - Hanne Hastrup (book)',
 'Cirkeline på opdagelse - Ulla Raben (book)',
 'Cirkeline godnat - Hanne Hastrup (book)',
 'Den store bog om Cirkeline - Hanne Hastrup (book)',
 'Cirkeline flytter til byen - Hanne Hastrup (book)',
 'Kender du Pippi Langstrømpe? : billedbog - Ingrid Vang Nyman (book)',
 'Cirkeline - Hanne Hastrup (book)']
In [9]:
recommendations(cykelmyggen)[:10]
Out[9]:
['Cykelmyggen Egon - Flemming Quist Møller (book)',
 'Den store bog om den glade løve - Louise Fatio (book)',
 'Bennys badekar - Flemming Quist Møller (book)',
 'Pandekagekagen - Sven Nordqvist (book)',
 'Stakkels Peddersen - Sven Nordqvist (book)',
 'Gok-gok i køkkenhaven - Sven Nordqvist (book)',
 'Findus flytter hjemmefra - Sven Nordqvist (book)',
 'Og hanen gol - Sven Nordqvist (book)',
 'Paddington - Michael Bond (book)',
 'Rasmus får besøg - Jørgen Clevin (book)']
In [10]:
recommendations(berlin)[:10]
Out[10]:
['Turen går til Berlin - Therkelsen Kirstine (book)',
 'Politikens visuelle guide - Berlin - Søndervang Allan edt (book)',
 'Top 10 Berlin - Jürgen Scheunemann (book)',
 'Turen går til Amsterdam - Anette Jorsal (book)',
 'Turen går til Prag - Hans Kragh-Jacobsen (book)',
 'Turen går til Hamburg og Nordtyskland - Jytte Flamsholt Christensen (book)',
 'Turen går til Californien & det vestlige USA - Preben Hansen (f. 1956) (book)',
 'Turen går til London - Gunhild Riske (book)',
 'Politikens Kort og godt om Berlin - Charmetant Jim (book)',
 'Politikens visuelle guide - Prag - Vladimír Soukup (book)']
In [11]:
recommendations(strikning)[:10]
Out[11]:
['Alt om håndarbejdes strikkemagasin -  (other)',
 'Kreativ strik -  (other)',
 "Ingelise's strikkemagasin -  (other)",
 'DROPS : strikkdesign - Garnstudio (periodica)',
 'Alt om håndarbejdes symagasin -  (other)',
 'Maries ideer : håndarbejde, strik, sy, hækl, bolig, inspiration -  (other)',
 'Burda style -  (other)',
 'Burda -  (other)',
 'Burda modemagasin : verdensberømt mode -  (other)',
 "Ingelise's symagasin -  (other)"]
In [12]:
recommendations(kafka)[:10]
Out[12]:
['Kafka på stranden - Haruki Murakami (book)',
 'Trækopfuglens krønike - Haruki Murakami (book)',
 'Norwegian wood - Haruki Murakami (book)',
 'Sønden for grænsen og vesten for solen - Haruki Murakami (book)',
 'Efter midnat - Haruki Murakami (book)',
 'Sputnik min elskede - Haruki Murakami (book)',
 'Hvad jeg taler om når jeg taler om at løbe - Haruki Murakami (book)',
 'Brooklyn dårskab : roman - Paul Auster (book)',
 '1Q84 - Haruki Murakami (audiobook)',
 'Efter skælvet - Haruki Murakami (book)']

Vi har hermed lavet koden for en lille anbefalingsservice.

For perspektivering, sammenlign eksempelvis resultaterne med anbefalingerne på bibliotekernes hjemmesider. Bemærk at vi her kun kigger på et lille udvalg af materialebestanden. På bibliotek.dk kan anbefalinger findes ved, at fremsøge en bog, og derefter klikke på "Inspiration", og "Andre der har lånt...". Genrerummet som vi benytter her, er faktisk udregnet fra (en lille delmængde af) de "Andre der har lånt"-data, som DBC havde med på Hack4DK.

Bemærk at bøgerne, som vi finder anbefalinger for, er valgt på forhånd (og derved uafhængigt af hvordan anbefalingerne bliver). Derfor må kvaliteten af anbefalinger forventes at være repræsentativ.

Øvelser

  • Ændr antallet af resultater der vises for nogle af de ovenstående bøger.
  • Udforsk anbefalingerne for andre bøger end de ovenstående.