Analisis sentimen teks pada Node.js


Halo semuanya. Topiknya cukup menarik dan mungkin agak sulit diimplementasikan. Tetapi saya adalah orang yang praktis dan saya ingin menyentuh yang indah terutama tanpa melelahkan. Hari ini kita akan membuat "layanan mikro" untuk analisis sentimentalitas / nada suara teks. Dan kasusnya, beberapa hal yang lebih menarik yang akan membantu Anda mempersiapkan daya tarik teks Anda ke Skynet.


Intro


Mengapa Ini pertanyaan yang sangat bagus. Tetapi sebelum menjawabnya, mari kita menjadi sedikit lebih pintar dan mencari tahu apa analisis nada suara teks dan apa nada suara itu?


Analisis nada suara teks (analisis sentimen, analisis Sentimen Bahasa Inggris, penambangan Opini Bahasa Inggris) adalah kelas metode analisis konten dalam linguistik komputer, yang dirancang untuk secara otomatis mengidentifikasi teks-teks dalam kosakata berwarna emosional dan penilaian emosional penulis (pendapat) terkait objek, ucapan yang masuk dalam teks.

Nada suara adalah sikap emosional penulis pernyataan terhadap suatu objek (objek dari dunia nyata, suatu peristiwa, suatu proses atau sifat / atributnya), diekspresikan dalam teks. Komponen emosional, yang diekspresikan pada tingkat leksem atau fragmen komunikatif, disebut nada leksikal (atau sentimen leksikal). Nada suara dari keseluruhan teks secara keseluruhan dapat didefinisikan sebagai fungsi (dalam kasus paling sederhana, jumlah) dari nada suara leksikal dari unitnya (kalimat) dan aturan untuk menggabungkannya.

oleh wikipedia


Mengapa


Saya sering memiliki lebih banyak pertanyaan daripada jawaban dari membaca Wikipedia. Mari kita sederhanakan - kunci teks memberi tahu kita tentang "mood of the text." Misalnya, "Kemarilah, ibumu ..." menandakan pendengar memiliki masalah. "Sayang, aku pulang" - sedikit lebih baik, tetapi sesuai dengan situasinya.



Anda dapat menggunakan analisis semacam itu untuk mencari berita positif, untuk memfilter komentar negatif, membangun peringkat produk berdasarkan ulasan, dan sebagainya. Saya pikir ide umumnya jelas.


Instal yang diperlukan


Karena kita akan menggunakan Node.js, kita perlu Express. Anda dapat menggunakan apa saja, ekspresikan level rendah dan tidak penting untuk tugas itu.


npm install -g express-generator 

express-generator adalah semacam buat-reaksi-aplikasi untuk kerangka kerja Express.


Kami membuat aplikasi dalam folder node_nlp :


 express node_nlp --no-view 

Anda dapat menyederhanakan dua perintah terakhir menggunakan npx:


 npx express-generator node_nlp --no-view 

Untuk memulai aplikasi, buka folder, unduh dependensi dan luncurkan:


 cd node_nlp npm install npm start 

Agar tidak membuang waktu secara manual me-reboot server untuk setiap perubahan, mari kita nodemon dan konfigurasikan nodemon :


 npm install --save nodemon 

Suntingan kecil di package.json:


 "dev": "nodemon ./bin/www" 

Dan untuk pengembangan kami menggunakan:


 npm run dev 

Mari kita segerombolan paket segera, saya akan memberitahu Anda mengapa mereka dibutuhkan di sepanjang jalan. Ini hanya tutorial yang berbeda untuk berusaha menjadi penyiapan proyek dan saya sudah lupa apa yang saya tulis dengan semua npm install ini.


 npm install --save natural apos-to-lex-form spelling-corrector stopword 


Routing


Faktanya, kita hanya akan memiliki satu titik akhir, di folder ./routers , ada file index.js akan kita hancurkan:


 const express = require('express'); const natural = require('natural'); const router = express.Router(); router.post('/', function(req, res, next) { const { text } = req.body; }); module.exports = router; 

Titik akhir POST sederhana yang mengambil body dengan bidang text .


Pengolahan


Jika Anda, seperti saya, entah bagaimana bersentuhan dengan ciptaan skynet , mengolah data, Anda mungkin tahu bahwa proses persiapan sama pentingnya dengan proses pemrosesan data. Kita perlu meminimalkan berbagai kebisingan dan kemungkinan kesalahan, sehingga Anda tidak akan pergi ke arah pembicara, "yah, ke sini ibumu ...".


Singkirkan luka



Karena microservice akan terlibat dalam analisis nada suara bahasa Inggris, kita perlu mempertimbangkan bagaimana mengubah singkatan seperti aku, kamu menjadi aku, kamu.
Untuk ini kita akan menggunakan apos-to-lex-form


 const express = require('express'); const natural = require('natural'); const aposToLexForm = require('apos-to-lex-form') const router = express.Router(); router.post('/', function(req, res, next) { const { text } = req.body; const lexedText = aposToLexForm(text); }); module.exports = router; 

Ubah teks menjadi huruf kecil (huruf kecil)


Agar kata-kata PERGI DI SINI dan datang ke sini untuk dirasakan dengan cara yang sama, Anda perlu memastikan bahwa seluruh teks dalam satu register.


 const casedReview = lexedText.toLowerCase(); 

Hapus karakter tambahan


Untuk peningkatan berikutnya dalam ketepatan analisis kami, Anda harus menghapus karakter tambahan, sulit bagi saya untuk mengatakan apa nada suara @ # $% ^ # karakter tersebut. Karena itu, kami menghapus semua yang tidak perlu dan hanya meninggalkan surat.
Kami menggunakan fungsi JavaScript standar - replace() :


 const alphaOnlyReview = casedReview.replace(/[^a-zA-Z\s]+/g, '') 

Tokenisasi


Tokenisasi adalah proses memecah teks menjadi komponen-komponen individual. Misalnya, kata tersebut adalah token kalimat, dan kalimat itu, pada gilirannya, adalah token paragraf.


Di sini kuda utama kami Natural bergegas ke tempat kejadian.
Dalam paket ini, kami disediakan WordTokenizer tokenization WordTokenizer :


 ... const { WordTokenizer } = natural; const tokenizer = new WordTokenizer(); const tokenizedReview = tokenizer.tokenize(alphaOnlyReview); ... 

Perbaikan bug


Karena teks dapat berasal dari mana saja, ada kemungkinan kesalahan. Kita perlu mencoba memperbaikinya. Korektor ejaan akan membantu kami dalam hal ini.


 const express = require('express'); const natural = require('natural'); const aposToLexForm = require('apos-to-lex-form'); const SpellCorrector = require('spelling-corrector'); const router = express.Router(); const spellCorrector = new SpellCorrector(); spellCorrector.loadDictionary(); router.post('/', function(req, res, next) { const { text } = req.body; const lexedText = aposToLexForm(text); const casedReview = lexedText.toLowerCase(); const alphaOnlyReview = casedReview.replace(/[^a-zA-Z\s]+/g, '') const { WordTokenizer } = natural; const tokenizer = new WordTokenizer(); const tokenizedReview = tokenizer.tokenize(alphaOnlyReview); tokenizedReview.forEach((word, index) => { tokenizedReview[index] = spellCorrector.correct(word); }); }); module.exports = router; 

Hapus Stop Words



Hentikan kata-kata, ini semacam kata parasit. Yah, seolah-olah, eh, ouu, hei, tidak seperti parasit, tetapi hanya kata-kata berlebihan yang sama sekali tidak membuat cuaca untuk tonik kita. Dengan menghilangkan kata-kata seperti itu, paket stopword akan membantu kami.


 const SW = require('stopword'); ... const filteredReview = SW.removeStopwords(tokenizedReview); 

Stemming


Stemming adalah proses menormalkan kata-kata. Misalnya, "memberi," "memberi," dan "memberi" dalam bentuk sederhana "memberi".
Kami tidak akan mengambil ini sebagai langkah terpisah, karena SentimentAnalyzer yang memberi kami paket Natural dapat melakukan ini untuk kami.


Analisis teks nada dengan Natural


Itu saja! Kami sampai di sana. Sekarang Skynet akan menerima milik kita dan mengerti segalanya. Sudah waktunya untuk memberi makan teks dalam SentimentAnalyzer dan memahami apakah kita terdengar positif dalam masyarakat yang toleran atau tidak.


Analisis nada bekerja cukup rumit. Paket natural memiliki kamus kata-kata sendiri dengan "polaritas" kata-kata. Misalnya, kata "baik" memiliki polaritas 3, dan kata "buruk" adalah -3. Bahkan, semua "poin" ini diringkas dan dinormalisasi dengan ukuran proposal. Karena itu, pada kenyataannya, kami melakukan banyak hal untuk menghapus teks kami dari semua yang berlebihan, sehingga tidak akan ada yang menghentikan kami untuk mendapatkan penilaian yang memadai.
Teksnya positif jika peringkatnya positif, negatif jika negatif dan netral jika kita mendapatkan 0.


SentimentAnalyzer menerima 3 parameter :


  • Bahasa teks
  • Streaming atau tidak streaming
  • Kamus (AFINN, Senticon, Pola), itu bawaan

Semua kode akhir dengan analisis nada teks di akhir:


 const express = require('express'); const natural = require('natural'); const aposToLexForm = require('apos-to-lex-form'); const SpellCorrector = require('spelling-corrector'); const SW = require('stopword'); const router = express.Router(); const spellCorrector = new SpellCorrector(); spellCorrector.loadDictionary(); router.post('/', function(req, res, next) { const { text } = req.body; const lexedText = aposToLexForm(text); const casedReview = lexedText.toLowerCase(); const alphaOnlyReview = casedReview.replace(/[^a-zA-Z\s]+/g, '') const { WordTokenizer } = natural; const tokenizer = new WordTokenizer(); const tokenizedReview = tokenizer.tokenize(alphaOnlyReview); tokenizedReview.forEach((word, index) => { tokenizedReview[index] = spellCorrector.correct(word); }); const filteredReview = SW.removeStopwords(tokenizedReview); const { SentimentAnalyzer, PorterStemmer } = natural; const analyzer = new SentimentAnalyzer('English', PorterStemmer, 'afinn'); const analysis = analyzer.getSentiment(filteredReview); res.status(200).json({ analysis }); }); module.exports = router; 

Kami telah menambahkan beberapa baris baru. Penghancuran natural , untuk mendapatkan alat yang kita butuhkan, kami membuat variabel untuk penganalisa dan menetapkan hasilnya untuk analysis variabel.
Parameter dari SentimentAnalyzer relatif jelas. Bahasa adalah bahasa Inggris sebagai teks yang kami proses dalam bahasa Inggris. Stamping kata-kata yang saya sebutkan di atas dan kamus yang disediakan kepada kami oleh paket Natrual .


Saya ingin membuat UI untuk kasus ini, tetapi Anda dapat mengujinya di beberapa DevTools:


 fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({text: 'hey'}) }) // {"analysis":0} fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({text: 'hey f*** you'}) }) // {"analysis":-2} fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({text: 'hey love you'}) }) // {"analysis":1} 

Seperti yang kita lihat itu berhasil :)


Github repo


Kesimpulan


Dalam artikel ini kami membuat "layanan mikro" yang menganalisis nada suara teks. Bawa ke showdown apa pun dan analisis apa yang dikatakan lawan Anda. Kami juga menyentuh pada topik persiapan data dan menginstal banyak dependensi. Terima kasih atas perhatian anda!


Baca yang sama


Source: https://habr.com/ru/post/id486036/


All Articles