import bibdata
import numpy
[peter_plys, smilla, cirkeline, cykelmyggen, berlin, paris, strikning,
q84, kafka] = [8955, 8214, 616, 580, 149, 278, 126, 29, 688]
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.
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]
Hvis vi nu sorterer listen af bøger efter afstanden til den valgte bog, så får vi en liste af anbefalinger.
sorted(distances_from_peter_plys)[:10]
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]
).
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:
recommendations(smilla)[:10]
recommendations(cirkeline)[:10]
recommendations(cykelmyggen)[:10]
recommendations(berlin)[:10]
recommendations(strikning)[:10]
recommendations(kafka)[:10]
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.