Metin Madenciliği: Metinleri (örn. Haber makaleleri) yapay zeka ile nasıl kümeleyebilirim?


15

Pong oynamak, el yazısı rakamları ve diğer şeyleri sınıflandırmak gibi farklı görevler için bazı sinir ağları (MLP (tam bağlantılı), Elman (tekrarlayan)) inşa ettim ...

Ek olarak, ilk basamaklı sinir ağlarını oluşturmaya çalıştım, örneğin çok basamaklı el yazısı notları sınıflandırmak için, ancak metinleri analiz etmek ve kümelemek için tamamen yeniyim, örneğin, görüntü tanıma / kümeleme görevlerinde, 25x25 boyutlu görüntüler gibi standart girdi, RGB veya gri tonlama vb. Birçok ön varsayım özelliği vardır.

Metin madenciliği için, örneğin haber makaleleri için, sürekli değişen bir giriş boyutuna sahipsiniz (farklı kelimeler, farklı cümleler, farklı metin uzunluğu, ...).

Yapay zeka, tercihen sinir ağları / SOM'ları kullanan modern bir metin madenciliği aracı nasıl uygulanabilir?

Ne yazık ki başlangıç ​​için basit öğreticiler bulamadım. Karmaşık bilimsel makalelerin okunması zordur ve bir konuyu öğrenmek için en iyi seçenek değildir (benim görüşüme göre). MLP'ler, bırakma teknikleri, evrişimli sinir ağları ve benzerleri hakkında oldukça fazla makale okudum, ancak metin madenciliği hakkında temel bir tane bulamadım - bulduğum tek şey çok sınırlı metin madenciliği becerilerim için çok yüksekti.

Yanıtlar:


12

Gizli Dirichlet Tahsisi (LDA) harika, ancak sinir ağlarını kullanan daha iyi bir şey istiyorsanız doc2vec'i şiddetle tavsiye ederim ( https://radimrehurek.com/gensim/models/doc2vec.html ).

Bu ne yapar? Google'ın word2vec öğesine benzer şekilde çalışır, ancak tek bir sözcük özellik vektörü yerine bir paragraf için özellik vektörü alırsınız. Yöntem, bir atlama-gram modeline ve sinir ağlarına dayanır ve belgeler için bir özellik vektörü çıkarmak için en iyi yöntemlerden biri olarak kabul edilir.

Şimdi bu vektörüne sahip olduğunuza göre k-ortalamaları kümeleme (veya tercih edilen herhangi bir algoritma) çalıştırabilir ve sonuçları kümeleyebilirsiniz.

Son olarak, özellik vektörlerini çıkarmak için bunu şu kadar kolay yapabilirsiniz:

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
NLP literatüründe LDA'nın Latent Dirichlet Analizine atıfta bulunduğu görülmektedir. Bu literatürde Doğrusal Ayırım Analizinin bir faydası yoktur?
Sid

Tam olarak, LDA bizim durumumuzda Latent Dirichlet Tahsisidir.
Yannis Assael

5

LDA dışında K-Ortalamaları ile Gizli Semantik Analiz kullanabilirsiniz . Sinir ağları değil, daha ziyade "klasik" kümeleme, ama oldukça iyi çalışıyor.

Sklearn'teki örnek ( buradan alınmıştır ):

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)

Artık küme atama etiketleri km.labels_

Örneğin, LSA ile 20 haber grubundan çıkarılan konular şunlardır:

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

Kümeleme olarak yorumlanabilen Negatif Olmayan Matris Çarpanlarına da uygulayabilirsiniz . Tek yapmanız gereken dönüştürülmüş alandaki her belgenin en büyük bileşenini almak ve bunu küme ataması olarak kullanmaktır.

Sklearn'de:

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

Her küme için en iyi kelimeleri nasıl edindin?
Mayukh Nair

3

LSA + KM, iyi çalışıyor ancak beklediğiniz küme miktarını girmeniz gerekiyor. Ayrıca bulunan kümelerin siluet katsayısı genellikle düşüktür.

Daha iyi sonuçlar elde ettiğim başka bir yöntem de burada DBSCAN örneğini kullanmaktır . Yüksek yoğunluklu merkezleri arar ve kümeler yapmak için genişler. Bu yöntemde, otomatik olarak optimum küme miktarını bulur.

Ayrıca, yazım hatası nedeniyle hataları azaltan ex için Snowball gibi bir saplayıcı kullanmanın çok önemli olduğunu gördüm. Önemli bir anlamı olmayan ortak kelimelerin yüksek oluşumu nedeniyle hiçbir anlamı olmayacak bazı kümelerden kurtulmak istediğinizden emin olmak istiyorsanız, iyi bir durma kelime listesi de çok önemlidir. Sayım matrisinizi oluşturduğunuzda, normalleştirme de önemlidir, veri kümesinde düşük bir insidansa, ancak belirli örneklerde yüksek bir insidansa sahip bir kelimeye ağırlık eklemenize izin verir. Bu kelimeler anlamlıdır ve onları özlemek istemezsiniz. Ayrıca, tüm belirli örneklerde yüksek tekrarlanan kelimelerin ağırlıklarını düşürür (durma noktasına yakın ancak küçük bir anlamı olan kelimeler için). Fark ettiğim son bir şey, kümelerinizin en iyi 10 kelimesini basmak değil, daha geniş bir seçim basmaktır. Genellikle, anahtar kelimelerin kümeye vereceğiniz etikete ilişkin kalitesi ve alaka düzeyi, bu ilk 10-20 kelimeden sonra önemli ölçüde azalma eğilimindedir. Bu nedenle, en iyi anahtar kelimelerin genişletilmiş bir görünümü, kümenizin gerçekten alakalı veya gürültüden çok kirlenmiş olup olmadığını analiz etmenize yardımcı olur.


2

En sevdiğim yöntem LDA ; burada python paketlerini kullanarak bir öğretici arayabilirsiniz .

Ayrıca böyle çok daha basit yöntemlerle bakabilirsiniz bu .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.