2012-02-27 18 views

risposta

3

La classificazione è un ampio problema nel campo del Machine Learning/Statistics. Dopo aver letto la tua domanda, credo che tu abbia usato una sorta di clausola SQL per clausola (anche se in Lucene). Se si desidera che la macchina classifichi i documenti, è necessario conoscere algoritmi di apprendimento automatico come Neural Networks, Bayesian, SVM, ecc. Esistono eccellenti librerie disponibili in Java per queste attività. Affinché ciò funzioni, sono necessarie funzionalità (una serie di attributi estratti dai dati) su cui è possibile formattare l'algoritmo in modo che possa prevedere la propria etichetta di classificazione.

Ci sono alcune buone API in Java (che ti permettono di concentrarti sul codice senza entrare troppo nella comprensione della teoria matematica dietro quegli Algoritmi, anche se sai che sarebbe molto vantaggioso). Weka è buono. Mi sono imbattuto anche in un paio di libri di Manning che hanno gestito bene questi compiti. Qui si va:

capitolo 10 (Classificazione) di Collective Intelligence in azione: http://www.manning.com/alag/

Capitolo 5 (Classificazione) degli algoritmi di Intelligent Web: http://www.manning.com/marmanis/

Questi sono assolutamente fantastico materiale (per le persone Java) su una classificazione particolarmente adatta per le persone che non vogliono semplicemente tuffarsi nella teoria (anche se molto essenziale :)) e vogliono solo rapidamente un codice funzionante.

L'intelligenza collettiva in azione ha risolto il problema della classificazione utilizzando JDM e Weka. Dai un'occhiata a questi due per i tuoi compiti.

+0

Naturalmente posso estrarre le funzionalità dai miei indici prodotti da Lucene. Consentitemi di verificarlo in questo libro e tornerò;) – orezvani

+0

Penso che il problema con molti di questi ML sia che producono una categorizzazione di etichetta singola in cui sarebbe ideale avere una categorizzazione multi-label. Potrei sbagliarmi, ma Weka ha avuto una buona implementazione di questo. Il resto non sembrava aver fatto il lavoro. –

3

Sì, è possibile utilizzare query di similarità come implementate dal MoreLikeThisQuery class per questo tipo di cose (presupponendo di avere un campo di testo di grandi dimensioni nei documenti per il proprio indice lucene). Dai un'occhiata alla javadoc del sottostante MoreLikeThis class per i dettagli su come funziona.

Per trasformare il vostro indice di Lucene in un classificatore di testo sono disponibili due opzioni:

  1. Per ogni nuovo testo per classificatore, query per i primi 10 o 50 documenti più simili che hanno almeno una categoria, sum le occorrenze di categoria tra quei "vicini" e le prime 3 categorie frequenti tra quelle simili (ad esempio).

  2. In alternativa è possibile indicizzare un nuovo set di documenti aggregati, uno per ogni categoria concatenando (tutto o un campione di) il testo dei documenti di questa categoria. Quindi esegui la query di somiglianza inserendo il testo direttamente su quei documenti "falsi".

La prima strategia è nota in machine learning come k-Nearest Neighbors classification. Il secondo è un trucco :)

Se si dispone di molte categorie (ad esempio più di 1000), la seconda opzione potrebbe essere migliore (più veloce da classificare). Non ho comunque eseguito alcuna valutazione delle prestazioni pulita.

È inoltre possibile trovare questo blog post interesting.

Se si desidera utilizzare Solr, è necessario abilitare MoreLikeThisHandler e impostare termVectors=true nel campo del contenuto.

Il client Solr sunburnt per python è in grado di eseguire query mlt. Ecco un pitone classificatore prototipo che utilizza Solr per la classificazione secondo un indice di categorie di Wikipedia:

https://github.com/ogrisel/pignlproc/blob/master/examples/topic-corpus/categorize.py

+0

Grazie per il consiglio, ma ci sono circa 10^6 documenti da classificare, è la prima opzione buona? – orezvani

+0

Penso che il primo sia più semplice da implementare: non è necessario alcun nuovo oggetto nell'indice. Se non funziona abbastanza bene per te, prova anche quest'ultimo. Non ho abbastanza esperienza per saperlo con certezza. Per classificare che molti esempi in batch potrebbero richiedere del tempo. A seconda del numero sul termine massimo della query (io uso 30), se si usano tegole e il numero di documenti con una categoria nell'indice, il tempo di interrogazione individuale potrebbe essere piuttosto lungo, ad esempio 300 ms. La formazione di un classificatore SGD di mahout e la previsione in batch su un'estrazione di una sola volta potrebbe essere più veloce. – ogrisel

3

Come di Lucene 5.2.1, è possibile utilizzare indexed documents to classify new documents. Lucene offre un ingenuo classificatore Bayes, un classificatore Neighbor k-Nearest (basato sulla classe MoreLikeThis) e un classificatore basato su Perceptron.

Lo svantaggio è che tutte queste classi sono contrassegnate con avvertenze sperimentali e documentate con collegamenti a Wikipedia.

Problemi correlati