Analisis sentimen frase menggunakan jaringan saraf

Halo semuanya!

Semua orang yang menerima pendidikan tinggi, tanpa diusir, namun mencapai tahap penulisan ijazah. Saya tidak terkecuali. Saya ingin mengimplementasikan sesuatu yang menarik dan menguasai yang sampai sekarang belum dijelajahi, jadi saya menarik perhatian pada topik jaringan saraf dan kecerdasan buatan pada umumnya. Dan tugas yang saya selesaikan dengan bantuannya adalah analisis nada suara teks, yang sudah banyak digunakan dalam berbagai sistem pemantauan. Saya akan mencoba menggambarkan proses solusinya dalam artikel ini.

Singkatnya, tujuannya adalah untuk memahami apakah frasa memiliki konotasi positif atau negatif. Saya ingin segera mengatakan bahwa masalah ini dapat diselesaikan dengan beberapa cara, dan tidak hanya dengan jaringan saraf. Kami dapat membuat kamus tempat posisi kata ditandai, dll. (semua metode berlimpah di hub), tetapi setiap metode dapat melangkah lebih jauh di bawah artikel, jadi kami akan meninggalkan ulasan mereka untuk nanti.

Data


Tugas pertama yang saya lakukan adalah mengumpulkan dan memproses data untuk pelatihan. Dataset yang baik untuk kasus semacam itu adalah kumpulan teks pendek oleh Y. Rubtsova, yang sebelumnya dibagi menjadi kalimat negatif dan positif yang dikumpulkan di Twitter. Apa yang paling nyaman - semua ini ada dalam format CSV.

Persiapan pelatihan


Perhatikan bentuk di mana data disajikan - banyak emotikon, tautan, karakter yang tidak perlu, klik. Semua ini bukan informasi penting dan hanya mengganggu pembelajaran, apalagi semuanya harus dihapus dalam bahasa Latin. Oleh karena itu, teks akan baik untuk preprocess.

def preprocessText(text):
    text = text.lower().replace("", "")
    text = re.sub('((www\.[^\s]+)|(https?://[^\s]+))', ' ', text)
    text = re.sub('@[^\s]+', ' ', text)
    text = re.sub('[^a-zA-Z--1-9]+', ' ', text)
    text = re.sub(' +', ' ', text)
    return text.strip()

Setelah lari semua kalimat dari file, kami membawa mereka ke huruf kecil, ganti "" dengan "e", referensi, menyebutkan, kami cukup menghapus kata-kata bahasa Inggris karena kurangnya makna. Singkatnya, kami membuatnya dengan tipe yang sama, membersihkan "sampah" yang berlebihan untuk pelatihan.

Alat


Tentu saja, jika Anda memiliki superkomputer di rumah, Anda dapat menggulir ke bawah bagian ini lebih jauh, mencari bagian yang menarik. Saya menyarankan sisa layanan Google Colab , yang memungkinkan Anda menjalankan Jupyter Notebooks (dan yang belum pernah mendengarnya, untuk membantu mesin pencari) hanya menggunakan browser, dan semua pekerjaan dilakukan pada mesin virtual di cloud.
Ukuran sementara sesi yang Anda berikan untuk bekerja dibatasi hingga 12 jam - Anda dapat menyelesaikannya lebih awal, setelah itu semuanya diatur ulang.

Kami menulis kode indah kami


Seperti pendatang baru lainnya dalam pembelajaran mesin, saya memilih Python - karena sederhana, dan perpustakaan adalah awan keseluruhan.

Pertama, manajer paket akan menjalankan satu perintah penting, artinya yang akan saya jelaskan nanti.

gambar

Selanjutnya, kami mengimpor perpustakaan yang akan kami gunakan saat melatih grid dan menyiapkan data, saya pikir banyak dari mereka yang akrab bagi Anda.

gambar

Akhirnya to the point.

Jadi, mengapa kami mengunduh dan mengimpor perpustakaan Tensorflow-text? Faktanya adalah bahwa frasa tidak dapat "dimasukkan" ke grid dalam bentuk yang dapat dibaca oleh kita. Di sinilah Word Embedding masuk, istilah yang belum saya temukan terjemahan yang memadai, dan secara umum saya meragukan keberadaannya. Tetapi secara kasar, kita berbicara tentang membandingkan vektor dengan sebuah kata. Ini dikatakan dengan baik di sini .

Kami perlu mengubah seluruh kalimat menjadi vektor, jadi kami menggunakan solusi yang sudah jadi dari Google - Universal Sentence Encoder.

gambar

Anda dapat mengunduhnya dari hub di sini . Di sana, omong-omong, ada banyak solusi siap pakai yang lebih menarik yang dapat digunakan saat mempelajari jaringan saraf, agar tidak mengganggu diri sendiri.

gambar

Semua tweet dikelompokkan berdasarkan kelas - buruk / baik. Kami membuat panda-dataframe di mana mereka diurutkan berdasarkan kelas (yang buruk tidak terlihat dalam gambar, karena fakta bahwa mereka cocok).

gambar

Kami menyiapkan data - mari kita turun ke model itu sendiri. Untuk melakukan ini, gunakan kerangka Keras.

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential, load_model
model = tf.keras.Sequential()

model.add(
  tf.keras.layers.Dense(
    units=256,
    input_shape=(X_train.shape[1], ),
    activation='relu'
  )
)
model.add(
  tf.keras.layers.Dropout(rate=0.5)
)

model.add(
  tf.keras.layers.Dense(
    units=128,
    activation='relu'
  )
)
model.add(
  tf.keras.layers.Dropout(rate=0.5)
)

model.add(tf.keras.layers.Dense(2, activation='softmax'))
model.compile(
    loss='categorical_crossentropy',
    optimizer=tf.keras.optimizers.Adam(0.001),
    metrics=['accuracy']
)

history = model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=16,
    validation_split=0.1,
    verbose=1,
    shuffle=True
)

model.evaluate(X_test, y_test)

Sedikit tentang model itu sendiri. Ini memiliki lapisan input, tersembunyi, dan keluaran.

Setiap lapisan memiliki fungsi aktivasi sendiri.

Penjelasan kecil: Dalam jaringan saraf tiruan, fungsi aktivasi neuron menentukan sinyal output, yang ditentukan oleh sinyal input atau satu set sinyal input. Anda dapat membaca lebih lanjut di sini , dengan cara banyak dari mereka ada untuk tugas yang berbeda, tetapi kami hanya akan bekerja dengan 2. Kami

menetapkan fungsi aktivasi ReLu ke 2 lapisan pertama . Hari libur adalah Softmax .

Selain menambahkan lapisan, Anda dapat melihat kata "Dropout". Apa itu? Anehnya, tetapi selain masalah kurang belajar dari jaringan saraf, ketika prediksinya tidak benar, ada masalah over-training - model hanya menjelaskan contoh-contoh dari sampel pelatihan, beradaptasi dengan contoh-contoh pelatihan, alih-alih belajar mengklasifikasikan contoh-contoh yang tidak berpartisipasi dalam pelatihan. Itu klise pada data baru, model cantik Anda, yang telah melakukan pekerjaannya dengan luar biasa sebelumnya, hanya "terbang" dan mulai mengejutkan Anda dengan tidak menyenangkan. Jadi Dropout terlibat dalam fakta bahwa dengan beberapa probabilitas tertentu, "mematikan" neuron dari grid, sehingga mereka tidak lagi berpartisipasi dalam proses pembelajaran. Kemudian hasil dari beberapa jaringan rata-rata (ketika neuron dikeluarkan dari jaringan, yang baru diperoleh).

Omong-omong, artikel yang bagus untuk mereka yang tertarik.

Anda bisa mulai belajar!

Train on 53082 samples, validate on 5898 samples
Epoch 1/10
53082/53082 [==============================] - 12s 223us/sample - loss: 0.5451 - accuracy: 0.7207 - val_loss: 0.5105 - val_accuracy: 0.7397
Epoch 2/10
53082/53082 [==============================] - 11s 213us/sample - loss: 0.5129 - accuracy: 0.7452 - val_loss: 0.5000 - val_accuracy: 0.7523
Epoch 3/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.4885 - accuracy: 0.7624 - val_loss: 0.4914 - val_accuracy: 0.7538
Epoch 4/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.4686 - accuracy: 0.7739 - val_loss: 0.4865 - val_accuracy: 0.7589
Epoch 5/10
53082/53082 [==============================] - 11s 214us/sample - loss: 0.4474 - accuracy: 0.7889 - val_loss: 0.4873 - val_accuracy: 0.7616
Epoch 6/10
53082/53082 [==============================] - 11s 216us/sample - loss: 0.4272 - accuracy: 0.8004 - val_loss: 0.4878 - val_accuracy: 0.7603
Epoch 7/10
53082/53082 [==============================] - 11s 213us/sample - loss: 0.4081 - accuracy: 0.8111 - val_loss: 0.4986 - val_accuracy: 0.7594
Epoch 8/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3899 - accuracy: 0.8241 - val_loss: 0.5101 - val_accuracy: 0.7564
Epoch 9/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3733 - accuracy: 0.8315 - val_loss: 0.5035 - val_accuracy: 0.7633
Epoch 10/10
53082/53082 [==============================] - 11s 215us/sample - loss: 0.3596 - accuracy: 0.8400 - val_loss: 0.5239 - val_accuracy: 0.7620
6554/6554 [==============================] - 0s 53us/sample - loss: 0.5249 - accuracy: 0.7524
[0.5249265961105736, 0.752365]

Jadi, 10 era telah berlalu. Bagi mereka yang sama sekali tidak akrab dengan konsep seperti itu, saya akan menjelaskan definisi dari Internet: Era adalah satu iterasi dalam proses pembelajaran, termasuk presentasi semua contoh dari set pelatihan dan, mungkin, memeriksa kualitas pelatihan pada set kontrol. Jadi semua data kami berjalan 10 kali sepenuhnya melalui seluruh proses.

Hasil


gambar

Tentu saja, jaringan akan dibutuhkan lebih dari sekali dan alangkah baiknya mengetahui bagaimana cara menyimpannya untuk anak cucu, sehingga mereka tidak perlu melatihnya kembali dan sebagainya.

Struktur disimpan dalam format JSON, dan bobotnya ditulis ke file h5 .

Mesin pencari penuh dengan panduan tentang cara memutar proses membalikkan menginisialisasi jaringan dari file-file ini, jadi saya tidak akan menjelaskannya.

Dengan menggunakan metode prediksi, kami akan mencoba mencari tahu pendapat jaringan dan komponen nada dari 2 frasa yang jelas berbeda dalam hal ini. Benar, mereka masih perlu direduksi menjadi bentuk matriks terlebih dahulu, tetapi kita sudah tahu bagaimana melakukan ini menggunakan solusi yang sudah jadi.

Pada output, kita melihat 2 angka - probabilitas bahwa frasa tersebut termasuk dalam kelas "negatif" / "positif". Saya pikir gambar dengan jelas menunjukkan bahwa ada perbedaan) Jadi kata-kata yang sama pada akhirnya dan jaringan melakukan pekerjaan yang baik dengan hubungan mereka dengan kelas mereka.

Kesimpulan


Jadi, saya ingin mengatakan bahwa menguasai alat-alat canggih untuk mengembangkan jaringan saraf dan memecahkan masalah sederhana, setelah dengan tepat menentukan langkah-langkah yang diperlukan untuk menyelesaikannya dan setelah membaca teori sedikit, tampaknya menjadi tugas yang cukup mudah. Saya ingin mencatat bahwa saya melihat beberapa artikel tentang topik analisis nada pada Habré, tetapi masih menarik untuk mencoba sesuatu yang lebih mudah dan tanpa banyak teks, meskipun teorinya harus dipelajari tanpa syarat :)

Anda dapat menemukan kode di sini jika Anda meletakkan tanda bintang pada proyek, itu akan menjadi hebat. Jika Anda memerlukan file dengan bobot dan struktur jaringan, serta data yang diproses - tulis ke komentar, tambahkan ke repositori.

All Articles