natural
Version:
General natural language (tokenizing, stemming (English, Russian, Spanish), part-of-speech tagging, sentiment analysis, classification, inflection, phonetics, tfidf, WordNet, jaro-winkler, Levenshtein distance, Dice's Coefficient) facilities for node.
1,021 lines (856 loc) • 28.3 kB
JavaScript
/*
Copyright (c) 2017, Alif Bhaskoro, Andy Librian, R. Kukuh (Reimplemented from https://github.com/sastrawi/sastrawi)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
// a list of commonly used words that have little meaning and can be excluded
// from analysis.
const Removal = require('./removal')
// Make global variable for dictionary
const dictionary = loadDictionary()
function loadDictionary () {
const fin = require('./data/kata-dasar.json')
return new Set(fin.filter(Boolean))
}
// Find certain word in dictionary
function find (word) {
return dictionary.has(word)
}
function PrefixRules () {
const PrefixRules = this
this.removal = undefined
this.currentWord = undefined
// Run the array of disambiguate rules on input word
function runDisambiguator (disambiguateRules, word) {
let result
for (const i in disambiguateRules) {
result = disambiguateRules[i](word)
if (find(result)) {
break
}
}
if (result === undefined) {
this.currentWord = word
this.removal = undefined
return this
}
return createResultObject(result, word, 'DP')
}
function createResultObject (result, word, type) {
const removedPart = word.replace(result, '')
const removal = new Removal(word, result, removedPart, type)
this.removal = removal
this.currentWord = result
return this
}
PrefixRules.RemovePlainPrefix = function (word) {
const result = word.replace(/^(di|ke|se)/, '')
if (result !== word) {
const removedPart = word.replace(result, '')
const removal = new Removal(word, result, removedPart, 'DP')
this.removal = removal
} else {
this.removal = undefined
}
this.currentWord = result
return this
}
// RULE 1
function disambiguateRule1A (word) {
// Rule 1a : berV -> ber-V
const matches = word.match(/^ber([aiueo].*)$/)
if (matches) {
return matches[1]
}
}
function disambiguateRule1B (word) {
// Rule 1b : berV -> be-rV
const matches = word.match(/^ber([aiueo].*)$/)
if (matches) {
return 'r' + matches[1]
}
}
PrefixRules.DisambiguatorPrefixRule1 = function (word) {
// Push rules 1A & 1B
const disambiguateRules = []
disambiguateRules.push(disambiguateRule1A)
disambiguateRules.push(disambiguateRule1B)
return runDisambiguator(disambiguateRules, word)
}
// RULE 2
function disambiguateRule2 (word) {
// Rule 2 : berCAP -> ber-CAP where C != 'r' AND P != 'er'
const matches = word.match(/^ber([bcdfghjklmnpqrstvwxyz])([a-z])(.*)/)
if (matches) {
if (matches[3].match(/^er(.*)$/)) {
return
}
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule2 = function (word) {
// Push rule 2
const disambiguateRules = []
disambiguateRules.push(disambiguateRule2)
return runDisambiguator(disambiguateRules, word)
}
// RULE 3
function disambiguateRule3 (word) {
// Rule 3 : berCAerV -> ber-CAerV where C != 'r'
const matches = word.match(/ber([bcdfghjklmnpqrstvwxyz])([a-z])er([aiueo])(.*)/)
if (matches) {
if (matches[1] === 'r') {
return
}
return matches[1] + matches[2] + 'er' + matches[3] + matches[4]
}
}
PrefixRules.DisambiguatorPrefixRule3 = function (word) {
// Push rule 3
const disambiguateRules = []
disambiguateRules.push(disambiguateRule3)
return runDisambiguator(disambiguateRules, word)
}
// RULE 4
function disambiguateRule4 (word) {
// Rule 4 : belajar -> ajar
if (word === 'belajar') {
return 'ajar'
}
}
PrefixRules.DisambiguatorPrefixRule4 = function (word) {
// Push rule 4
const disambiguateRules = []
disambiguateRules.push(disambiguateRule4)
return runDisambiguator(disambiguateRules, word)
}
// RULE 5
function disambiguateRule5 (word) {
// Rule 5 : beC1erC2 -> be-C1erC2 where C1 != 'r'
const matches = word.match(/be([bcdfghjklmnpqstvwxyz])(er[bcdfghjklmnpqrstvwxyz])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule5 = function (word) {
// Push rule 5
const disambiguateRules = []
disambiguateRules.push(disambiguateRule5)
return runDisambiguator(disambiguateRules, word)
}
// RULE 6
function disambiguateRule6a (word) {
// Rule 6a : terV -> ter-V
const matches = word.match(/^ter([aiueo].*)$/)
if (matches) {
return matches[1]
}
}
function disambiguateRule6b (word) {
// Rule 6b : terV -> te-rV
const matches = word.match(/^ter([aiueo].*)$/)
if (matches) {
return 'r' + matches[1]
}
}
PrefixRules.DisambiguatorPrefixRule6 = function (word) {
// Push rule 6
const disambiguateRules = []
disambiguateRules.push(disambiguateRule6a)
disambiguateRules.push(disambiguateRule6b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 7
function disambiguateRule7 (word) {
// Rule 7 : terCerv -> ter-CerV where C != 'r'
const matches = word.match(/^ter([bcdfghjklmnpqrstvwxyz])er([aiueo].*)$/)
if (matches) {
if (matches[1] === 'r') {
return
}
return matches[1] + 'er' + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule7 = function (word) {
// Push rule 7
const disambiguateRules = []
disambiguateRules.push(disambiguateRule7)
return runDisambiguator(disambiguateRules, word)
}
// RULE 8
function disambiguateRule8 (word) {
// Rule 8 : terCP -> ter-CP where C != 'r' and P != 'er'
const matches = word.match(/^ter([bcdfghjklmnpqrstvwxyz])(.*)$/)
if (matches) {
if (matches[1] === 'r' || matches[2].match(/^er(.*)$/)) {
return
}
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule8 = function (word) {
// Push rule 8
const disambiguateRules = []
disambiguateRules.push(disambiguateRule8)
return runDisambiguator(disambiguateRules, word)
}
// RULE 9
function disambiguateRule9 (word) {
// Rule 9 : te-C1erC2 -> te-C1erC2 where C1 != 'r'
const matches = word.match(/^te([bcdfghjklmnpqrstvwxyz])er([bcdfghjklmnpqrstvwxyz])(.*)$/)
if (matches) {
if (matches[1] === 'r') {
return
}
return matches[1] + 'er' + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule9 = function (word) {
// Push rule 9
const disambiguateRules = []
disambiguateRules.push(disambiguateRule9)
return runDisambiguator(disambiguateRules, word)
}
// RULE 10
function disambiguateRule10 (word) {
// Rule 10 : me{l|r|w|y}V -> me-{l|r|w|y}V
const matches = word.match(/^me([lrwy])([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule10 = function (word) {
// Push rule 10
const disambiguateRules = []
disambiguateRules.push(disambiguateRule10)
return runDisambiguator(disambiguateRules, word)
}
// RULE 11
function disambiguateRule11 (word) {
// Rule 11 : mem{b|f|v} -> mem-{b|f|v}
const matches = word.match(/^mem([bfv])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule11 = function (word) {
// Push rule 11
const disambiguateRules = []
disambiguateRules.push(disambiguateRule11)
return runDisambiguator(disambiguateRules, word)
}
// RULE 12
function disambiguateRule12 (word) {
// Nazief and Adriani Rule 12 : beC1erC2 -> be-C1erC2 where C1 != 'r'
// Modified by Jelita Asian's CS Rule 12 : mempe -> mem-pe to stem mempengaruhi
const matches = word.match(/^mempe(.*)$/)
if (matches) {
return 'pe' + matches[1]
}
}
PrefixRules.DisambiguatorPrefixRule12 = function (word) {
// Push rule 12
const disambiguateRules = []
disambiguateRules.push(disambiguateRule12)
return runDisambiguator(disambiguateRules, word)
}
// RULE 13
function disambiguateRule13a (word) {
// Rule 13a : mem{rV|V} -> me-m{rV|V}
const matches = word.match(/^mem([aiueo])(.*)$/)
if (matches) {
return 'm' + matches[1] + matches[2]
}
}
function disambiguateRule13b (word) {
// Rule 13b : mem{rV|V} -> me-p{rV|V}
const matches = word.match(/^mem([aiueo])(.*)$/)
if (matches) {
return 'p' + matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule13 = function (word) {
// Push rule 13
const disambiguateRules = []
disambiguateRules.push(disambiguateRule13a)
disambiguateRules.push(disambiguateRule13b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 14
function disambiguateRule14 (word) {
/* Rule 14 modified by Andy Librian : men{c|d|j|s|t|z} -> men-{c|d|j|s|t|z}
in order to stem mentaati
Rule 14 modified by ECS: men{c|d|j|s|z} -> men-{c|d|j|s|z}
in order to stem mensyaratkan, mensyukuri
Original CS Rule no 14 was : men{c|d|j|z} -> men-{c|d|j|z} */
const matches = word.match(/^men([cdjstz])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule14 = function (word) {
// Push rule 14
const disambiguateRules = []
disambiguateRules.push(disambiguateRule14)
return runDisambiguator(disambiguateRules, word)
}
// RULE 15
function disambiguateRule15a (word) {
// Rule 15a : men{V} -> me-n{V}
const matches = word.match(/^men([aiueo])(.*)$/)
if (matches) {
return 'n' + matches[1] + matches[2]
}
}
function disambiguateRule15b (word) {
// Rule 15b : men{V} -> me-t{V}
const matches = word.match(/^men([aiueo])(.*)$/)
if (matches) {
return 't' + matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule15 = function (word) {
// Push rule 15
const disambiguateRules = []
disambiguateRules.push(disambiguateRule15a)
disambiguateRules.push(disambiguateRule15b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 16
function disambiguateRule16 (word) {
// Original Nazief and Adriani's Rule 16 : meng{g|h|q} -> meng-{g|h|q}
// Modified Jelita Asian's CS Rule 16 : meng{g|h|q|k} -> meng-{g|h|q|k} to stem mengkritik
const matches = word.match(/^meng([g|h|q|k])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule16 = function (word) {
// Push rule 16
const disambiguateRules = []
disambiguateRules.push(disambiguateRule16)
return runDisambiguator(disambiguateRules, word)
}
// RULE 17
function disambiguateRule17a (word) {
// Rule 17a : mengV -> meng-V
const matches = word.match(/^meng([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
function disambiguateRule17b (word) {
// Rule 17b : mengV -> meng-kV
const matches = word.match(/^meng([aiueo])(.*)$/)
if (matches) {
return 'k' + matches[1] + matches[2]
}
}
function disambiguateRule17c (word) {
// Rule 17c : mengV -> meng-V- where V = 'e'
const matches = word.match(/^menge(.*)$/)
if (matches) {
return matches[1]
}
}
function disambiguateRule17d (word) {
// Rule 17d : mengV -> me-ngV
const matches = word.match(/^meng([aiueo])(.*)$/)
if (matches) {
return 'ng' + matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule17 = function (word) {
// Push rule 17
const disambiguateRules = []
disambiguateRules.push(disambiguateRule17a)
disambiguateRules.push(disambiguateRule17b)
disambiguateRules.push(disambiguateRule17c)
disambiguateRules.push(disambiguateRule17d)
return runDisambiguator(disambiguateRules, word)
}
// RULE 18
function disambiguateRule18a (word) {
// Rule 18a : menyV -> me-nyV to stem menyala -> nyala
const matches = word.match(/^meny([aiueo])(.*)$/)
if (matches) {
return 'ny' + matches[1] + matches[2]
}
}
function disambiguateRule18b (word) {
// Original Rule 18b : menyV -> meny-sV
// Modified by CC (shifted into 18b, see also 18a)
const matches = word.match(/^meny([aiueo])(.*)$/)
if (matches) {
return 's' + matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule18 = function (word) {
// Push rule 18
const disambiguateRules = []
disambiguateRules.push(disambiguateRule18a)
disambiguateRules.push(disambiguateRule18b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 19
function disambiguateRule19 (word) {
// Original Rule 19 : mempV -> mem-pV where V != 'e'
// Modified Rule 19 by ECS : mempA -> mem-pA where A != 'e' in order to stem memproteksi
const matches = word.match(/^memp([abcdfghijklmopqrstuvwxyz])(.*)$/)
if (matches) {
return 'p' + matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule19 = function (word) {
// Push rule 19
const disambiguateRules = []
disambiguateRules.push(disambiguateRule19)
return runDisambiguator(disambiguateRules, word)
}
// RULE 20
function disambiguateRule20 (word) {
// Rule 20 : pe{w|y}V -> pe-{w|y}V
const matches = word.match(/^pe([wy])([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule20 = function (word) {
// Push rule 20
const disambiguateRules = []
disambiguateRules.push(disambiguateRule20)
return runDisambiguator(disambiguateRules, word)
}
// RULE 21
function disambiguateRule21a (word) {
// Rule 21a : perV -> per-V
const matches = word.match(/^per([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
function disambiguateRule21b (word) {
// Rule 21b : perV -> pe-rV
const matches = word.match(/^pe(r[aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule21 = function (word) {
// Push rule 21
const disambiguateRules = []
disambiguateRules.push(disambiguateRule21a)
disambiguateRules.push(disambiguateRule21b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 23
function disambiguateRule23 (word) {
// Rule 23 : perCAP -> per-CAP where C != 'r' AND P != 'er'
const matches = word.match(/^per([bcdfghjklmnpqrstvwxyz])([a-z])(.*)$/)
if (matches) {
if (matches[3].match(/^er(.*)$/)) {
return
}
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule23 = function (word) {
// Push rule 23
const disambiguateRules = []
disambiguateRules.push(disambiguateRule23)
return runDisambiguator(disambiguateRules, word)
}
// RULE 24
function disambiguateRule24 (word) {
// Rule 24 : perCAerV -> per-CAerV where C != 'r'
const matches = word.match(/^per([bcdfghjklmnpqrstvwxyz])([a-z])er([aiueo])(.*)$/)
if (matches) {
if (matches[1] === 'r') {
return
}
return matches[1] + matches[2] + 'er' + matches[3] + matches[4]
}
}
PrefixRules.DisambiguatorPrefixRule24 = function (word) {
// Push rule 24
const disambiguateRules = []
disambiguateRules.push(disambiguateRule24)
return runDisambiguator(disambiguateRules, word)
}
// RULE 25
function disambiguateRule25 (word) {
// Rule 25 : pem{b|f|v} -> pem-{b|f|v}
const matches = word.match(/^pem([bfv])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule25 = function (word) {
// Push rule 25
const disambiguateRules = []
disambiguateRules.push(disambiguateRule25)
return runDisambiguator(disambiguateRules, word)
}
// RULE 26
function disambiguateRule26a (word) {
// Rule 26a : pem{rV|V} -> pe-m{rV|V}
const matches = word.match(/^pem([aiueo])(.*)$/)
if (matches) {
return 'm' + matches[1] + matches[2]
}
}
function disambiguateRule26b (word) {
// Rule 26b : pem{rV|V} -> pe-p{rV|V}
const matches = word.match(/^pem([aiueo])(.*)$/)
if (matches) {
return 'p' + matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule26 = function (word) {
// Push rule 26
const disambiguateRules = []
disambiguateRules.push(disambiguateRule26a)
disambiguateRules.push(disambiguateRule26b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 27
function disambiguateRule27 (word) {
// Rule 27 : pen{c|d|j|s|t|z} -> pen-{c|d|j|s|t|z}
const matches = word.match(/^pen([cdjstz])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule27 = function (word) {
// Push rule 27
const disambiguateRules = []
disambiguateRules.push(disambiguateRule27)
return runDisambiguator(disambiguateRules, word)
}
// RULE 28
function disambiguateRule28a (word) {
// Rule 28a : pen{V} -> pe-n{V}
const matches = word.match(/^pen([aiueo])(.*)$/)
if (matches) {
return 'n' + matches[1] + matches[2]
}
}
function disambiguateRule28b (word) {
// Rule 28b : pen{V} -> pe-t{V}
const matches = word.match(/^pen([aiueo])(.*)$/)
if (matches) {
return 't' + matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule28 = function (word) {
// Push rule 28
const disambiguateRules = []
disambiguateRules.push(disambiguateRule28a)
disambiguateRules.push(disambiguateRule28b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 29
function disambiguateRule29 (word) {
// Rule 29 by ECS : pengC -> peng-C
const matches = word.match(/^peng([bcdfghjklmnpqrstvwxyz])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule29 = function (word) {
// Push rule 29
const disambiguateRules = []
disambiguateRules.push(disambiguateRule29)
return runDisambiguator(disambiguateRules, word)
}
// RULE 30
function disambiguateRule30a (word) {
// Rule 30a : pengV -> peng-V
const matches = word.match(/^peng([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2]
}
}
function disambiguateRule30b (word) {
// Rule 30b : pengV -> peng-kV
const matches = word.match(/^peng([aiueo])(.*)$/)
if (matches) {
return 'k' + matches[1] + matches[2]
}
}
function disambiguateRule30c (word) {
// Rule 30c : pengV -> pengV- where V = 'e'
const matches = word.match(/^penge(.*)$/)
if (matches) {
return matches[1]
}
}
PrefixRules.DisambiguatorPrefixRule30 = function (word) {
// Push rule 30
const disambiguateRules = []
disambiguateRules.push(disambiguateRule30a)
disambiguateRules.push(disambiguateRule30b)
disambiguateRules.push(disambiguateRule30c)
return runDisambiguator(disambiguateRules, word)
}
// RULE 31
function disambiguateRule31a (word) {
// Rule 31a : penyV -> pe-nyV
const matches = word.match(/^peny([aiueo])(.*)$/)
if (matches) {
return 'ny' + matches[1] + matches[2]
}
}
function disambiguateRule31b (word) {
// Original Rule 31 : penyV -> peny-sV
const matches = word.match(/^peny([aiueo])(.*)$/)
if (matches) {
return 's' + matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule31 = function (word) {
// Push rule 31
const disambiguateRules = []
disambiguateRules.push(disambiguateRule31a)
disambiguateRules.push(disambiguateRule31b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 32
function disambiguateRule32 (word) {
// Rule 32 : pelV -> pe-lV except pelajar -> ajar
if (word === 'pelajar') {
return 'ajar'
}
const matches = word.match(/^pe(l[aiueo])(.*)/)
if (matches) {
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule32 = function (word) {
// Push rule 32
const disambiguateRules = []
disambiguateRules.push(disambiguateRule32)
return runDisambiguator(disambiguateRules, word)
}
// RULE 34
function disambiguateRule34 (word) {
// Rule 34 : peCP -> pe-CP where C != {r|w|y|l|m|n} and P != 'er'
const matches = word.match(/^pe([bcdfghjklmnpqrstvwxyz])(.*)$/)
if (matches) {
if (matches[2].match(/^er(.*)$/)) {
return
}
return matches[1] + matches[2]
}
}
PrefixRules.DisambiguatorPrefixRule34 = function (word) {
// Push rule 34
const disambiguateRules = []
disambiguateRules.push(disambiguateRule34)
return runDisambiguator(disambiguateRules, word)
}
// RULE 35
function disambiguateRule35 (word) {
// Rule 35 : terC1erC2 -> ter-C1erC2 where C1 != {r}
const matches = word.match(/^ter([bcdfghjkpqstvxz])(er[bcdfghjklmnpqrstvwxyz])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule35 = function (word) {
// Push rule 35
const disambiguateRules = []
disambiguateRules.push(disambiguateRule35)
return runDisambiguator(disambiguateRules, word)
}
// RULE 36
function disambiguateRule36 (word) {
// Rule 36 : peC1erC2 -> pe-C1erC2 where C1 != {r|w|y|l|m|n}
const matches = word.match(/^pe([bcdfghjkpqstvxz])(er[bcdfghjklmnpqrstvwxyz])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule36 = function (word) {
// Push rule 36
const disambiguateRules = []
disambiguateRules.push(disambiguateRule36)
return runDisambiguator(disambiguateRules, word)
}
// RULE 37
function disambiguateRule37a (word) {
// Rule 37a : CerV -> CerV
const matches = word.match(/^([bcdfghjklmnpqrstvwxyz])(er[aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
function disambiguateRule37b (word) {
// Rule 37b : CerV -> CV
const matches = word.match(/^([bcdfghjklmnpqrstvwxyz])er([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule37 = function (word) {
// Push rule 37
const disambiguateRules = []
disambiguateRules.push(disambiguateRule37a)
disambiguateRules.push(disambiguateRule37b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 38
function disambiguateRule38a (word) {
// Rule 38a : CelV -> CelV
const matches = word.match(/^([bcdfghjklmnpqrstvwxyz])(el[aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
function disambiguateRule38b (word) {
// Rule 38b : CelV -> CV
const matches = word.match(/^([bcdfghjklmnpqrstvwxyz])el([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule38 = function (word) {
// Push rule 38
const disambiguateRules = []
disambiguateRules.push(disambiguateRule38a)
disambiguateRules.push(disambiguateRule38b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 39
function disambiguateRule39a (word) {
// Rule 39a : CemV -> CemV
const matches = word.match(/^([bcdfghjklmnpqrstvwxyz])(em[aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
function disambiguateRule39b (word) {
// Rule 39b : CemV -> CV
const matches = word.match(/^([bcdfghjklmnpqrstvwxyz])em([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule39 = function (word) {
// Push rule 39
const disambiguateRules = []
disambiguateRules.push(disambiguateRule39a)
disambiguateRules.push(disambiguateRule39b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 40
function disambiguateRule40a (word) {
// Rule 40a : CinV -> CinV
const matches = word.match(/^([bcdfghjklmnpqrstvwxyz])(in[aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
function disambiguateRule40b (word) {
// Rule 40b : CinV -> CV
const matches = word.match(/^([bcdfghjklmnpqrstvwxyz])in([aiueo])(.*)$/)
if (matches) {
return matches[1] + matches[2] + matches[3]
}
}
PrefixRules.DisambiguatorPrefixRule40 = function (word) {
// Push rule 40
const disambiguateRules = []
disambiguateRules.push(disambiguateRule40a)
disambiguateRules.push(disambiguateRule40b)
return runDisambiguator(disambiguateRules, word)
}
// RULE 41
function disambiguateRule41 (word) {
// Rule 41 : kuA -> ku-A
const matches = word.match(/^ku(.*)$/)
if (matches) {
return matches[1]
}
}
PrefixRules.DisambiguatorPrefixRule41 = function (word) {
// Push rule 41
const disambiguateRules = []
disambiguateRules.push(disambiguateRule41)
return runDisambiguator(disambiguateRules, word)
}
// RULE 42
function disambiguateRule42 (word) {
// Rule 42 : kauA -> kau-A
const matches = word.match(/^kau(.*)$/)
if (matches) {
return matches[1]
}
}
PrefixRules.DisambiguatorPrefixRule42 = function (word) {
// Push rule 42
const disambiguateRules = []
disambiguateRules.push(disambiguateRule42)
return runDisambiguator(disambiguateRules, word)
}
}
module.exports = PrefixRules
// Initalize prefix rules array
const rules = []
const pr = new PrefixRules()
// Push all rules
rules.push(pr.RemovePlainPrefix)
rules.push(pr.DisambiguatorPrefixRule1)
rules.push(pr.DisambiguatorPrefixRule2)
rules.push(pr.DisambiguatorPrefixRule3)
rules.push(pr.DisambiguatorPrefixRule4)
rules.push(pr.DisambiguatorPrefixRule5)
rules.push(pr.DisambiguatorPrefixRule6)
rules.push(pr.DisambiguatorPrefixRule7)
rules.push(pr.DisambiguatorPrefixRule8)
rules.push(pr.DisambiguatorPrefixRule9)
rules.push(pr.DisambiguatorPrefixRule10)
rules.push(pr.DisambiguatorPrefixRule11)
rules.push(pr.DisambiguatorPrefixRule12)
rules.push(pr.DisambiguatorPrefixRule13)
rules.push(pr.DisambiguatorPrefixRule14)
rules.push(pr.DisambiguatorPrefixRule15)
rules.push(pr.DisambiguatorPrefixRule16)
rules.push(pr.DisambiguatorPrefixRule17)
rules.push(pr.DisambiguatorPrefixRule18)
rules.push(pr.DisambiguatorPrefixRule19)
rules.push(pr.DisambiguatorPrefixRule20)
rules.push(pr.DisambiguatorPrefixRule21)
rules.push(pr.DisambiguatorPrefixRule23)
rules.push(pr.DisambiguatorPrefixRule24)
rules.push(pr.DisambiguatorPrefixRule25)
rules.push(pr.DisambiguatorPrefixRule26)
rules.push(pr.DisambiguatorPrefixRule27)
rules.push(pr.DisambiguatorPrefixRule28)
rules.push(pr.DisambiguatorPrefixRule29)
rules.push(pr.DisambiguatorPrefixRule30)
rules.push(pr.DisambiguatorPrefixRule31)
rules.push(pr.DisambiguatorPrefixRule32)
rules.push(pr.DisambiguatorPrefixRule34)
rules.push(pr.DisambiguatorPrefixRule35)
rules.push(pr.DisambiguatorPrefixRule36)
rules.push(pr.DisambiguatorPrefixRule37)
rules.push(pr.DisambiguatorPrefixRule38)
rules.push(pr.DisambiguatorPrefixRule39)
rules.push(pr.DisambiguatorPrefixRule40)
rules.push(pr.DisambiguatorPrefixRule41)
rules.push(pr.DisambiguatorPrefixRule42)
PrefixRules.rules = rules