[Pubblichiamo la traduzione in lingua italiano dell’articolo Analyzing Cultural Domains with Python scritto dall’autore di Data Science con Python. Un linguaggio quest’ultimo versatile e potente per giocare… con il linguaggio.]
L’analisi dei dominî culturali (Cultural Domain Analysis, CDA) è lo studio di come gruppi di persone interpretino elenchi di termini in qualche modo associati, e di come queste intepretazioni differiscano di gruppo in gruppo. Alcuni, se leggono candela, pensano Natale e altri, invece, blackout. Antropologi, etnografi, psicologi e sociologi usano la CDA per comprendere gli immaginari semantici di gruppi sociali, etnici, religiosi, professionali e altro. Prima dei computer e di software specializzato, gli scienziati sociali praticavano la CDA lavorando di fatto manualmente. Non più! Grazie alla distribuzione Python Anaconda generosamente distribuita gratuitamente da Continuum Analytics, l’approccio carta-e-matita è definitivamente obsoleto. In questo articolo mostrerò come costruire uno script veloce e anche abbastanza raffinato per analizzare dominî culturali. In effetti si tratta di uno script abbastanza flessibile per supportare ricerca scientifica vera. L’analisi dei dominî culturali costituisce un caso molto particolare di analisi dei dati e si applica in tre passaggi principali:
- reperire i dati;
- costruire un modello; e
- interpretare i risultati.
Importazione
La maggior parte dei moduli Python necessari per la CDA è già compresa in Anaconda: urllib.request ricavare dati dal web; os, os.path e pickle per il caching dei dati; NLTK per il loro preprocessing; NumPy e Pandas per le operazioni numeriche e networkx per la modellazione di reti. Uno dei moduli però, community (per il riconoscimento della comunanza tra reti), va installato separatamente. All’inizio dello script importo tutti i moduli.
import urllib.request import os, os.path, pickle import nltk import pandas as pd, numpy as np import networkx as nx import community
Si tratta di moduli talmente ubiqui nell’analisi dei dati che spesso li importo persino prima di decidere da dove ricavare i dati e che cosa farci.
Iniziamo dal termine
Un termine (term in inglese) è un’unità di CDA. Può essere una parola, un gruppo di parole o persino un emoticon (emoji). La CDA cerca similarità tra i termini condivisi da un gruppo di persone ragionevolmente omogeneo. Devo dunque trovare un gruppo di persone ragionevolmente omogeneo, un elenco di termini e un modo per valutarne le similarità. La mia fonte preferita di dati semantici è LiveJournal (LJ): una raccolta di blog individuali e collettivi con elementi di una massiccia rete sociale. LiveJournal possiede API aperte e facilmente accessibili; inoltre incoraggia l’uso dei loro dati a scopo di ricerca. Certamente l’attività e il numero di partecipanti a LJ era maggiore a inizio secolo, ma ci sono ancora diverse comunità di blogging interessanti (per esempio la rete di gossip Oh No They Didn’t!) e comunque la stratificazione dei dati storici è ricca.
Su LJ le comunità sono composte da membri, con blog personali, profili, liste di amici e interessi (marcatori di identità online) propri. In effetti, per LJ comunità e utenti sono cittadini alla pari: anche le comunità, come gli individui, possiedono profili, interessi e perfino “amici”. Gli URL dei profili di utenti e comunità mostrano una struttura regolare e semplice: se thegoodwife_cbs è il nome di una comunità (la userò realmente nel corso dello studio), allora thegoodwife_cbs.livejournal.com/profile è il profilo della comunità, www.livejournal.com/misc/fdata.bml?user=thegoodwife_cbs&comm=1 è la lista degli amici e www.livejournal.com/misc/interestdata.bml?user=thegoodwife_cbs è l’elenco degli interessi. Per gli scopi di questo ministudio definisco due termini come simili, visti da una comunità LJ, se vengono spesso elencati insieme su liste di interessi diverse dei membri della comunità. (Pensandoci, se non fossero simili non sarebbero elencate insieme). Il mio primo compito è ottenere ed elaborare l’elenco dei membri della comunità, che somiglia a questo:
# Nota: I data miner educati fanno cache quando finiscono. Quelli maleducati # vengono banditi. # Nota: thegoodwife_cbs è un account di comunità P> emploding P> poocat «…altri membri…» P< brooketiffany P< harperjohnson
La prima riga del documento stabilisce un punto molto importante: se qualcosa può essere scaricato solo una volta, dovrebbe. Creerò la cache della directory e ci memorizzerò tutti i dati scaricati. Se voglio eseguire un’altra CDA usando ancora gli stessi dati, si troveranno sperabilmente ancora nella cache (presuppongo che gli elenchi di interessi e i membri della comunità siano ragionevolmente stabili).
cache_d = "cache/" + GROUP + ".pickle" GROUP = "thegoodwife_cbs" if not os.path.isfile(cached): ➤ «prepara i dati come variabile "domain"» if not path.os.isdir("cache"): os.mkdir("cache") with open(cache_d, "wb") as ofile: pickle.dump(domain, ofile) else: with open(cache_d, "rb") as ifile: domain = pickle.load(ifile)
In questo frammento di codice uso il modulo pickle di serializzazione di dati. Se la directory cache e il file esistono, la funzione pickle.load() deserializza l’oggetto dati. Altrimenti, creo la directory e il file, poi chiamo pickle.dump(), serializzo il dominio dell’oggetto dati e lo salvo dentro il file. Si noti che il file deve essere aperto in modalità binaria. In un prossimo articolo descriverò il resto del codice, quello da inserire al posto della riga evidenziata del frammento appena mostrato.