Text Mining: Wie gruppiert man Texte (zB Nachrichtenartikel) mit künstlicher Intelligenz?

15

Ich habe einige neuronale Netze (MLP (vollständig verbunden), Elman (wiederkehrend)) für verschiedene Aufgaben aufgebaut, z. B. zum Spielen von Pong, zum Klassifizieren handgeschriebener Ziffern und anderer Dinge ...

Zusätzlich habe ich versucht, einige erste Faltungs-Neuronale Netze aufzubauen, z. B. zum Klassifizieren von mehrstelligen handschriftlichen Notizen, aber ich bin völlig neu darin, Texte zu analysieren und zu gruppieren, z. RGB oder Graustufen usw. Es gibt viele Voraussetzungsfunktionen.

Für Text Mining, zum Beispiel für Nachrichtenartikel, haben Sie eine ständig wechselnde Eingabegröße (verschiedene Wörter, verschiedene Sätze, verschiedene Textlängen, ...).

Wie kann ein modernes Text-Mining-Tool implementiert werden, das künstliche Intelligenz verwendet, vorzugsweise neuronale Netze / SOMs?

Leider konnte ich keine einfachen Tutorials zum Starten finden. Komplexe wissenschaftliche Arbeiten sind schwer zu lesen und meiner Meinung nach nicht die beste Möglichkeit, ein Thema zu erlernen. Ich habe bereits einige Artikel über MLPs, Dropout-Techniken, Faltungs-Neuronale Netze und so weiter gelesen, aber ich konnte kein grundlegendes über Text-Mining finden - alles, was ich fand, war viel zu hoch für meine sehr eingeschränkten Text-Mining-Fähigkeiten.

daniel451
quelle

Antworten:

12

Latent Dirichlet Allocation (LDA) ist großartig, aber wenn Sie etwas Besseres wollen, das neuronale Netze verwendet, würde ich doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ) dringend empfehlen .

Was es macht? Es funktioniert ähnlich wie Word2Vec von Google, aber anstelle eines einzelnen Wort-Feature-Vektors erhalten Sie einen Feature-Vektor für einen Absatz. Die Methode basiert auf einem Skip-Gram-Modell und neuronalen Netzen und gilt als eine der besten Methoden zum Extrahieren eines Merkmalsvektors für Dokumente.

Wenn Sie nun diesen Vektor haben, können Sie k-means Clustering (oder einen anderen vorzuziehenden Algorithmus) ausführen und die Ergebnisse gruppieren.

Zum Schluss können Sie die Merkmalsvektoren so einfach extrahieren:

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
Yannis Assael
quelle
2
Es scheint, als würde LDA in der NLP-Literatur auf die latente Dirichlet-Analyse Bezug nehmen. In dieser Literatur findet die lineare Diskriminanzanalyse keine Verwendung?
Sid
Genau, LDA ist in unserem Fall Latent Dirichlet Allocation.
Yannis Assael
5

Abgesehen von LDA können Sie Latent Semantic Analysis mit K-Means verwenden . Es handelt sich nicht um neuronale Netze, sondern um "klassisches" Clustering, aber es funktioniert ganz gut.

Beispiel in sklearn (von hier genommen ):

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)

Jetzt sind Cluster-Zuweisungsbezeichnungen in verfügbar km.labels_

Dies sind beispielsweise die Themen, die aus 20 Newsgroups mit LSA extrahiert wurden:

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

Sie können auch die nicht negative Matrixfaktorisierung anwenden , die als Clustering interpretiert werden kann. Alles, was Sie tun müssen, ist, die größte Komponente jedes Dokuments im transformierten Bereich zu übernehmen - und sie als Clusterzuweisung zu verwenden.

In sklearn:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)
Alexey Grigorev
quelle
Wie haben Sie die Top-Wörter für jeden Cluster erhalten?
Mayukh Nair
3

LSA + KMeans funktioniert gut, aber Sie müssen die Anzahl der erwarteten Cluster eingeben. Außerdem ist der Silhouettenkoeffizient der gefundenen Cluster normalerweise niedrig.

Eine andere Methode, mit der ich bessere Ergebnisse erzielen kann, ist die Verwendung des DBSCAN- Beispiels . Es sucht nach Zentren mit hoher Dichte und dehnt sich aus, um Cluster zu bilden. Bei dieser Methode wird automatisch die optimale Anzahl von Clustern ermittelt.

Ich fand es auch sehr wichtig, einen Stemmer wie zum Beispiel Snowball zu verwenden, der die Fehler aufgrund von Tippfehlern reduziert. Eine gute Stoppwortliste ist auch sehr wichtig, wenn Sie sicher sein möchten, dass Sie einige Cluster entfernen, die keine Bedeutung haben, da häufig gebräuchliche Wörter ohne signifikante Bedeutung vorkommen. Wenn Sie Ihre Zählmatrix erstellen, ist auch die Normalisierung wichtig. Sie ermöglicht es, einem Wort mit einem geringen Vorkommen im Datensatz, jedoch mit einem hohen Vorkommen in bestimmten Stichproben, eine Gewichtung hinzuzufügen. Diese Wörter sind bedeutungsvoll und Sie möchten sie nicht verfehlen. Es verringert auch die Gewichtung von Wörtern mit hohem Vorkommen in allen bestimmten Samples (in der Nähe des Stoppworts, aber für Wörter, die eine kleine Bedeutung haben können). Als letztes ist mir aufgefallen, dass es nicht wichtig ist, die Top-10-Wörter Ihrer Cluster auszudrucken, sondern eine erweiterte Auswahl. In der Regel wird die Qualität und Relevanz der Keywords in Bezug auf das Label, das Sie dem Cluster geben würden, nach diesen Top-10-20-Wörtern drastisch verringert. Eine erweiterte Ansicht der wichtigsten Keywords hilft Ihnen zu analysieren, ob Ihr Cluster wirklich relevant oder stark durch Lärm belastet ist.

Vincent Teyssier
quelle
2

Meine Lieblingsmethode ist LDA ; Sie können hier nach einem Tutorial mit Python-Paketen suchen .

Sie können auch viel einfachere Methoden wie diese betrachten .

omerbp
quelle