Come posso raggruppare le stringhe per temi comuni?


10

Sto tentando di raggruppare, ad esempio, stringhe sulla programmazione con altre stringhe sulla programmazione, stringhe sulla fisica con altre stringhe sulla fisica, ecc., Per una vasta gamma di argomenti. Nonostante l'evidente aspetto linguistico teorico del problema, sto cercando di farlo utilizzando la programmazione / il software.

Il fatiscente: dato un gran numero di stringhe, come potrei fare per raggrupparle per tema semantico?

La particolare applicazione: ho circa 200.000 domande trivia che vorrei classificare in raggruppamenti comuni (automobili, computer, politica, Canada, cibo, Barack Obama, ecc.).

Cosa ho esaminato: Wikipedia ha un elenco di toolkit di elaborazione del linguaggio naturale (supponendo che ciò che sto cercando di fare sia in realtà chiamato PNL), quindi ne ho esaminati alcuni, ma nessuno sembra fare qualcosa di simile ai miei bisogni.

Note: è stato sottolineato che per fare ciò è necessaria una conoscenza aggiuntiva (ad es. Una Porsche è un'auto, il C ++ è un linguaggio di programmazione). Presumo quindi che siano necessari i dati di addestramento, ma se ho solo l'elenco di domande e risposte, come posso generare i dati di addestramento? E poi come posso utilizzare i dati di allenamento?

Altre note: se l'attuale formattazione del mio Q & As aiuta (anche se sembra JSON, è fondamentalmente un file di testo non elaborato):

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

Ma prima che qualcuno sottolinei che esiste già una categoria, nota che ci sono ~ 200k domande e risposte come questa, e sostanzialmente tante "categorie". Sto cercando di raggrupparli in gruppi più ampi come quelli sopra elencati. Inoltre, questa formattazione può essere modificata molto facilmente per tutte le domande, lo faccio a livello di programmazione.

E altre note: in realtà non so quante categorie avrò bisogno (almeno 10-20), perché non ho letto tutte le domande da solo. Mi aspettavo in parte di determinare in qualche modo il numero finito durante la categorizzazione. In ogni caso, posso sempre creare manualmente un numero di categorie.


Come stavi usando la carota? Dalla mia breve lettura al riguardo, sembra che dovrebbe gestire facilmente 200.000 record.

Ci è voluto solo molto più tempo di quanto pensassi, e mi ha costretto ad aumentare l'assegnazione della memoria iniziale della JVM a 1024 me la memoria massima a 2048 m. Non è stato così grave come avrei potuto emettere quel suono.

Hai solo bisogno di dati di formazione sufficienti e quindi dovresti essere in grado di classificare le domande in queste categorie. Un approccio completamente automatico finirà probabilmente per raggrupparli in altri modi, ad esempio domande contenenti la parola "automobile". Non è possibile apprendere i sinonimi contemporaneamente alla creazione di un raggruppamento.
Ha QUIT - Anony-Mousse il

Eh, stai elaborando in blocco; dare la JVM non è davvero un problema. Quanto ci è voluto? Da dove stavi caricando i documenti? Una fonte personalizzata?

Ho impiegato forse 10 minuti, ma sono d'accordo, l'elaborazione di massa è per definizione dispendiosa in termini di tempo e memoria. Anche se quell'intera tendenza a soffocare non era il problema, più una nota a margine.

Risposte:


4

Questo è un problema abbastanza standard nella PNL e le magiche parole di Google che stai cercando sono "modellazione di argomenti". Sebbene le stringhe siano piuttosto brevi, potresti avere qualche successo con l' allocazione di Dirichlet latente o un metodo simile. C'è un bel post sul blog da Edwin Chen qui , che delinea l'idea generale dietro l'algoritmo. I dettagli dell'implementazione sono trattati in questa nota da Yi Wang.

Se stai cercando una soluzione topicmodelsstandard , ti consiglio di provare il pacchetto per R, in quanto fornisce un'interfaccia ragionevolmente piacevole sia per LDA che per un modello di argomento correlato più sofisticato. C'è anche un buon elenco di implementazioni gestite da David Mimno qui .


Grazie, il post sul blog di Chen sembra essere perfetto per quello che sto cercando di fare. C'è qualche possibilità che tu abbia usato qualcosa di ciò che hai elencato / fatto prima? Sono su terreni completamente nuovi qui e apprezzerei una procedura dettagliata di ciò che avrei dovuto fare (utilizzando una delle soluzioni standardizzate). Come devo formattare i miei "documenti"? Devo applicare gli ID a ciascuna domanda e risposta per consentirmi di identificare quale documento è in quale gruppo? Come posso utilizzare i dati di output? Come ho detto, non capisco molti dettagli.
Whymarrh,

Ho usato un po 'il pacchetto R topicmodels. Lo consiglierei senz'altro a pubblicare il proprio codice: c'è della documentazione con un esempio funzionante su cran.r-project.org/web/packages/topicmodels/vignettes/… . La formattazione specifica di ciascun documento non ha molta importanza, dato che tutto sarà ridotto a una rappresentazione "bag of words" comunque. Basta gettare tutto il testo associato in una stringa.
Martin O'Leary,

4

Stai cercando di risolvere due problemi qui.

Problema 1: categorizzare le stringhe di domande nella categoria corretta.

Problema 2: creare categorie appropriate.

Il primo problema potrebbe essere posto dai cosiddetti algoritmi supervisionati, molti classificatori possono fornire precisione e prestazioni molto buone. Tuttavia, il problema 2, la creazione di categorie dal nulla (tonnellate di dati), è molto più complicato. Questo è un problema senza supervisione, dati molti dati il ​​computer decide autonomamente le categorie dati alcuni criteri. Idealmente, questi criteri e l'algoritmo dovrebbero organizzare in modo ordinato i dati in cluster. Questi potrebbero quindi essere etichettati. Tuttavia, poiché questo è un compito molto più difficile, direi che non esiste una soluzione accettabile per il drop-in che fornirà un buon risultato senza un grande sforzo di ottimizzazione che molto probabilmente richiederebbe esperti.

Quindi, temo non ci sia ancora un pulsante magico qui. Tuttavia, ciò che puoi fare è aiutare un po 'la macchina. Ad esempio, puoi decidere il set di categorie. Dopo aver deciso le categorie, è possibile creare dati di allenamento. In questa configurazione, i dati di allenamento sono solo domande e coppie di categorie corrette.

Più dati di allenamento meglio è. Tuttavia, poiché l'attività è ancora automatica, non ha senso iniziare a fare le cose manualmente. Ora perché vorresti avere i dati di allenamento? Valutazione della precisione. Se si desidera ottenere buoni risultati, è fondamentale poter eseguire una sorta di valutazione su quanto è buono un setup. E l'unico modo per farlo in modo un po 'sistematico è quello di etichettare manualmente alcuni questiosn da soli. Altrimenti sei nei ciechi.

Quindi, sorgono alcune nuove domande. Primo: quanti dati di formazione sono necessari? "Dipende". Senza aver visto i tuoi dati o le tue categorie non sono sicuro che ci proverei nemmeno; ma posso fare un "preventivo del ballpark" e dire circa 500 domande. Nota che potrei essere fuori di un ordine di grandezza.

Significa davvero che dovresti taggare 500 domande a mano? Sì e no. È possibile utilizzare risultati intermedi e un po 'di intelligenza per i classificatori "bootstrap". Tuttavia, è ancora un lavoro manuale e, quando ci pensi, 500 domande non impiegheranno molto a taggare. Essere intelligenti qui può dare rapidamente risultati peggiori che essere laboriosi.

Quando hai dati di allenamento in quantità sufficiente, prendine il 75% e crea un classificatore usando il tuo strumento preferito (ad esempio quelli menzionati qui o quant'altro). Ora, lascia che il classificatore tenti di etichettare il 25% dei dati e di misurare la precisione risultante. Se il risultato è buono, fai scoppiare lo champagne. In caso contrario, crea altri dati di allenamento o prova un altro classificatore.

TL; DR

Per riassumere, ecco come l'avrei fatto.

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

Una piccola domanda: dici "circa 500 domande" per i dati di allenamento e per taggarli manualmente, ma anche "Potrei essere fuori di un ordine di grandezza", quindi se dovessi usare invece domande 5k o 50k, dovrei comunque taggare manualmente così tanti?

La cosa è; senza aver visto i tuoi dati né avere un'idea molto chiara di tutti i dettagli del tuo progetto, è difficile dare una buona stima. Tuttavia, e questo è importante ricordare, se il 500 fosse troppo basso, lo sforzo di etichettatura non sarebbe stato sprecato. Hai ancora bisogno di domande etichettate manualmente per la valutazione. Più dati di valutazione hai, migliori sono le valutazioni che puoi effettuare.

Per un ordine di grandezza intendevo 50-500-5000. Non credo che dovrai classificare 50k. Questo è 1/4 del tuo intero corpus! Se 500 domande dovessero essere troppo basse, è possibile avviare i classificatori. L'idea qui è di allenare il classificatore su un piccolo corpus iniziale (ad esempio il tuo 500) e quindi taggare il resto. Ora, puoi usare alcuni dei casi in cui il classificatore era molto fiducioso per riqualificare un nuovo classificatore più grande.

Un'altra cosa importante da tenere a mente; le prestazioni di molti classificatori non sono lineari nella quantità di dati di allenamento, ma saranno in genere una curva simile a un sigmoide. Ciò significa che altre 500 domande taggate potrebbero essere un vantaggio quasi pari a 5000. Il mio consiglio è di lavorare a piccoli passi.

Quali dettagli fornirebbero ulteriori informazioni sul mio progetto? Posso condividere alcune domande di esempio per mostrare la mia formattazione, ma sono disposto a personalizzare il formato delle mie domande e risposte in modo che si adatti al processo di categorizzazione. Apprezzo l'aiuto.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.