Text Mining: come raggruppare i testi (ad es. Articoli di notizie) con l'intelligenza artificiale?


15

Ho creato alcune reti neurali (MLP (completamente connesse), Elman (ricorrenti)) per diversi compiti, come giocare a Pong, classificare cifre scritte a mano e cose ...

Inoltre ho cercato di costruire alcune prime reti neurali convoluzionali, ad esempio per classificare note scritte a mano a più cifre, ma sono completamente nuovo per analizzare e raggruppare testi, ad esempio in attività di riconoscimento / raggruppamento di immagini su cui contare su input standardizzati, come immagini di dimensioni 25x25, RGB o scala di grigi e così via ... ci sono molte funzionalità di presunzione.

Per l'estrazione del testo, ad esempio articoli di notizie, hai una dimensione di input in continua evoluzione (parole diverse, frasi diverse, lunghezza del testo diversa, ...).

Come si può implementare un moderno strumento di estrazione del testo che utilizza l'intelligenza artificiale, preferibilmente reti neurali / SOM?

Purtroppo non sono riuscito a trovare semplici tutorial per iniziare. Documenti scientifici complessi sono difficili da leggere e non sono l'opzione migliore per imparare un argomento (secondo la mia opinione). Ho già letto alcuni articoli su MLP, tecniche di abbandono, reti neurali convoluzionali e così via, ma non sono riuscito a trovarne uno di base sull'estrazione del testo - tutto quello che ho trovato era di livello troppo alto per le mie capacità di estrazione del testo molto limitate.

Risposte:


12

Latent Dirichlet Allocation (LDA) è eccezionale, ma se vuoi qualcosa di meglio che usi le reti neurali, ti consiglio vivamente doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ).

Cosa fa? Funziona in modo simile al word2vec di Google ma invece di un vettore di funzione a parola singola ottieni un vettore di funzione per un paragrafo. Il metodo si basa su un modello skip-gram e reti neurali ed è considerato uno dei metodi migliori per estrarre un vettore di caratteristiche per i documenti.

Ora dato che hai questo vettore puoi eseguire il clustering di k-means (o qualsiasi altro algoritmo preferibile) e raggruppare i risultati.

Infine, per estrarre i vettori di funzionalità puoi farlo in questo modo:

from gensim.models import Doc2Vec
from gensim.models.doc2vec import LabeledSentence

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename
    def __iter__(self):
        for uid, line in enumerate(open(self.filename)):
            yield LabeledSentence(words=line.split(), labels=['TXT_%s' % uid])


sentences = LabeledLineSentence('your_text.txt')

model = Doc2Vec(alpha=0.025, min_alpha=0.025, size=50, window=5, min_count=5,
                dm=1, workers=8, sample=1e-5)

model.build_vocab(sentences)

for epoch in range(500):
    try:
        print 'epoch %d' % (epoch)
        model.train(sentences)
        model.alpha *= 0.99
        model.min_alpha = model.alpha
    except (KeyboardInterrupt, SystemExit):
        break

2
Sembra che nella letteratura sulla PNL LDA faccia riferimento all'analisi del Dirichlet latente. In questa letteratura l'analisi lineare discriminante non trova alcuna utilità?
Sid,

Esattamente, LDA è allocazione dirichlet latente nel nostro caso.
Yannis Assael,

5

Oltre a LDA puoi usare l' analisi semantica latente con K-Means . Non si tratta di reti neurali, ma piuttosto di un cluster "classico", ma funziona abbastanza bene.

Esempio in sklearn (preso da qui ):

dataset = fetch_20newsgroups(subset='all', shuffle=True, random_state=42)
labels = dataset.target
true_k = np.unique(labels).shape[0]

vectorizer = TfidfTransformer()
X = vectorizer.fit_transform(dataset.data)

svd = TruncatedSVD(true_k)
lsa = make_pipeline(svd, Normalizer(copy=False))

X = lsa.fit_transform(X)

km = KMeans(n_clusters=true_k, init='k-means++', max_iter=100)
km.fit(X)

Ora le etichette di assegnazione dei cluster sono disponibili in km.labels_

Ad esempio, questi sono gli argomenti estratti da 20 newsgroup con LSA:

Cluster 0:  space  shuttle  alaska  edu  nasa  moon  launch  orbit  henry  sci
Cluster 1:  edu  game  team  games  year  ca  university  players  hockey  baseball
Cluster 2:  sale  00  edu  10  offer  new  distribution  subject  lines  shipping
Cluster 3:  israel  israeli  jews  arab  jewish  arabs  edu  jake  peace  israelis
Cluster 4:  cmu  andrew  org  com  stratus  edu  mellon  carnegie  pittsburgh  pa
Cluster 5:  god  jesus  christian  bible  church  christ  christians  people  edu  believe
Cluster 6:  drive  scsi  card  edu  mac  disk  ide  bus  pc  apple
Cluster 7:  com  ca  hp  subject  edu  lines  organization  writes  article  like
Cluster 8:  car  cars  com  edu  engine  ford  new  dealer  just  oil
Cluster 9:  sun  monitor  com  video  edu  vga  east  card  monitors  microsystems
Cluster 10:  nasa  gov  jpl  larc  gsfc  jsc  center  fnal  article  writes
Cluster 11:  windows  dos  file  edu  ms  files  program  os  com  use
Cluster 12:  netcom  com  edu  cramer  fbi  sandvik  408  writes  article  people
Cluster 13:  armenian  turkish  armenians  armenia  serdar  argic  turks  turkey  genocide  soviet
Cluster 14:  uiuc  cso  edu  illinois  urbana  uxa  university  writes  news  cobb
Cluster 15:  edu  cs  university  posting  host  nntp  state  subject  organization  lines
Cluster 16:  uk  ac  window  mit  server  lines  subject  university  com  edu
Cluster 17:  caltech  edu  keith  gatech  technology  institute  prism  morality  sgi  livesey
Cluster 18:  key  clipper  chip  encryption  com  keys  escrow  government  algorithm  des
Cluster 19:  people  edu  gun  com  government  don  like  think  just  access

È inoltre possibile applicare la fattorizzazione a matrice non negativa , che può essere interpretata come raggruppamento. Tutto quello che devi fare è prendere il componente più grande di ogni documento nello spazio trasformato e usarlo come assegnazione di cluster.

In sklearn:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)

Come hai ottenuto le parole migliori per ogni cluster?
Mayukh Nair,

3

LSA + KMeans funziona bene ma devi inserire la quantità di cluster che ti aspetti. Inoltre, il coefficiente di silhouette dei cluster trovati è generalmente basso.

Un altro metodo con il quale ottengo risultati migliori è utilizzare qui l'esempio DBSCAN . Cerca centri ad alta densità e si espande per creare cluster. In questo metodo trova automaticamente la quantità ottimale di cluster.

Ho anche trovato molto importante utilizzare uno stemmer, come Snowball per esempio, che riduce gli errori dovuti a errori di battitura. Un buon elenco di parole di stop è anche molto importante se vuoi essere sicuro di sbarazzarti di alcuni cluster che non avrebbero alcun significato a causa dell'alta occorrenza di parole comuni senza un significato significativo. Quando si crea la matrice di conteggio, anche la normalizzazione è importante, consente di aggiungere la ponderazione a una parola con un'occorrenza bassa nel set di dati, ma con un'occorrenza elevata in determinati campioni. Queste parole sono significative e non vuoi perderle. Riduce anche il peso delle parole con occorrenze elevate in tutti i campioni particolari (vicino alla parola stop ma per le parole che possono avere un piccolo significato). Un'ultima cosa che ho notato è importante non stampare le prime 10 parole dei tuoi cluster, ma una selezione più estesa. Di solito la qualità e la pertinenza delle parole chiave rispetto all'etichetta che daresti al cluster tendono a ridursi drasticamente dopo queste prime 10-20 parole. Quindi una visione estesa delle principali parole chiave ti aiuterà ad analizzare se il tuo cluster è veramente pertinente o molto inquinato dal rumore.


2

Il mio metodo preferito è LDA ; si può guardare qui per un tutorial utilizzando i pacchetti python.

Puoi anche esaminare metodi molto più semplici come questo .

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.