Case: Genre-klynger

Jeg er nysgerrig om hvilke typer / kategorier af biblioteksmaterialer, der er. Særligt i litteratur, som ligger ud over klassifikationssystemer som DK5. Derfor vil jeg lave en mere udforskende / eksplorativ analyse. En tilgang til detter er, at bede computeren, at sortere biblioteksmaterialerne i et antal bunker(klynger), hvor ting, der ligner hinanden, ligger i samme bunke(klynge).

Dette kaldes klynge-analyse, og en af de enkleste måder at gøre dette kaldes k-means. Her starter man med at fortælle hvor mange bunker man ønsker. Dette antal kaldes ofter $k$. Algoritmen virker således: vi har et punkt i genrerummet for hver bunke. Hver bog lægges i den bunke, hvor afstanden mellem bunkens punkt og bogen er kortest. Derefter flyttes punktet for hver bunke, til gennemsnits-punktet for alle bøgerne i bunken. Dette gentager man indtil, at punkterne for bunkerne ikke længere flytter sig.

Bemærk at vi her beder computeren om, selv at finde en struktur i data. Dette kaldes unsupervised learning indenfor machine learning / data mining.

Når vi skal programmere det, findes k-means algoritmen allerede i Python's SciKit-Learn funktionsbibliotek. Så vi behøver blot importere det, fortælle at vi ønsker k-means med $k$ klynger, samt at den skal køre algoritmen på genrerummet:

In [6]:
import bibdata
import sklearn.cluster
k = 15
kmeans = sklearn.cluster.KMeans(n_clusters = k)
kmeans.fit(bibdata.genres)
Out[6]:
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=15, n_init=10, n_jobs=1, precompute_distances='auto',
    random_state=None, tol=0.0001, verbose=0)

Nu har computeren fundet nogle klynger, som vi kan kigge på.

Vi vil nu se hvad klyngerne indeholder. For hver klynge udskriver vi derfor titel/forfatter for de første bøger i hver klynge. Koden for dette læses lettest bagfra: cluster_id er nummeret på klyngen. For hvert cluster_id gennemløber alle 10000 bøger, og udvælger dem som faktisk ligger i klyngen. Til dette bruger vi kmeans.labels_, som er en liste over hvilken klynge hver bog hører til. Herefter udvælger vi de første book_count bøger, som vi returnere, så vi faktisk kan se hvad der er i klyngen:

In [7]:
book_count = 7
[[bibdata.title_creator(book_id)
  for book_id in range(10000)
  if kmeans.labels_[book_id] == cluster_id][0:book_count]
 for cluster_id in range(k)]
Out[7]:
[['Os fra Blomsterkvarteret - Dy Plambeck (book)',
  'Troldmandens flyvefedt - Bent T. Lund (f. 1946) (book)',
  'Klods-Hans - H. C. Andersen (f. 1805) (audiobook)',
  'Hvad kan det være? - Keld Petersen (f. 1955) (book)',
  'Kejserens nye klæder - Birte Dietz (book)',
  'Den grimme ælling - Svend Otto (book)',
  'Læs og gæt gåder - Keld Petersen (f. 1955) (book)'],
 ['Naboens søn : roman - Jane Ꜳmund (book)',
  'Knud, den store : roman - Hanne-Vibeke Holst (book)',
  'Zornig - vrede er mit mellemnavn - Lisbeth Zornig Andersen (f. 1968) (book)',
  'Vindue uden udsigt - Jane Ꜳmund (book)',
  'Vi kan sove i flyvemaskinen - Ulla Terkelsen (audiobook)',
  'Hvor solen græder : en fortælling fra Syrien - Puk Damsgård Andersen (book)',
  'Onklerne og deres fruer : erindringsroman (mp3) - Jane Aamund (audiobook)'],
 ['Fifty shades - E. L. James (book)',
  'Journal 64 : krimithriller - Jussi Adler-Olsen (book)',
  'Marco effekten : krimithriller - Jussi Adler-Olsen (book)',
  'Taynikma - Jan Kjær (f. 1971) (book)',
  'De glemte piger : krimi - Sara Blædel (book)',
  'Den grænseløse : krimithriller - Jussi Adler-Olsen (book)',
  'Dødesporet : krimi - Sara Blædel (audiobook)'],
 ['Vildheks - Lene Kꜳberbøl (book)',
  'Harry Potter og De Vises Sten - Joanne K. Rowling (book)',
  'Skammerens datter - Lene Kꜳberbøl (book)',
  'Harry Potter og Hemmelighedernes Kammer - Joanne K. Rowling (book)',
  'Mustafas kiosk - Jakob Martin Strid (book)',
  'Wimpy Kid - Jeff Kinney (book)',
  'Gummi-Tarzan - Ole Lund Kirkegꜳrd (audiobook)'],
 ['Vi unge : kun for piger -  (other)',
  'Livs liv - Rikke Dyrhave Nissen (book)',
  'Pretty little liars - Sara Shepard (book)',
  'Knus-klubben - Gitte Løkkegꜳrd (book)',
  'Lego Indiana Jones - the original adventures - Glyn Scragg (game)',
  'Olivia -  (other)',
  'Toy story 3 - Walt Disney (firma) (game)'],
 ['Stå fast : et opgør med tidens udviklingstvang - Svend Brinkmann (book)',
  'Spis maven flad : sådan gør du! : 111 skønne opskrifter - Engell Majbritt L. aut (book)',
  'Tarme med charme : alt om et undervurderet organ - Giulia Enders (book)',
  'Hvad kan jeg blive? : Politikens erhvervsvejledning - Dueled Knud (book)',
  'Verdens bedste kur : vægttab der holder - Bitz Christian aut (book)',
  'Dr. Zukaroffs testamente : en bog om menneskehjernen - Peter Lund Madsen (book)',
  'Stenalderkost : palæo-opskrifter til det moderne menneske - Thomas Rode Andersen (book)'],
 ['Min mormors gebis - Jakob Martin Strid (book)',
  'Kender du Pippi Langstrømpe? : billedbog - Ingrid Vang Nyman (book)',
  'Pippi Langstrømpe på Kurrekurredut-øen - Ingrid Vang Nyman (book)',
  'Lille frø - Jakob Martin Strid (book)',
  'Da Findus var lille og forsvandt - Sven Nordqvist (book)',
  'Fyrtøjet - H. C. Andersen (f. 1805) (book)',
  'Da Lille Madsens hus blæste væk - Jakob Martin Strid (book)'],
 ['Turen går til Hamburg og Nordtyskland - Jytte Flamsholt Christensen (book)',
  'Turen går til London - Gunhild Riske (book)',
  'Turen går til Rom - Alfredo Tesio (book)',
  'Turen går til Mallorca, Menorca & Ibiza - Jytte Flamsholt Christensen (book)',
  'Turen går til Tyrkiet - Fenger-Grøndahl Carsten (book)',
  'Turen går til Berlin - Therkelsen Kirstine (book)',
  'Turen går til Sydspanien - Jørgen Laurvig (book)'],
 ['Kriminalkommissær Barnaby - Caroline Graham (movie)',
  'Avatar - Fiore Mauro cng (movie)',
  'Hævnen - Bier Susanne (movie)',
  'Dirch - Zandvliet Martin Pieter (movie)',
  'The godfather - Willis Gordon (movie)',
  'Flammen & Citronen - Andersen Lars K. f. 1960-11-27 (movie)',
  'Black swan (blu-ray) - maclaughlin McLaughlin John J. (movie)'],
 ['Bamses billedbog dvd - Katrine Hauch-Fausbøll (movie)',
  'Kaj og Andrea - Fausbøll Katrine Hauch- (movie)',
  'Ninjago - masters of spinjitzu - Sørensen Thomas inv (movie)',
  'Pippi - Hellbom Olle (movie)',
  'Filmhits for børn -  (movie)',
  'Legends of Chima - Andreasen Tommy inv (movie)',
  'Op. Med bonus features disc - Docter Pete (movie)'],
 ['Niceville - Kathryn Stockett (book)',
  'Jeg skal gøre dig så lykkelig - Anne B. Ragde (audiobook)',
  'Den stjålne vej - Anne-Cathrine Riebnitzsky (book)',
  'Øen - Victoria Hislop (book)',
  'Jordemoderen fra Hope River - Patricia Harman (audiobook)',
  'Fra hus til hus : roman - Kristín Marja Baldursdóttir (book)',
  'Orkideens hemmelighed - Lucinda Riley (audiobook)'],
 ['Den gode opgave : opgaveskrivning på videregående uddannelser - Rienecker Lotte (book)',
  'Interview : en introduktion til det kvalitative forskningsinterview - Steinar Kvale (book)',
  'Læring : aktuel læringsteori i spændingsfeltet mellem Piaget, Freud og Marx - Knud Illeris (book)',
  'Kvalitative metoder : en grundbog - Tanggaard Lene edt (book)',
  'Klassisk og moderne samfundsteori - Kaspersen Lars Bo edt (book)',
  'Helbredets mysterium : at tåle stress og forblive rask - Aaron Antonovsky (book)',
  'Modernitet og selvidentitet : selvet og samfundet under sen-moderniteten - Anthony Giddens (book)'],
 ['Alt om håndarbejdes symagasin -  (other)',
  'Alt om håndarbejdes strikkemagasin -  (other)',
  'Alt om haven -  (other)',
  'Haven - Det Jyske Haveselskab (other)',
  'Danmarks store gør det selv leksikon - Nielsen Jørn (book)',
  'Burda -  (other)',
  'Politikens strikke- og hæklebog - Vivian Høxbro (book)'],
 ['Giganternes fald - Ken Follett (audiobook)',
  'Og bjergene gav genlyd - Khaled Hosseini (book)',
  'Det syvende barn - Erik Valeur (audiobook)',
  'Den hundredårige der kravlede ud ad vinduet og forsvandt - Jonas Jonasson (book)',
  '1Q84 - Haruki Murakami (audiobook)',
  'Min kamp : roman - Karl Ove Knausgård (book)',
  'Brobyggerne - Jan Guillou (book)'],
 ['Det blinde punkt : krimi - Julie Hastrup (book)',
  'Ensomme hjerters klub : kriminalroman - Lotte Hammer (book)',
  'Skrig under vand - Ole Tornbjerg (book)',
  'Alting har sin pris : kriminalroman - Lotte Hammer (book)',
  'Skindød - Thomas Enger (book)',
  'Møgkællinger - Gretelise Holm (f. 1946) (book)',
  'Manden der ikke var morder - Hans Rosenfeldt (book)']]

Hvis vi kører klyngeanalysen igen, vil den komme med nogle andre klynger, men strukturen i resultatet vil være det samme, i.e. rejsebøger, børnefilm, forskellige typer krimier, forskellige typer børnebøger, andre forskellige typer romaner, studiebøger, etc.

Resultatet er i mine øjne interessant. Blandt andet ser jeg forskellige separate typer af skønlitteratur, hvis opdeling jeg ikke kendte til i forvejen. Det kunne være interessant, at køre dette mere finkornet, på større datasæt, og derefter danne nogle foreslag til emnehierakier for skønlitteratur, for at få mere indblik i denne del af litteraturen.

Øvelser

  • Få computeren til at udføre denne notebook flere gange, og se hvordan de fundne klynger ændre sig, men stadigt har noget af den samme struktur. (Rækkefølgen ændres også, så læg i stedet mærke til karakteristiske klynge, og se at/om de går igen).
  • Ændr antallet, k, af fundne klynger. Prøv eksempelvis med 25 eller flere, hvorved resultatet bliver mere finkornet.
  • Ændr det maksimale antal af bøger book_count, som bliver vist fra hver klynge. Hvis man viser mere end de nuværende 7 materialer, giver det mere indblik i klyngen (men ville også bruge mere papir/skærmplads).