Pelajaran peringatan.
Mari kita membuat penggolong nada suara!Analisis sentimen (analisis sentimen) adalah tugas yang sangat umum dalam pemrosesan bahasa alami (NLP), dan ini tidak mengejutkan. Penting bagi bisnis untuk memahami apa yang dikatakan orang: positif atau negatif. Analisis semacam itu digunakan untuk memantau jejaring sosial, umpan balik pelanggan, dan bahkan dalam perdagangan saham algoritmik (sebagai hasilnya, bot
membeli saham Berkshire Hathaway setelah memposting ulasan positif tentang peran Anne Hathaway dalam film terakhir ).
Metode analisis kadang-kadang terlalu disederhanakan, tetapi merupakan salah satu cara termudah untuk mendapatkan hasil yang terukur. Kirimkan saja teks - dan hasilnya positif dan negatif. Tidak perlu berurusan dengan pohon parsing, membuat grafik atau representasi kompleks lainnya.
Ini yang akan kita lakukan. Kami akan mengikuti jalur yang paling tidak tahan dan membuat penggolong paling sederhana, yang mungkin terlihat sangat akrab bagi semua orang yang terlibat dalam pengembangan yang relevan di bidang NLP. Sebagai contoh, model seperti itu dapat ditemukan di artikel
Deep Averaging Networks (Iyyer et al., 2015). Kami sama sekali tidak mencoba untuk menantang hasil mereka atau mengkritik model; kami hanya memberikan metode representasi vektor yang terkenal dari kata-kata.
Rencana kerja:
- Perkenalkan representasi vektor khas kata-kata untuk bekerja dengan makna (makna).
- Perkenalkan pelatihan dan set data uji dengan daftar standar kata-kata positif dan negatif.
- Latih classifier gradient descent untuk mengenali kata-kata positif dan negatif lainnya berdasarkan representasi vektor mereka.
- Gunakan classifier ini untuk menghitung peringkat nada suara untuk kalimat teks.
- Untuk melihat monster yang telah kita buat.
Dan kemudian kita akan melihat, "cara membuat AI-rasis tanpa upaya khusus." Tentu saja, Anda tidak dapat meninggalkan sistem dalam bentuk yang mengerikan, jadi kami akan:
- Nilai masalah secara statistik sehingga menjadi mungkin untuk mengukur kemajuan saat diselesaikan.
- Tingkatkan data untuk mendapatkan model semantik yang lebih akurat dan kurang rasis.
Ketergantungan perangkat lunak
Tutorial ini ditulis dalam Python dan bergantung pada tumpukan pembelajaran mesin Python yang khas:
numpy
dan
scipy
untuk komputasi numerik,
pandas
untuk manajemen data, dan
scikit-learn
learning untuk pembelajaran mesin. Pada akhirnya, kami juga
matplotlib
seaborn
matplotlib
dan
seaborn
untuk membuat diagram.
Pada prinsipnya,
scikit-learn
dapat diganti dengan TensorFlow atau Keras, atau sesuatu seperti itu: mereka juga dapat melatih classifier pada gradient descent. Tetapi kita tidak membutuhkan abstraksi mereka, karena di sini pelatihan berlangsung dalam satu tahap.
import numpy as np import pandas as pd import matplotlib import seaborn import re import statsmodels.formula.api from sklearn.linear_model import SGDClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score
Langkah 1. Representasi vektor kata-kata
Representasi vektor sering digunakan ketika ada input teks. Kata-kata menjadi vektor dalam ruang multidimensi, di mana vektor yang berdekatan mewakili makna yang sama. Dengan menggunakan representasi vektor, Anda dapat membandingkan kata-kata dengan (secara kasar) artinya, dan tidak hanya dengan pencocokan persis.
Pembelajaran yang berhasil membutuhkan ratusan gigabyte teks. Untungnya, berbagai tim peneliti telah melakukan pekerjaan ini dan menyediakan model representasi vektor pra-terlatih yang tersedia untuk diunduh.
Dua
set data paling terkenal untuk bahasa Inggris adalah
word2vec (dilatih tentang teks Google News) dan
GloVe (pada halaman web Common Crawl). Setiap dari mereka akan memberikan hasil yang serupa, tetapi kami akan mengambil model GloVe karena memiliki sumber data yang lebih transparan.
GloVe hadir dalam tiga ukuran: 6 miliar, 42 miliar dan 840 miliar. Model terbaru adalah yang paling kuat, tetapi membutuhkan sumber daya pemrosesan yang signifikan. Versi 42 miliar cukup bagus, dan kamus rapi dipangkas menjadi 1 juta kata. Kita berada di jalur yang paling tidak resistan, jadi ambil versi 42 miliar.
- Mengapa begitu penting untuk menggunakan model "terkenal"?
"Aku senang kamu bertanya tentang ini, lawan bicara hipotetis!" Pada setiap langkah kami mencoba melakukan sesuatu yang sangat tipikal, dan model terbaik untuk representasi vektor kata untuk beberapa alasan belum ditentukan. Saya harap artikel ini akan membangkitkan keinginan untuk menggunakan model modern berkualitas tinggi , terutama yang memperhitungkan kesalahan algoritmik dan mencoba memperbaikinya. Namun, lebih lanjut tentang itu nanti.
Unduh glove.42B.300d.zip dari
situs web GloVe dan ekstrak
data/glove.42B.300d.txt
file
data/glove.42B.300d.txt
. Selanjutnya, kita mendefinisikan fungsi untuk membaca vektor dalam format sederhana.
def load_embeddings(filename): """ DataFrame , word2vec, GloVe, fastText ConceptNet Numberbatch. . """ labels = [] rows = [] with open(filename, encoding='utf-8') as infile: for i, line in enumerate(infile): items = line.rstrip().split(' ') if len(items) == 2:
(1917494, 300)
Langkah 2. Kamus nada emas standar
Sekarang kita memerlukan informasi kata mana yang dianggap positif dan mana yang negatif. Ada banyak kamus seperti itu, tetapi kami akan mengambil kamus yang sangat sederhana (Hu dan Liu, 2004), yang digunakan dalam artikel oleh
Deep Averaging Networks .
Unduh kamus dari
situs web Bing Liu dan ekstrak data dalam
data/positive-words.txt
dan
data/negative-words.txt
.
Selanjutnya, kami menentukan cara membaca file-file ini dan menetapkannya sebagai
neg_words
dan
neg_words
:
def load_lexicon(filename): """ (https://www.cs.uic.edu/~liub/FBS/sentiment-analysis.html) Latin-1. , - . , ';' , . """ lexicon = [] with open(filename, encoding='latin-1') as infile: for line in infile: line = line.rstrip() if line and not line.startswith(';'): lexicon.append(line) return lexicon pos_words = load_lexicon('data/positive-words.txt') neg_words = load_lexicon('data/negative-words.txt')
Langkah 3. Kami melatih model untuk memprediksi nada suara
Berdasarkan vektor kata-kata positif dan negatif, kami menggunakan perintah Pandas
.loc[]
untuk mencari representasi vektor dari semua kata.
Beberapa kata tidak ada dalam kamus GloVe. Paling sering ini adalah salah ketik seperti "fancinating". Di sini kita melihat sekelompok
NaN
, yang menunjukkan tidak adanya vektor, dan menghapusnya dengan perintah
.dropna()
.
pos_vectors = embeddings.loc[pos_words].dropna()
neg_vectors = embeddings.loc[neg_words].dropna()
Sekarang kita membuat array data pada input (representasi vektor) dan output (1 untuk kata-kata positif dan -1 untuk negatif). Kami juga memeriksa bahwa vektor dilampirkan ke kata-kata sehingga kami dapat menafsirkan hasilnya.
vectors = pd.concat([pos_vectors, neg_vectors])
targets = np.array([1 for entry in pos_vectors.index] + [-1 for entry in neg_vectors.index])
labels = list(pos_vectors.index) + list(neg_vectors.index)
- Tunggu sebentar. Beberapa kata tidak positif atau negatif, mereka netral. Bukankah seharusnya kelas ketiga diciptakan untuk kata-kata netral?
"Aku pikir dia akan berguna." Nanti kita akan melihat masalah apa yang muncul karena penugasan nada suara untuk kata-kata netral. Jika kita dapat dengan andal mengidentifikasi kata-kata netral, maka sangat mungkin untuk meningkatkan kompleksitas penggolong menjadi tiga kategori. Tetapi Anda perlu menemukan kamus kata-kata netral, karena di kamus Liu hanya ada yang positif dan negatif.
Jadi saya mencoba versi saya dengan 800 contoh kata dan menambah bobot untuk memprediksi kata-kata netral. Tetapi hasil akhirnya tidak jauh berbeda dari apa yang akan Anda lihat sekarang.
- Bagaimana daftar ini membedakan kata-kata positif dan negatif? Bukankah itu tergantung pada konteksnya?
- Pertanyaan bagus. Analisis kunci umum tidak sesederhana kelihatannya. Perbatasan cukup arbitrer di beberapa tempat. Dalam daftar ini, kata "kurang ajar" ditandai sebagai "buruk", dan "ambisius" sebagai "baik". "Komik" itu buruk, dan "lucu" itu bagus. “Pengembalian uang” itu baik, meskipun biasanya disebutkan dalam konteks yang buruk ketika Anda berutang uang kepada seseorang atau Anda berutang pada seseorang.
Semua orang mengerti bahwa nada suara ditentukan oleh konteks, tetapi dalam model sederhana Anda harus mengabaikan konteks dan berharap bahwa nada suara rata-rata akan ditebak dengan benar.
Menggunakan fungsi
train_test_split
,
train_test_split
secara bersamaan membagi vektor input, nilai output, dan label ke dalam data pelatihan dan pengujian, sambil menyisakan 10% untuk pengujian.
train_vectors, test_vectors, train_targets, test_targets, train_labels, test_labels = \ train_test_split(vectors, targets, labels, test_size=0.1, random_state=0)
Sekarang buat classifier dan lulus vektor melalui iterasi melaluinya. Kami menggunakan fungsi kerugian logistik sehingga classifier akhir dapat menyimpulkan probabilitas bahwa kata tersebut positif atau negatif.
model = SGDClassifier(loss='log', random_state=0, n_iter=100) model.fit(train_vectors, train_targets) SGDClassifier(alpha=0.0001, average=False, class_weight=None, epsilon=0.1, eta0=0.0, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', loss='log', n_iter=100, n_jobs=1, penalty='l2', power_t=0.5, random_state=0, shuffle=True, verbose=0, warm_start=False)
Kami mengevaluasi penggolong pada vektor uji. Ini menunjukkan akurasi 95%. Tidak buruk.
accuracy_score(model.predict(test_vectors), test_targets)
0.95022624434389136
Kami mendefinisikan fungsi prediksi nada suara untuk kata-kata tertentu, dan kemudian menggunakannya untuk beberapa contoh dari data uji.
def vecs_to_sentiment(vecs):
| nada suara |
---|
gelisah | -9.931679 |
---|
menyela | -9.634706 |
---|
dengan sabar | 1.466919 |
---|
imajiner | -2.989215 |
---|
perpajakan | 0.468522 |
---|
terkenal di dunia | 6.908561 |
---|
murah | 9.237223 |
---|
kekecewaan | -8.737182 |
---|
totaliter | -10.851580 |
---|
berperang | -8.328674 |
---|
membeku | -8.456981 |
---|
dosa | -7.839670 |
---|
rapuh | -4.018289 |
---|
tertipu | -4,309344 |
---|
belum terselesaikan | -2.816172 |
---|
secara cerdik | 2.339609 |
---|
mendemonstrasikan | -2.102152 |
---|
riang | 8.747150 |
---|
tidak populer | -7.887475 |
---|
bersimpati | 1.790899 |
---|
Terlihat bahwa classifier berfungsi. Dia belajar menggeneralisasi nada suara dengan kata-kata di luar data pelatihan.
Langkah 4. Dapatkan skor nada suara untuk teks.
Ada banyak cara untuk menambahkan vektor ke perkiraan keseluruhan. Sekali lagi, kita mengikuti jalan resistensi paling sedikit, jadi ambil saja nilai rata-rata.
import re TOKEN_RE = re.compile(r"\w.*?\b")
Ada banyak yang harus ditanyakan tentang pengoptimalan:
- Memperkenalkan hubungan terbalik antara bobot kata dan frekuensinya, sehingga preposisi yang sama tidak terlalu memengaruhi nada suara.
- Pengaturan agar kalimat pendek tidak berakhir dengan nilai nada suara yang ekstrem.
- Frasa akuntansi.
- Algoritma segmentasi kata yang lebih andal yang apostrof tidak merobohkan.
- Menghitung negatif seperti "tidak puas."
Tetapi semuanya membutuhkan kode tambahan dan tidak akan mengubah hasil secara fundamental. Setidaknya sekarang Anda dapat secara kasar membandingkan berbagai penawaran:
text_to_sentiment("this example is pretty cool") 3.889968926086298
text_to_sentiment("this example is okay") 2.7997773492425186
text_to_sentiment("meh, this example sucks") -1.1774475917460698
Langkah 5. Lihatlah monster yang kami buat
Tidak setiap kalimat memiliki nada suara yang diucapkan. Mari kita lihat apa yang terjadi dengan kalimat netral:
text_to_sentiment("Let's go get Italian food") 2.0429166109408983
text_to_sentiment("Let's go get Chinese food") 1.4094033658140972
text_to_sentiment("Let's go get Mexican food") 0.38801985560121732
Saya sudah menemukan fenomena seperti itu ketika menganalisis ulasan restoran dengan mempertimbangkan representasi kata-kata vektor. Tanpa alasan yang jelas
, semua restoran Meksiko memiliki skor keseluruhan yang lebih rendah .
Representasi vektor menangkap perbedaan semantik yang halus dalam konteks. Karena itu, mereka mencerminkan prasangka masyarakat kita.
Berikut adalah beberapa saran netral lainnya:
text_to_sentiment("My name is Emily") 2.2286179364745311
text_to_sentiment("My name is Heather") 1.3976291151079159
text_to_sentiment("My name is Yvette") 0.98463802132985556
text_to_sentiment("My name is Shaniqua") -0.47048131775890656
Ya ampun ...
Sistem yang terkait dengan nama-nama orang perasaan yang sama sekali berbeda. Anda dapat melihat ini dan banyak contoh lainnya dan melihat bahwa nada suara biasanya lebih tinggi untuk nama putih stereotip dan lebih rendah untuk nama hitam stereotip.
Tes ini digunakan oleh Caliscan, Bryson dan Narayanan dalam makalah penelitian mereka yang diterbitkan dalam jurnal
Science pada April 2017. Ini membuktikan bahwa
semantik bahasa corpus mengandung prasangka masyarakat . Kami akan menggunakan metode ini.
Langkah 6. Menilai masalah
Kami ingin memahami bagaimana cara menghindari kesalahan seperti itu. Mari kita lewati lebih banyak data melalui classifier dan secara statistik mengukur "bias" nya.
Di sini kami memiliki empat daftar nama yang mencerminkan latar belakang etnis yang berbeda, terutama di AS. Dua yang pertama adalah daftar nama dominan "putih" dan "hitam", diadaptasi berdasarkan artikel oleh Kaliskan et al. Saya juga menambahkan nama-nama Spanyol dan Muslim dari bahasa Arab dan Urdu.
Data ini digunakan untuk memverifikasi bias algoritma selama proses pembuatan ConceptNet: dapat ditemukan dalam modul
conceptnet5.vectors.evaluation.bias
. Ada ide untuk memperluas kamus ke kelompok etnis lain, dengan mempertimbangkan tidak hanya nama, tetapi juga nama keluarga.
Berikut daftarnya:
NAMES_BY_ETHNICITY = {
Menggunakan Panda, kami akan menyusun daftar nama, asal etnis dan peringkat nada suara mereka yang dominan:
def name_sentiment_table(): frames = [] for group, name_list in sorted(NAMES_BY_ETHNICITY.items()): lower_names = [name.lower() for name in name_list] sentiments = words_to_sentiment(lower_names) sentiments['group'] = group frames.append(sentiments) # return pd.concat(frames) name_sentiments = name_sentiment_table()
Data sampel:
name_sentiments.ix[::25]
| nada suara | grup |
---|
mohammed | 0.834974 | Arab / Muslim |
---|
alya | 3.916803 | Arab / Muslim |
---|
terryl | -2.858010 | Hitam |
---|
josé | 0,432956 | Hispanik |
---|
luciana | 1.086073 | Hispanik |
---|
terima kasih | 0,391858 | Putih |
---|
mulai | 2.158679 | Putih |
---|
Kami akan membuat grafik distribusi nada suara untuk setiap nama.
plot = seaborn.swarmplot(x='group', y='sentiment', data=name_sentiments) plot.set_ylim([-10, 10])
(-10, 10)

Atau sebagai histogram dengan interval kepercayaan untuk rata-rata 95%.
plot = seaborn.barplot(x='group', y='sentiment', data=name_sentiments, capsize=.1)

Terakhir, jalankan paket statistik
statsmodels yang serius. Ini akan menunjukkan betapa hebatnya bias algoritma (bersama dengan banyak statistik lainnya).
Hasil Regresi OLSDep. Variabel: | sentimen | R-kuadrat: | 0,208 |
---|
Model: | OLS | Ajj R-kuadrat: | 0,192 |
---|
Metode: | Kotak kuadrat | F-statistik: | 04/13 |
---|
Tanggal: | Kamis, 13 Jul 2017 | Prob (F-statistik): | 1.31e-07 |
---|
Waktu: | 11:31:17 | Log-Kemungkinan: | -356,78 |
---|
Tidak. Pengamatan: | 153 | AIC: | 721.6 |
---|
Df Residual: | 149 | BIC: | 733.7 |
---|
Model Df: | 3 | | |
---|
Jenis Kovarian: | tidak keras | | |
---|
F-statistik adalah rasio variasi antara kelompok dengan variasi dalam kelompok, yang dapat diambil sebagai penilaian umum bias.
Tepat di bawahnya ditunjukkan kemungkinan bahwa kita akan melihat F-statistik maksimum dengan hipotesis nol: yaitu, dengan tidak adanya perbedaan antara opsi yang dibandingkan. Peluangnya sangat, sangat rendah. Dalam sebuah artikel ilmiah, kami akan menyebut hasilnya "sangat signifikan secara statistik."
Kita perlu meningkatkan nilai-F. Semakin rendah semakin baik.
ols_model.fvalue
13.041597745167659
Langkah 7. Mencoba data lain.
Kami sekarang memiliki kesempatan untuk mengukur bias model secara numerik. Mari kita coba sesuaikan. Untuk melakukan ini, Anda perlu mengulangi banyak hal yang dulu hanya langkah terpisah dalam notepad Python.
Jika saya menulis kode yang baik dan didukung, saya tidak akan menggunakan variabel global seperti
model
dan
embeddings
. Tetapi kode spageti saat ini memungkinkan Anda untuk memeriksa setiap langkah dengan lebih baik dan memahami apa yang terjadi. Kami menggunakan kembali bagian dari kode dan setidaknya mendefinisikan fungsi untuk mengulangi beberapa langkah:
def retrain_model(new_embs): """ . """ global model, embeddings, name_sentiments embeddings = new_embs pos_vectors = embeddings.loc[pos_words].dropna() neg_vectors = embeddings.loc[neg_words].dropna() vectors = pd.concat([pos_vectors, neg_vectors]) targets = np.array([1 for entry in pos_vectors.index] + [-1 for entry in neg_vectors.index]) labels = list(pos_vectors.index) + list(neg_vectors.index) train_vectors, test_vectors, train_targets, test_targets, train_labels, test_labels = \ train_test_split(vectors, targets, labels, test_size=0.1, random_state=0) model = SGDClassifier(loss='log', random_state=0, n_iter=100) model.fit(train_vectors, train_targets) accuracy = accuracy_score(model.predict(test_vectors), test_targets) print("Accuracy of sentiment: {:.2%}".format(accuracy)) name_sentiments = name_sentiment_table() ols_model = statsmodels.formula.api.ols('sentiment ~ group', data=name_sentiments).fit() print("F-value of bias: {:.3f}".format(ols_model.fvalue)) print("Probability given null hypothesis: {:.3}".format(ols_model.f_pvalue))
Kami mencoba word2vec
Dapat diasumsikan bahwa hanya GloVe yang memiliki masalah. Mungkin ada banyak situs yang meragukan dalam database Common Crawl dan setidaknya 20 salinan Urban Dictionary of gaul jalanan. Mungkin pada basis yang berbeda akan lebih baik: bagaimana dengan word2vec tua yang baik yang dilatih di Google News?
Tampaknya sumber yang paling otoritatif untuk data word2vec adalah
file ini di Google Drive . Unduh dan simpan sebagai
data/word2vec-googlenews-300.bin.gz
.
Accuracy of sentiment: 94.30%
F-value of bias: 15.573
Probability given null hypothesis: 7.43e-09
Jadi word2vec ternyata lebih buruk dengan nilai F lebih dari 15.
Pada prinsipnya, bodoh mengharapkan
berita akan lebih terlindungi dari bias.
Mencoba ConceptNet Numberbatch
Akhirnya, saya dapat berbicara tentang proyek saya sendiri tentang representasi vektor kata-kata.
ConceptNet dengan fitur presentasi vektor adalah grafik pengetahuan yang sedang saya kerjakan. Ini menormalkan representasi vektor pada tahap pelatihan, mengidentifikasi dan menghapus beberapa sumber rasisme algoritmik dan seksisme. Metode mengoreksi bias didasarkan pada artikel ilmiah oleh Bulukbashi et al.
"Debiasing Word Embeddings" dan digeneralisasi untuk menghilangkan beberapa jenis bias secara bersamaan. Sejauh yang saya tahu, ini adalah satu-satunya sistem semantik di mana ada sesuatu seperti itu.
Dari waktu ke waktu, kami mengekspor vektor yang sudah dihitung sebelumnya dari ConceptNet - rilis ini disebut
ConceptNet Numberbatch . Pada bulan April 2017, rilis pertama dengan koreksi bias dirilis, jadi kami akan memuat vektor berbahasa Inggris dan melatih kembali model kami.
numberbatch-en-17.04b.txt.gz
, menyimpannya di
data/
direktori dan melatih kembali model:
retrain_model(load_embeddings('data/numberbatch-en-17.04b.txt'))
Accuracy of sentiment: 97.46%
F-value of bias: 3.805
Probability given null hypothesis: 0.0118

Jadi, sudahkah ConceptNet Numberbatch benar-benar menyelesaikan masalah? Tidak ada lagi rasisme algoritmik?
Tidak.Apakah rasisme menjadi jauh lebih sedikit?
Tentu sajaRentang utama untuk kelompok etnis tumpang tindih jauh lebih banyak daripada di vektor GloVe atau word2vec. Dibandingkan dengan GloVe, nilai F menurun lebih dari tiga kali, dan dibandingkan dengan word2vec - lebih dari empat kali. Dan secara umum, kami melihat perbedaan yang jauh lebih kecil dalam nada suara ketika membandingkan nama yang berbeda: ini seharusnya demikian, karena nama-nama tersebut benar-benar tidak boleh mempengaruhi hasil analisis.
Tetapi sedikit korelasi tetap. Mungkin saya bisa mengambil data dan parameter pelatihan seperti itu sehingga masalah tampaknya terpecahkan. Tetapi ini akan menjadi pilihan yang buruk, karena
sebenarnya masalahnya tetap ada, karena di ConceptNet kami tidak mengidentifikasi dan mengganti semua penyebab rasisme algoritmik. Tapi ini awal yang baik.
Tidak ada jebakan
Harap dicatat bahwa dengan beralih ke ConceptNet Numberbatch, akurasi prediksi nada suara telah meningkat.
Seseorang mungkin menyarankan bahwa memperbaiki rasisme algoritmik akan memperburuk hasil dengan beberapa cara lain. Tapi tidak. Anda mungkin memiliki data yang lebih baik dan kurang rasis.
Data benar-benar membaik dengan koreksi ini. Rasisme word2vec dan GloVe yang diperoleh dari orang-orang tidak ada hubungannya dengan keakuratan algoritma.Pendekatan lain
Tentu saja, ini hanya satu cara untuk menganalisis nada suara. Beberapa detail dapat diimplementasikan secara berbeda.Sebagai gantinya atau sebagai tambahan untuk mengubah basis vektor, Anda dapat mencoba untuk memperbaiki masalah ini secara langsung di output. Misalnya, umumnya menghilangkan penilaian nada suara untuk nama dan kelompok orang.Secara umum ada opsi untuk menolak menghitung nada suara semua kata, dan menghitungnya hanya untuk kata-kata dari daftar. Ini mungkin bentuk paling umum dari analisis sentimen - tanpa pembelajaran mesin sama sekali. Hasilnya tidak akan memiliki bias yang lebih dari penulis daftar. Tetapi menolak pembelajaran mesin berarti mengurangi recall (recall), dan satu-satunya cara untuk mengadaptasi model ke dataset adalah dengan mengedit daftar secara manual.Sebagai pendekatan hibrid, Anda dapat membuat sejumlah besar estimasi perkiraan nada suara untuk kata-kata dan menginstruksikan seseorang untuk mengeditnya dengan sabar, membuat daftar kata-kata pengecualian dengan nol nada suara. Tapi ini pekerjaan tambahan. Di sisi lain, Anda benar-benar akan melihat cara kerja model. Saya pikir dalam hal apa pun, ini harus dicari.