Guida Rapida all'Estrazione di Corpora Specialistici e Parole Tipiche di un Dominio dalla Rete LA PROCEDURA ------------ 1) Scegli seeds/termini iniziali 2) Forma n-tuple da seeds 3) Cerca n-tuple su Google e scarica lista di urls 4) Costruisci corpus specialistico scaricando in formato testo pagine corrispondenti a urls 5) Estrai nuovi seeds/termini paragonando frequenza relativa di parole in corpus specialistico con frequenza relativa di parole in corpus generale 6) Riparti da 2) usando nuovi seeds Procedura eseguita con programmi in BootCaT toolkit, command-line utilities e UCS. Documentazione di programmi BootCaT: nome_del_programma -h | more SCELTA DEI SEEDS ---------------- Input in file con un seed per riga, multi-word-expressions tra virgolette: cane Fido "igiene alimentare" guinzaglio razze Set piu' mirato puo' migliorare qualita' di risultati, ma a scapito di quantita'. Si puo' usare pico per creare/editare la lista. COSTRUZIONE DI N-TUPLE ---------------------- $ build_random_tuples.pl -n3 -l10 seeds > tuples -n dimensione di tupla (default: 3). -l numero di tuple (default: 10). Valori massimi di opzioni sono limitati da divieto di stampare tuple uguali o permutazioni di tuple gia' stampate (permutazioni: a, b, c / b, a, c / a, c, b / ecc.) Costruzione random: ripetendo processo, si costruiscono tuple diverse. Tuple di dimensioni maggiori possono portare a risultati di qualita' piu' alta, ma a scapito di quantita'. RICERCA SU GOOGLE ----------------- collect_urls_from_google.pl -k YOUR_GOOGLE_KEY -l language -c N tuples > url_list -k la tua chiave di google -l la lingua: German, Spanish, Italian, English... (default: nessuna restrizione su lingua) -c il numero di pagine massimo da scaricare per ciascuna tupla (di nuovo: probabile trade-off qualita'/quantita') Lista di lingue supportate: collect_urls_from_google -n | more Output: CURRENT_SEED seed3 seed12 seed4 http://www.blah.net/blah.htm http://www.bluhnet.com/bluh.htm ... CURRENT_SEED seed7 seed3 seed10 http://www.blah.net/blah.htm http://www.blih.org/umpa.htm ... Da notare: - CURRENT_SEED andrebbe sostituito con CURRENT_TUPLE - risultati possono contenere doppioni: prima di cominciare a scaricare, conviene fare un sort uniq - si puo' anche ripulire lista a mano da pagine chiaramente irrilevanti Per avere un'idea della proporzione di doppioni: $ grep -v CURRENT_SEED url_list | wc 100 100 4839 $ grep -v CURRENT_SEED url_list | sort | uniq | wc 96 96 4655 SCARICAMENTO PAGINE/COSTRUZIONE CORPUS -------------------------------------- $ print_pages_from_url_list.pl cleaned_url_list > first_corpus $ grep -v CURRENT_SEEDS url_list | sort | uniq | print_pages_from_url_list.pl > corpus1.txt Se lista e' lunga, questo richiedera' un po' di tempo -- controllare crescita corpus su altra finestra. Ispezionare corpus con more: sembra ragionevole? (Non limitarsi ad ispezionare prime pagine, soprattutto se input list era in ordine alfabetico, e dunque pagine da stesso dominio sono limitrofe). Estrarre anche files word e pdf, usando stessa input list (MOLTO SPERIMENTALE): $ grep -v CURRENT_SEEDS url_list | sort | uniq | convert_doc_to_text.pl cleaned_url_list > corpus.doc.txt $ grep -v CURRENT_SEEDS url_list | sort | uniq | convert_pdf_to_text.pl cleaned_url_list > corpus.pdf.txt $ cat corpus1.txt corpus.doc.txt corpus.pdf.txt > corpus1.expanded.txt ESTRAZIONE DI PAROLE CARATTERISTICHE/NUOVI SEEDS DA CORPUS ---------------------------------------------------------- Tokenizzazione -------------- Per paragonare corpus specialistico e corpus di riferimento, prima di tutto bisogna tokenizzarli. IMPORTANTE: I due corpora vanno tokenizzati seguendo le stesse regole (e.g., se apostrofi vengono eliminati in corpus di riferimento, apostrofi vanno eliminati anche in web-corpus). Puo' essere una buona idea filtrare termini tipici di rete da web-corpus. Per esempio: $ egrep -v "CURRENT URL" corpus1.txt | sed "s/ /\n/g" | egrep -v "(http|html|www|mailto|ftp|@|)" | ... Preparazione dati per UCS ------------------------- $ prepare_corp_comp_table.pl -o table1.ds corpus1.tok ref.tok $ ucs-add -v am.MI am.log.likelihood TO table1.ds INTO table1.am.ds Scelta dei nuovi seeds ---------------------- Provare varie misure e vari filtri. Per esempio: $ ucs-select -v '%' FROM table1.am.ds WHERE 'length(%l1%)>3 && %f1%>4' | ucs-sort -v BY am.MI | ucs-print -i Quando trovate combinazioni di filtri e misure che sembrano soddisfacenti, salvate le top n parole (dove n e' un altro parametro con cui sperimentare) con un comando tipo: $ ucs-select -v '%' FROM table1.am.ds WHERE 'length(%l1%)>3 && %f1%>4' | ucs-sort -v BY am.MI | ucs-select -v 'l1' | tail +5 | head -100 > new_seeds.mi Si noti il ``tail +5'', che serve ad eliminare le righe con informazioni generali che UCS stampa sempre all'inizio dell'output (non sono sicuro che siano sempre 4, quindi controllate prima di decidere quante righe eliminare!) Se decidete per esempio di tenere sia il top ottenuto con la MI che il top ottenuto con la Log-Likelihood Ratio, potete mettere insieme le due liste con: $ cat new_seeds.mi new_seeds.ll | sort | uniq > new_seeds.all La lista di seeds, oltre che fornire input per iterazione successiva, dovrebbe anche costituire una lista plausibile di parole (unigrammi) tipiche del dominio considerato. ITERAZIONE SUCCESSIVA --------------------- Il processo puo' venire ripetuto ad libitum, e.g. finche' il corpus e/o la lista di unigrammi tipici (i ``seeds'' estratti di volta in volta) non abbiano raggiunto le dimensioni desiderate. I seeds usati nelle ripetizioni precedenti possono essere aggiunti a quelli attuali (nel qual caso, ricordarsi di fare sort uniq), oppure ogni volta potete cercare solo con i seeds dell'iterazione corrente. Analogamente, i corpora creati nelle iterazioni precedenti possono essere conservati, e il corpus finale creato con un cat di tutti i corpora scaricati (nel qual caso, ricordarsi di filtrare la lista di url in modo da non scaricare di nuovo pagine scaricate nei giri precedenti: comm puo' tornare utile...) ALCUNE DOMANDE RIASSUNTIVE -------------------------- Le seguenti domande possono aiutarvi nella stesura della tesina. Quanti erano i seeds iniziali? come li avete scelti? Quante n-tuple avete usato ad ogni iterazione? con che valore di n? Quanti seeds nuovi avete estratto ad ogni iterazione? Che misura/e d'associazione e che filtri avete usato per estrarre i seeds? perche' avete scelto la/le misura/e e i filtri che avete scelto? I vari parametri (numero e lunghezza di n-tuple, numero di seeds, misura d'associazione, filtri) sono cambiati da iterazione a iterazione? perche'? Quante iterazioni della procedura avete condotto? perche' avete deciso di fermarvi? Avete aggiunto i nuovi seeds alla lista gia' esistente, o avete usato un set nuovo per ciascuna iterazione? Il corpus finale contiene le pagine raccolte in tutte le iterazioni, o solo nell'ultima? Avete raccolto anche pagine doc/pdf? perche'? La lista di parole tipiche finale contiene tutti i seeds o soltanto quelli estratti nell'ultima iterazione? Se avete lavorato su piu' lingue, avete usato metodi/criteri/misure diverse per le varie lingue? perche'? Quante parole contiene il corpus finale? Quanti hapax legomena? in proporzione? Quante parole con frequenza uguale o inferiore a 3? in proporzione? Quante pagine (url) distinte? Usando i soliti strumenti (more, egrep, head, tail...) e/o il vostro editor preferito, esplorate il corpus. In generale, le pagine scaricate sembrano rilevanti rispetto al dominio scelto? Sulla base di almeno una ventina di pagine scelte a caso, qual e' la proporzione di pagine irrilevanti/non-informative sul totale? C'e' una tipologia di pagina, in particolare, che sembra piu' informativa/problematica? Ci sono differenze sistematiche nel numero e tipo di pagine trovate nelle varie lingue? Quanti termini (seeds) avete estratto? Analizzando la lista degli unigrammi (o un sottoinsieme a caso), potete stimare la proporzione di unigrammi che sembrano irrilevanti? C'e' una tipologia di termine, in particolare, che sembra piu' informativa/problematica? Tra i termini estratti, ce ne sono molti che sembrano parti di termini complessi? Sapreste trovare dei patterns sintattici tipici per i termini complessi di cui avete trovato frammenti (e.g., Nome ``di'' Nome, Nome Aggettivo...) Se avete lavorato su piu' lingue, ci sono differenze sistematiche nella qualita'/quantita' di termini trovati nelle varie lingue?