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:
import bibdata
import sklearn.cluster
k = 15
kmeans = sklearn.cluster.KMeans(n_clusters = k)
kmeans.fit(bibdata.genres)
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:
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)]
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.
k
, af fundne klynger. Prøv eksempelvis med 25 eller flere, hvorved resultatet bliver mere finkornet.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).