Menggunakan SingleStore dan WebAssembly untuk Analisis Sentimen
Menggunakan SingleStore dan WebAssembly untuk Analisis Sentimen
[ad_1]
Pada artikel ini, kita akan melihat cara menggunakan SingleStore dan WebAssembly untuk melakukan analisis sentimen komentar Stack Overflow. Kami akan menggunakan kode WebAssembly yang sudah disiapkan dan dihosting di lingkungan cloud.
File buku catatan yang digunakan dalam artikel ini tersedia di GitHub.
Perkenalan
Pada artikel ini kita akan mengambil yang sudah ada Proyek Lab SingleStore dan mendemonstrasikan kemudahan penerapan dan pengoperasiannya di SingleStore Cloud. Proyek aslinya dikembangkan sebelum SingleStore menyediakan dukungan untuk laptop di portal cloud. Kita akan melihat betapa mudahnya kita memigrasikan dan mengkonsolidasikan kode.
Buat akun cloud SingleStore
A artikel sebelumnya menunjukkan langkah-langkah membuat akun SingleStore Cloud gratis. Kami akan menggunakan Tingkat standarpilih Google Cloud (GCP) dan ambil nama default untuk grup ruang kerja dan ruang kerja.
Impor buku catatan
Kami akan mengunduh buku catatan dari GitHub.
Di panel navigasi kiri portal cloud SingleStore, kita akan memilih KEMBANGKAN > Data Studio.
Di kanan atas halaman web kita akan memilih Notepad Baru > Impor dari file. Kami akan menggunakan wizard untuk mencari dan mengimpor buku catatan yang kami unduh dari GitHub.
Jalankan buku catatan
Setelah memverifikasi bahwa kita terhubung ke ruang kerja SingleStore, kita akan menjalankan sel satu per satu.
Kami akan mulai dengan menginstal perpustakaan yang diperlukan dan mengimpor dependensi.
Selanjutnya kita akan membuat databasenya:
DROP DATABASE IF EXISTS demo;
CREATE DATABASE IF NOT EXISTS demo;
Sekarang kita akan membuat tautan ke keranjang Google Cloud Storage (GCS) untuk data Stack Overflow dan file WebAssembly:
CREATE LINK IF NOT EXISTS gcs_wasm AS GCS CREDENTIALS '{}'
DESCRIPTION 'wasm and wit examples';
Selanjutnya, kita akan membuat tabel untuk menyimpan komentar Stack Overflow:
DROP TABLE IF EXISTS comments;
CREATE TABLE IF NOT EXISTS comments (
id INT,
text TEXT,
creation_date TIMESTAMP,
score INT,
score_bucket AS (score - (score % 10)) PERSISTED INT,
KEY (score) USING CLUSTERED COLUMNSTORE,
SHARD KEY ()
);
Dan sekarang kita akan membuat saluran untuk memasukkan komentar ini ke dalam tabel:
CREATE PIPELINE sowasm AS LOAD DATA LINK gcs_wasm 'stackoverflow-wasm'
INTO TABLE comments
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
STARTING BY '';
Sebelum memulai Pipeline, kami akan mengujinya:
TEST PIPELINE sowasm LIMIT 1;
Contoh keluaran:
+-----------+---------------------------------------------------------------------------------------------------------------------------------+---------------------+-------+
| id | text | creation_date | score |
+-----------+---------------------------------------------------------------------------------------------------------------------------------+---------------------+-------+
| 118711035 | because that function might use also other types of Collections, not only Map...so this is why I made it as general as possible | 2021-04-19 09:56:31 | 0 |
+-----------+---------------------------------------------------------------------------------------------------------------------------------+---------------------+-------+
Kami sekarang akan memulai Pipeline:
Kami akan memeriksa status pipeline, sebagai berikut:
SELECT pipeline_name, batch_state, batch_time, rows_per_sec, mb_per_sec
FROM information_schema.pipelines_batches_summary;
Contoh keluaran:
+---------------+-------------+------------+--------------------+-------------------+
| pipeline_name | batch_state | batch_time | rows_per_sec | mb_per_sec |
+---------------+-------------+------------+--------------------+-------------------+
| sowasm | In Progress | 41.510348 | 448796.28568760736 | 88.36874162076406 |
| sowasm | Succeeded | 14.659567 | 0.5457187105185304 | 501.912665974377 |
+---------------+-------------+------------+--------------------+-------------------+
Kami juga akan memeriksa berapa banyak file yang telah dimuat sejauh ini, sebagai berikut:
SELECT pipeline_name, file_state, COUNT(*)
FROM information_schema.pipelines_files
GROUP BY 1, 2;
Contoh keluaran:
+---------------+------------+----------+
| pipeline_name | file_state | COUNT(*) |
+---------------+------------+----------+
| sowasm | Unloaded | 16 |
+---------------+------------+----------+
Mungkin diperlukan waktu beberapa menit hingga data dimuat. Kami akan terus menjalankan kembali perintah di atas sampai kami melihat file_state
sebagai Mengenakan biaya.
+---------------+------------+----------+
| pipeline_name | file_state | COUNT(*) |
+---------------+------------+----------+
| sowasm | Loaded | 16 |
+---------------+------------+----------+
Jika sekarang kita memeriksa jumlah baris di tabel komentar:
SELECT COUNT(*) FROM comments;
Seharusnya:
Selanjutnya kita akan mengoptimalkan tabel:
OPTIMIZE TABLE comments FULL;
Sekarang kita akan membuat sentiment
fungsi di SingleStore:
DROP FUNCTION IF EXISTS sentiment;
CREATE FUNCTION sentiment RETURNS TABLE AS WASM
FROM LINK gcs_wasm 'wasm-modules/sentimentable.wasm'
WITH WIT FROM LINK gcs_wasm 'wasm-modules/sentimentable.wit';
Dan kami akan menguji fungsinya menggunakan kalimat sederhana:
SELECT * FROM sentiment('The movie was great');
Contoh keluaran:
+--------------------+--------------------+----------+--------------------+
| compound | positive | negative | neutral |
+--------------------+--------------------+----------+--------------------+
| 0.6248933269389457 | 0.5774647887323944 | 0 | 0.4225352112676057 |
+--------------------+--------------------+----------+--------------------+
Fungsi ini dibangun menggunakan VADERyang dapat memperhitungkan kapitalisasi, jadi kami akan mencoba:
SELECT * FROM sentiment('The movie was GREAT!');
Contoh keluaran:
+--------------------+--------------------+----------+---------------------+
| compound | positive | negative | neutral |
+--------------------+--------------------+----------+---------------------+
| 0.7290259049799065 | 0.6307692307692307 | 0 | 0.36923076923076925 |
+--------------------+--------------------+----------+---------------------+
Kita dapat melihat bahwa nilainya telah berubah, menunjukkan semakin kuatnya sentimen positif yang diungkapkan oleh kapitalisasi.
Kami sekarang akan menggunakan fungsi sentimen pada data Stack Overflow. Kueri berikut memberi peringkat pada komentar menurut mereka score_bucket
menghitung rentang sentimen positif dan negatif untuk setiap kelompok dan memfilter kelompok yang tidak memenuhi ambang batas sentimen positif dan negatif tertentu atau jumlah minimum komentar:
SELECT
score_bucket,
COUNT(*) AS num_comments,
ABS(MIN(sentiment.compound)) AS 'negative',
MAX(sentiment.compound) AS 'positive'
FROM (
SELECT score_bucket, text
FROM comments
WHERE score >= 10
) AS c
JOIN sentiment(c.text) AS sentiment
GROUP BY 1
HAVING positive > 0 AND negative > 0 AND num_comments > 20
ORDER BY 1 ASC;
Contoh keluaran:
+--------------+--------------+--------------------+---------------------+
| score_bucket | num_comments | negative | positive |
+--------------+--------------+--------------------+---------------------+
| 10 | 115285 | 0.9994079336366717 | 0.9884804181816502 |
| 20 | 27409 | 0.9888823100791507 | 0.9892404342635115 |
| 30 | 12064 | 0.9821512068585552 | 0.9877005097673762 |
| 40 | 6701 | 0.9843907526148696 | 0.9879442138133854 |
| 50 | 4130 | 0.9578388745735287 | 0.9771454595448407 |
| 60 | 2737 | 0.9760934140752651 | 0.9729132860697197 |
| 70 | 1871 | 0.9706903352612597 | 0.9880242850306352 |
| 80 | 1382 | 0.9652000828396454 | 0.9762188560813158 |
| 90 | 961 | 0.923147976982903 | 0.9493088246302036 |
| 100 | 616 | 0.9304284852393788 | 0.9450887908327322 |
| 110 | 558 | 0.9493549089508792 | 0.9632429421826448 |
| 120 | 426 | 0.9002836209452251 | 0.9677479586749276 |
| 130 | 370 | 0.9162896416215123 | 0.9632354331654686 |
| 140 | 311 | 0.9021745222664633 | 0.9586716231397892 |
| 150 | 238 | 0.8675398479551882 | 0.9431759585204077 |
| 160 | 222 | 0.8531496240723568 | 0.9578995844532326 |
| 170 | 178 | 0.9747041185348985 | 0.9147007023988873 |
| 180 | 140 | 0.9169412377108535 | 0.8390091580666769 |
| 190 | 121 | 0.9245951335534447 | 0.9182147494752572 |
| 200 | 113 | 0.8816546429851182 | 0.9646083962735071 |
| 210 | 104 | 0.9000703207408192 | 0.9656662124414448 |
| 220 | 75 | 0.9540880207894837 | 0.9290884711557326 |
| 230 | 64 | 0.9366897688124777 | 0.8845412417221543 |
| 240 | 63 | 0.69959689416212 | 0.8798820901453436 |
| 250 | 69 | 0.885989313829565 | 0.9118030994059687 |
| 260 | 44 | 0.732963834521151 | 0.8451256880345008 |
| 270 | 48 | 0.6002989705424076 | 0.8977248037806889 |
| 280 | 37 | 0.7649686210234002 | 0.8174929079535046 |
| 290 | 27 | 0.7212708611789033 | 0.5410993951859938 |
| 300 | 21 | 0.8933580311460599 | 0.9118030994059688 |
| 310 | 21 | 0.9006976990391564 | 0.6248933269389456 |
| 320 | 23 | 0.5006589854488329 | 0.8396107297645051 |
| 330 | 22 | 0.5287984420596952 | 0.47069267569978684 |
+--------------+--------------+--------------------+---------------------+
Kita bisa menyimpan hasil query ke variabel dan menggunakannya dari Python. Alternatifnya, kita dapat menjalankan kueri sebagai berikut:
df = pd.read_sql("""
SELECT
score_bucket,
COUNT(*) AS num_comments,
ABS(MIN(sentiment.compound)) AS 'negative',
MAX(sentiment.compound) AS 'positive'
FROM (
SELECT score_bucket, text
FROM comments
WHERE score >= 10
) AS c
JOIN sentiment(c.text) AS sentiment
GROUP BY 1
HAVING positive > 0 AND negative > 0 AND num_comments > 20
ORDER BY 1 ASC;
""", con = db_connection)
df.head()
Dan kemudian plot datanya:
fig = px.scatter(
df,
x = "score_bucket",
y = ["positive", "negative"],
trendline = "ols",
labels = {
"score_bucket": "Comment Score",
"value": "polarization",
}
)
fig.update_layout(
title = "Comment Score vs. Sentiment Polarisation",
xaxis_title = "Comment Score",
yaxis_title = "Sentiment Polarisation"
)
fig.show()
Contoh keluaran ditunjukkan pada Gambar 1.
Gambar 1: Skor komentar versus polarisasi sentimen
Gambar 1 secara visual mengeksplorasi perbedaan skor sentimen positif dan negatif berdasarkan skor komentar. Hal ini dapat membantu mengidentifikasi apakah komentar dengan skor lebih tinggi cenderung memiliki sentimen yang lebih terpolarisasi (lebih positif atau negatif) dan apakah terdapat tren atau korelasi keseluruhan antara skor komentar dan polaritas sentimen.
Ringkasan
Dalam artikel ini, kami menggunakan beberapa fitur SingleStore yang sangat berguna, seperti saluran pipa untuk menyerap data dari sumber eksternal dan fungsi WebAssembly eksternal yang dimuat ke dalam database untuk melakukan analisis sentimen. Kami juga dapat menjalankan kode SQL dan Python dari portal cloud tanpa perlu menggunakan alat lain.
Terima kasih
Saya berterima kasih Bailey Hayes untuk memperluas contoh dan dokumentasi analisis sentimen di repositori GitHub.
[ad_2]