Text Mining: jak grupować teksty (np. Artykuły prasowe) za pomocą sztucznej inteligencji?

15

Zbudowałem kilka sieci neuronowych (MLP (w pełni połączony), Elman (cykliczny)) do różnych zadań, takich jak gra w Pong, klasyfikowanie odręcznych cyfr i tym podobne ...

Dodatkowo próbowałem zbudować pierwsze sieci neuronowe splotowe, np. Do klasyfikowania wielocyfrowych notatek odręcznych, ale jestem całkowicie nowy w analizowaniu i grupowaniu tekstów, np. W zadaniach rozpoznawania obrazów / klastrowania można polegać na standardowym wprowadzaniu, takim jak obrazy o rozmiarze 25x25, RGB lub skala szarości i tak dalej ... istnieje wiele wstępnych założeń.

W przypadku eksploracji tekstu, na przykład artykułów prasowych, masz ciągle zmieniający się rozmiar danych wejściowych (różne słowa, różne zdania, inna długość tekstu, ...).

Jak wdrożyć nowoczesne narzędzie do eksploracji tekstu wykorzystujące sztuczną inteligencję, najlepiej sieci neuronowe / SOM?

Niestety nie udało mi się znaleźć prostych samouczków na początek. Skomplikowane prace naukowe są trudne do odczytania i nie są najlepszą opcją do nauki tematu (moim zdaniem). Przeczytałem już sporo artykułów na temat MLP, technik usuwania, splotowych sieci neuronowych i tak dalej, ale nie byłem w stanie znaleźć podstawowej na temat eksploracji tekstu - wszystko, co znalazłem, było zdecydowanie za wysokie dla moich bardzo ograniczonych umiejętności eksploracji tekstu.

daniel451
źródło

Odpowiedzi:

12

Latent Dirichlet Allocation (LDA) jest świetny, ale jeśli chcesz czegoś lepszego, co wykorzystuje sieci neuronowe, zdecydowanie zaleciłbym doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ).

Co to robi? Działa podobnie do word2vec firmy Google, ale zamiast wektora funkcji pojedynczego słowa otrzymujesz wektor funkcji dla akapitu. Metoda ta opiera się na modelu pomijania i sieciach neuronowych i jest uważana za jedną z najlepszych metod wyodrębnienia wektora cech dla dokumentów.

Biorąc pod uwagę, że masz ten wektor, możesz uruchomić grupowanie k-średnich (lub dowolny inny preferowany algorytm) i grupować wyniki.

Wreszcie, aby wyodrębnić wektory cech, możesz to zrobić tak łatwo:

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
źródło
2
Wygląda na to, że w literaturze NLP LDA odnosi się do Latent Dirichlet Analysis. Czy w tej literaturze liniowa analiza dyskryminacyjna nie ma zastosowania?
Sid
Dokładnie, w naszym przypadku LDA jest Utajonym Przydziałem Dirichleta.
Yannis Assael,
5

Oprócz LDA możesz używać Latent Semantic Analysis z K-Means . To nie są sieci neuronowe, ale raczej „klasyczne” grupowanie, ale działa całkiem dobrze.

Przykład w sklearn (zaczerpnięty stąd ):

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)

Teraz etykiety przydziału klastrów są dostępne w km.labels_

Na przykład są to tematy wyodrębnione z 20 grup dyskusyjnych za pomocą 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

Możesz także zastosować nieujemną faktoryzację macierzy , którą można interpretować jako grupowanie. Wystarczy wziąć największy element każdego dokumentu w przekształconej przestrzeni - i użyć go jako przypisania do klastra.

W sklearn:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)
Aleksiej Grigoriew
źródło
Jak uzyskałeś najlepsze słowa dla każdego klastra?
Mayukh Nair
3

LSA + KMeans działa dobrze, ale musisz wprowadzić oczekiwaną liczbę klastrów. Ponadto współczynnik sylwetki znalezionych klastrów jest zwykle niski.

Inną metodą, dzięki której uzyskuję lepsze wyniki, jest tutaj użycie przykładu DBSCAN . Poszukuje centrów o dużej gęstości i rozszerza się, tworząc klastry. W tej metodzie automatycznie znajduje optymalną liczbę klastrów.

Uważam również, że bardzo ważne jest użycie stempla, takiego jak np. Snowball, który zmniejsza błędy wynikające z literówek. Dobra lista słów kluczowych jest również bardzo ważna, jeśli chcesz się pozbyć niektórych klastrów, które nie miałyby znaczenia ze względu na częste występowanie często używanych słów bez znaczącego znaczenia. Podczas budowania macierzy zliczeń ważna jest również normalizacja, która pozwala dodać ważenie do słowa o niskim poziomie występowania w zbiorze danych, ale o wysokiej częstotliwości występowania w poszczególnych próbkach. Te słowa są znaczące i nie chcesz ich przegapić. Obniża również wagę słów o wysokiej częstotliwości występowania we wszystkich konkretnych próbkach (słowo zbliżone do stopu, ale dla słów, które mogą mieć małe znaczenie). Ostatnią rzeczą, którą zauważyłem, że była ważna, nie było wydrukowanie 10 najważniejszych słów z twoich klastrów, ale szerszy wybór. Zwykle jakość i trafność słów kluczowych w stosunku do etykiety, którą nadasz klasterowi, zwykle dramatycznie spada po tych 10-20 najważniejszych słowach. Tak więc rozszerzony widok najpopularniejszych słów kluczowych pomoże ci przeanalizować, czy Twój klaster jest naprawdę odpowiedni lub bardzo zanieczyszczony hałasem.

Vincent Teyssier
źródło
2

Moja ulubiona metoda to LDA ; możesz poszukać tu samouczka z wykorzystaniem pakietów Pythona.

Możesz także spojrzeć na znacznie prostsze metody takie jak ta .

omerbp
źródło