stem + in(donesian)
JavaScript library for stemming Indonesian words, based heavily on mpstemmer.
stemin
memberikan dukungan untuk mengubah kata tidak baku yang berimbuhan, lihat penggunaan untuk contoh lebih lengkap, atau coba sekarang!
npm install stemin
import { MPStemmer } from 'stemin' // ES Module
const { MPStemmer } = require('stemin') // CommonJS
<script src="https://cdn.jsdelivr.net/npm/stemin"></script>
<script>
const { MPStemmer } = window.stemin
</script>
const stemmer = new MPStemmer()
stemmer.stem('ketersinggungan') // singgung
stemmer.stem('ngebesarin') // besar
// menambahkan kata dasar
stemmer.words.add('naon')
stemmer.stem('kunaon') // naon
// menambahkan kata ganti atau sinonim
stemmer.synonyms.set('santuy', 'santai')
stemmer.stem('nyantuy') // santai
// penggunaan untuk stemming lebih dari 1 kata
const tokenize = (text) => text
// hapus spasi di awal dan akhir teks
.trim()
// ubah menjadi huruf kecil
.toLowerCase()
// hapus non-huruf, tanda hubung, dan spasi
.replace(/[^a-z- ]/g, '')
// pisah per kata
.split(/ |-/)
let result = tokenize('Perekonomian Indonesia sedang dalam pertumbuhan yang membanggakan')
.map((token) => stemmer.stem(token))
.join(' ')
console.log(result) // ekonomi indonesia sedang dalam tumbuh yang bangga
Fitur utama dari stemin
adalah kecepatan dan akurasi yang lebih baik dibandingkan dengan sastrawijs
, dukungan untuk stemming kata non standar (tidak baku/gaul), dan fuzzy search menggunakan Levenshtein distance.
Berdasarkan hasil pengujian, disimpulkan bahwa stemin
lebih akurat dalam melakukan stemming. Walaupun menggunakan kamus yang sama, sastrawijs
tidak dapat memenuhi beberapa aturan yang ada.
Hasil pengujian
❯ tests/sastrawijs.test.ts (86 tests | 11 failed) 48ms
× rule 1: berV -> ber-V | be-rV > berapi -> api 11ms
→ expected 'rap' to be 'api' // Object.is equality
× rule 15: menV -> me-nV | me-tV > menari -> tari 1ms
→ expected 'ari' to be 'tari' // Object.is equality
× rule 17: mengV -> meng-V | meng-kV > mengerat -> erat 1ms
→ expected 'rat' to be 'erat' // Object.is equality
× rule 17: mengV -> meng-V | meng-kV > mengecil -> kecil 2ms
→ expected 'mengecil' to be 'kecil' // Object.is equality
× rule 17: mengV -> meng-V | meng-kV > mengerikan -> ngeri 3ms
→ expected 'mengerikan' to be 'ngeri' // Object.is equality
× rule 18: menyV -> meny-sV | me-nyV > menyapu -> sapu 1ms
→ expected 'menyapu' to be 'sapu' // Object.is equality
× rule 21: perV -> per-V | pe-rV > perusak -> rusak 1ms
→ expected 'usak' to be 'rusak' // Object.is equality
× rule 21: perV -> per-V | pe-rV > perancang -> rancang 1ms
→ expected 'ancang' to be 'rancang' // Object.is equality
× rule 27: penV -> pe-nV | pe-tV > penilai -> nilai 1ms
→ expected 'ilai' to be 'nilai' // Object.is equality
× rule 27: penV -> pe-nV | pe-tV > penari -> tari 1ms
→ expected 'ari' to be 'tari' // Object.is equality
× rule 30: penyV -> peny-sV > penyikat -> sikat 1ms
→ expected 'ikat' to be 'sikat' // Object.is equality
✓ tests/cs-stemmer.test.ts (86 tests) 30ms
Secara performa, proses confix stripping dari stemin
lebih unggul dibandingkan dengan sastrawijs
hingga >15x lipat.
Hal ini dikarenakan stemin
menggunakan data struktur yang sesuai (Set dan Map) untuk menyimpan sekitar ~29,933 kata dasar dan ~1,495 pasangan kata non standar.
Hasil benchmark
✓ tests/stemmer.bench.ts (4) 3465ms
name hz min max mean p75 p99 p995 p999 rme samples
· sastrawijs 105.27 7.9020 15.0041 9.4994 10.0683 15.0041 15.0041 15.0041 ±5.24% 53
· cs-stemmer 1,661.68 0.5688 1.5568 0.6018 0.6069 0.9038 1.4066 1.5568 ±0.97% 831 fastest
· mp-stemmer 1,280.46 0.7321 1.9259 0.7810 0.7494 1.5363 1.6240 1.9259 ±1.37% 641
· mp-stemmer w/ fuzzy 10.7277 90.6340 97.0473 93.2167 94.6084 97.0473 97.0473 97.0473 ±1.76% 10 slowest
BENCH Summary
cs-stemmer - tests/stemmer.bench.ts
1.30x faster than mp-stemmer
15.79x faster than sastrawijs
154.90x faster than mp-stemmer w/ fuzzy
- Adriani, M., Asian, J., Nazief, B., Tahaghoghi, S. M., & Williams, H. E. (2007). Stemming Indonesian: A confix-stripping approach. ACM Transactions on Asian Language Information Processing (TALIP), 6(4), 1-33.
- Arifin, A. Z., Mahendra, I. P. A. K., & Ciptaningtyas, H. T. (2009, April). Enhanced confix stripping stemmer and ants algorithm for classifying news document in indonesian language. In The International Conference on Information & Communication Technology and Systems (Vol. 5, pp. 149-158).
- Librian, A. (2014). Sastrawi: High quality stemmer library for Indonesian Language (Bahasa). GitHub. https://github.com/sastrawi/sastrawi
- Prabono, A. G. (2020). Mpstemmer: a multi-phase stemmer for standard and nonstandard Indonesian words. GitHub. https://github.com/ariaghora/mpstemmer
- Zaky, D. (2017). SastrawiJs: Indonesian language stemmer Javascript port of PHP Sastrawi project. GitHub. https://github.com/damzaky/sastrawijs
Stemin didistribusikan di bawah Lisensi MIT. Kamus kata dasar diambil dari sastrawi & kateglo dengan lisensi CC-BY-NC-SA 3.0.