Penambangan Teks: bagaimana cara mengelompokkan teks (misalnya artikel berita) dengan kecerdasan buatan?

15

Saya telah membangun beberapa jaringan saraf (MLP (terhubung penuh), Elman (berulang)) untuk tugas yang berbeda, seperti bermain Pong, mengklasifikasikan angka tulisan tangan dan lainnya ...

Selain itu saya mencoba untuk membangun beberapa jaringan saraf convolutional pertama, misalnya untuk mengklasifikasikan catatan tulisan tangan multi-digit, tetapi saya benar-benar baru untuk menganalisis dan mengelompokkan teks, misalnya dalam tugas pengenalan / pengelompokan gambar seseorang dapat mengandalkan input standar, seperti gambar berukuran 25x25, RGB atau skala abu-abu dan sebagainya ... ada banyak fitur pra-asumsi.

Untuk penggalian teks, misalnya artikel berita, Anda memiliki ukuran input yang terus berubah (kata yang berbeda, kalimat berbeda, panjang teks berbeda, ...).

Bagaimana seseorang dapat mengimplementasikan alat penambangan teks modern yang memanfaatkan kecerdasan buatan, lebih disukai jaringan saraf / SOM?

Sayangnya saya tidak dapat menemukan tutorial sederhana untuk memulai. Makalah ilmiah yang kompleks sulit dibaca dan bukan pilihan terbaik untuk mempelajari suatu topik (menurut pendapat saya). Saya sudah membaca beberapa makalah tentang MLP, teknik putus sekolah, jaringan saraf convolutional dan sebagainya, tetapi saya tidak dapat menemukan yang mendasar tentang penambangan teks - semua yang saya temukan adalah tingkat yang terlalu tinggi untuk keterampilan penambangan teks yang sangat terbatas.

daniel451
sumber

Jawaban:

12

Alokasi Dirichlet Latent (LDA) sangat bagus, tetapi jika Anda menginginkan sesuatu yang lebih baik yang menggunakan jaringan saraf saya sangat menyarankan doc2vec ( https://radimrehurek.com/gensim/models/doc2vec.html ).

Apa itu? Ini bekerja mirip dengan Google word2vec tetapi bukannya vektor fitur satu kata Anda mendapatkan vektor fitur untuk paragraf. Metode ini didasarkan pada model skip-gram dan jaringan saraf dan dianggap sebagai salah satu metode terbaik untuk mengekstraksi vektor fitur untuk dokumen.

Sekarang karena Anda memiliki vektor ini, Anda dapat menjalankan k-means clustering (atau algoritma lain yang lebih disukai) dan mengelompokkan hasilnya.

Akhirnya, untuk mengekstrak vektor fitur, Anda dapat melakukannya semudah itu:

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
sumber
2
Sepertinya dalam literatur NLP LDA mengacu pada Analisis Dirichlet Laten. Dalam literatur ini apakah Analisis Linier Diskriminan tidak menemukan manfaat?
Sid
Tepatnya, LDA adalah Alokasi Dirichlet Laten dalam kasus kami.
Yannis Assael
5

Selain LDA Anda dapat menggunakan Analisis Semantik Laten dengan K-Means . Ini bukan jaringan saraf, melainkan "klasik" pengelompokan, tetapi bekerja cukup baik.

Contoh dalam sklearn (diambil dari sini ):

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)

Sekarang label penetapan kluster tersedia di km.labels_

Sebagai contoh, ini adalah topik yang diambil dari 20 newsgroup dengan 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

Anda juga dapat menerapkan Factorisasi Matriks Non-Negatif , yang dapat diartikan sebagai pengelompokan. Yang perlu Anda lakukan adalah mengambil komponen terbesar dari setiap dokumen dalam ruang yang diubah - dan menggunakannya sebagai tugas cluster.

Di sklearn:

nmf = NMF(n_components=k, random_state=1).fit_transform(X)
labels = nmf.argmax(axis=1)
Alexey Grigorev
sumber
Bagaimana Anda mendapatkan kata-kata teratas untuk setiap cluster?
Mayukh Nair
3

LSA + KMeans berfungsi dengan baik tetapi Anda harus memasukkan jumlah cluster yang Anda harapkan. Apalagi koefisien siluet dari kluster yang ditemukan biasanya rendah.

Metode lain yang saya gunakan untuk mendapatkan hasil yang lebih baik adalah dengan menggunakan contoh DBSCAN di sini . Ini mencari pusat kepadatan tinggi dan berkembang untuk membuat cluster. Dalam metode ini ia secara otomatis menemukan jumlah cluster yang optimal.

Saya juga merasa sangat penting untuk menggunakan stemmer, seperti Snowball for ex, yang mengurangi kesalahan karena kesalahan ketik. Daftar kata berhenti yang baik juga sangat penting jika Anda ingin memastikan untuk menyingkirkan beberapa kluster yang tidak memiliki arti karena tingginya kemunculan kata-kata umum tanpa makna yang signifikan. Ketika Anda membangun matriks hitungan Anda, normalisasi juga penting, itu memungkinkan untuk menambahkan bobot ke kata dengan kemunculan yang rendah pada dataset, tetapi dengan kemunculan yang tinggi dalam sampel tertentu. Kata-kata ini bermakna dan Anda tidak ingin melewatkannya. Ini juga menurunkan bobot kata-kata dengan kemunculan tinggi di semua sampel tertentu (mendekati kata berhenti tetapi untuk kata-kata yang dapat memiliki sedikit makna). Satu hal terakhir yang saya perhatikan adalah penting untuk tidak mencetak 10 kata teratas dari cluster Anda, tetapi pilihan yang lebih luas. Biasanya kualitas dan relevansi kata kunci terhadap label yang akan Anda berikan kepada kluster cenderung berkurang secara dramatis setelah 10-20 kata teratas ini. Jadi tampilan kata kunci teratas yang diperluas akan membantu Anda menganalisis apakah cluster Anda benar-benar relevan atau sangat tercemar oleh noise.

Vincent Teyssier
sumber
2

Metode favorit saya adalah LDA ; Anda dapat melihat di sini untuk tutorial menggunakan paket python.

Anda juga dapat melihat metode yang jauh lebih sederhana seperti ini .

omerbp
sumber