natural 0.5.6 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/.dockerignore +2 -0
  2. package/.idea/misc.xml +6 -0
  3. package/.idea/modules.xml +8 -0
  4. package/.idea/natural.iml +12 -0
  5. package/.idea/vcs.xml +6 -0
  6. package/.idea/workspace.xml +511 -0
  7. package/.travis.yml +8 -1
  8. package/README.md +331 -40
  9. package/bayes_classifier.json +1 -1
  10. package/classifier.json +418 -0
  11. package/lib/natural/brill_pos_tagger/lib/Brill_POS_Tagger.js +8 -9
  12. package/lib/natural/brill_pos_tagger/lib/Brill_POS_Tester.js +5 -5
  13. package/lib/natural/brill_pos_tagger/lib/Brill_POS_Trainer.js +10 -6
  14. package/lib/natural/brill_pos_tagger/lib/Corpus.js +21 -16
  15. package/lib/natural/brill_pos_tagger/lib/Lexicon.js +22 -13
  16. package/lib/natural/brill_pos_tagger/lib/Predicate.js +2 -2
  17. package/lib/natural/brill_pos_tagger/lib/RuleTemplate.js +2 -2
  18. package/lib/natural/brill_pos_tagger/lib/RuleTemplates.js +132 -146
  19. package/lib/natural/brill_pos_tagger/lib/Sentence.js +41 -0
  20. package/lib/natural/brill_pos_tagger/lib/TransformationRule.js +10 -11
  21. package/lib/natural/classifiers/classifier.js +5 -3
  22. package/lib/natural/classifiers/maxent/Classifier.js +125 -0
  23. package/lib/natural/classifiers/maxent/Context.js +33 -0
  24. package/lib/natural/classifiers/maxent/Distribution.js +145 -0
  25. package/lib/natural/classifiers/maxent/Element.js +34 -0
  26. package/lib/natural/classifiers/maxent/Feature.js +88 -0
  27. package/lib/natural/classifiers/maxent/FeatureSet.js +67 -0
  28. package/lib/natural/classifiers/maxent/GISScaler.js +148 -0
  29. package/lib/natural/classifiers/maxent/POS/ME_Corpus.js +56 -0
  30. package/lib/natural/classifiers/maxent/POS/ME_Sentence.js +73 -0
  31. package/lib/natural/classifiers/maxent/POS/POS_Element.js +172 -0
  32. package/lib/natural/classifiers/maxent/Sample.js +141 -0
  33. package/lib/natural/classifiers/maxent/SimpleExample/SE_Element.js +49 -0
  34. package/lib/natural/distance/hamming_distance.js +52 -0
  35. package/lib/natural/distance/jaro-winkler_distance.js +16 -6
  36. package/lib/natural/distance/levenshtein_distance.js +2 -2
  37. package/lib/natural/index.js +21 -2
  38. package/lib/natural/inflectors/noun_inflector.js +5 -3
  39. package/lib/natural/ngrams/ngrams.js +83 -25
  40. package/lib/natural/sentiment/Basque/senticon_eu.json +21557 -0
  41. package/lib/natural/sentiment/Catalan/senticon_ca.json +36352 -0
  42. package/lib/natural/sentiment/Dutch/negations_du.json +3 -0
  43. package/lib/natural/sentiment/Dutch/pattern-sentiment-nl.json +39650 -0
  44. package/lib/natural/sentiment/English/negations_en.json +3 -0
  45. package/lib/natural/sentiment/English/pattern-sentiment-en.json +16024 -0
  46. package/lib/natural/sentiment/English/senticon_en.json +124197 -0
  47. package/lib/natural/sentiment/French/pattern-sentiment-fr.json +40906 -0
  48. package/lib/natural/sentiment/Galician/senticon_gl.json +24427 -0
  49. package/lib/natural/sentiment/Italian/pattern-sentiment-it.json +24522 -0
  50. package/lib/natural/sentiment/SentimentAnalyzer.js +116 -0
  51. package/lib/natural/sentiment/Spanish/afinnShortSortedSpanish.json +1655 -0
  52. package/lib/natural/sentiment/Spanish/negations_es.json +3 -0
  53. package/lib/natural/sentiment/Spanish/senticon_es.json +56722 -0
  54. package/lib/natural/sentiment/tools/README.md +31 -0
  55. package/lib/natural/sentiment/tools/XmlParser4PatternData.js +31 -0
  56. package/lib/natural/sentiment/tools/sentimentXmlParser.js +30 -0
  57. package/lib/natural/stemmers/indonesian/data/kata-dasar.json +29935 -0
  58. package/lib/natural/stemmers/indonesian/prefix_rules.js +10 -9
  59. package/lib/natural/stemmers/indonesian/stemmer_id.js +16 -15
  60. package/lib/natural/stemmers/indonesian/suffix_rules.js +2 -2
  61. package/lib/natural/stemmers/porter_stemmer_es.js +265 -199
  62. package/lib/natural/stemmers/porter_stemmer_fr.js +1 -1
  63. package/lib/natural/stemmers/porter_stemmer_nl.js +362 -0
  64. package/lib/natural/stemmers/stemmer_es.js +18 -12
  65. package/lib/natural/stemmers/stemmer_nl.js +64 -0
  66. package/lib/natural/tfidf/tfidf.js +27 -4
  67. package/lib/natural/tokenizers/aggressive_tokenizer_sv.js +1 -1
  68. package/lib/natural/tokenizers/aggressive_tokenizer_vi.js +37 -0
  69. package/lib/natural/tokenizers/orthography_matchers.js +33 -0
  70. package/lib/natural/tokenizers/regexp_tokenizer.js +24 -4
  71. package/lib/natural/tokenizers/sentence_tokenizer.js +1 -1
  72. package/lib/natural/wordnet/wordnet_file.js +7 -1
  73. package/lr_classifier.json +1 -1
  74. package/package.json +35 -23
  75. package/.npmignore +0 -4
  76. package/.vscode/temp.sql +0 -0
  77. package/Makefile +0 -38
  78. package/data/kata-dasar.txt +0 -29933
  79. package/package-lock.json +0 -79
  80. package/tests/stemmer_id_test.js +0 -361
package/package-lock.json DELETED
@@ -1,79 +0,0 @@
1
- {
2
- "name": "natural",
3
- "version": "0.5.4",
4
- "lockfileVersion": 1,
5
- "requires": true,
6
- "dependencies": {
7
- "apparatus": {
8
- "version": "0.0.9",
9
- "resolved": "https://registry.npmjs.org/apparatus/-/apparatus-0.0.9.tgz",
10
- "integrity": "sha1-N9zSWDStC2UQdllikduCPusZCL0=",
11
- "requires": {
12
- "sylvester": "0.0.21"
13
- }
14
- },
15
- "assertion-error": {
16
- "version": "1.0.2",
17
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
18
- "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
19
- "dev": true
20
- },
21
- "chai": {
22
- "version": "4.1.2",
23
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
24
- "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
25
- "dev": true,
26
- "requires": {
27
- "assertion-error": "1.0.2",
28
- "check-error": "1.0.2",
29
- "deep-eql": "3.0.1",
30
- "get-func-name": "2.0.0",
31
- "pathval": "1.1.0",
32
- "type-detect": "4.0.3"
33
- }
34
- },
35
- "check-error": {
36
- "version": "1.0.2",
37
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
38
- "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
39
- "dev": true
40
- },
41
- "deep-eql": {
42
- "version": "3.0.1",
43
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
44
- "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
45
- "dev": true,
46
- "requires": {
47
- "type-detect": "4.0.3"
48
- }
49
- },
50
- "get-func-name": {
51
- "version": "2.0.0",
52
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
53
- "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
54
- "dev": true
55
- },
56
- "pathval": {
57
- "version": "1.1.0",
58
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
59
- "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
60
- "dev": true
61
- },
62
- "sylvester": {
63
- "version": "0.0.21",
64
- "resolved": "https://registry.npmjs.org/sylvester/-/sylvester-0.0.21.tgz",
65
- "integrity": "sha1-KYexzivS84sNzio0OIiEv6RADqc="
66
- },
67
- "type-detect": {
68
- "version": "4.0.3",
69
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz",
70
- "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=",
71
- "dev": true
72
- },
73
- "underscore": {
74
- "version": "1.8.3",
75
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
76
- "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
77
- }
78
- }
79
- }
@@ -1,361 +0,0 @@
1
- /*
2
- THIS TEST REQUIRE CHAI AND MOCHA
3
- install chai --> npm install chai --save-dev
4
- install mocha --> npm install mocha -g
5
- to run --> mocha tests --watch
6
- */
7
- var chai = require('chai');
8
- var expect = chai.expect; // we are using the "expect" style of Chai
9
-
10
- var natural = require('../lib/natural/');
11
- var Stemmer = natural.StemmerId;
12
-
13
- var data = []
14
-
15
- // THE TESTCASES
16
- // don't stem short words
17
- data.push(['mei', 'mei'])
18
- data.push(['bui', 'bui'])
19
-
20
- // lookup up the dictionary, to prevent overstemming
21
- // don't stem nilai to nila
22
- data.push(['nilai', 'nilai'])
23
-
24
- // lah|kah|tah|pun
25
- data.push(['hancurlah', 'hancur'])
26
- data.push(['benarkah', 'benar'])
27
- data.push(['apatah', 'apa'])
28
- data.push(['siapapun', 'siapa'])
29
-
30
- // ku|mu|nya
31
- data.push(['jubahku', 'jubah'])
32
- data.push(['bajumu', 'baju'])
33
- data.push(['celananya', 'celana'])
34
-
35
- // i|kan|an
36
- data.push(['hantui', 'hantu'])
37
- data.push(['belikan', 'beli'])
38
- data.push(['jualan', 'jual'])
39
-
40
- // combination of suffixes
41
- data.push(['bukumukah', 'buku']) //gagal karena -ku dianggap suffix dan dihilangkan
42
- data.push(['miliknyalah', 'milik'])
43
- data.push(['kulitkupun', 'kulit']) //gagal karena -ku dianggap suffix dan dihilangkan
44
- data.push(['berikanku', 'beri'])
45
- data.push(['sakitimu', 'sakit'])
46
- data.push(['beriannya', 'beri'])
47
- data.push(['kasihilah', 'kasih'])
48
-
49
- // plain prefix
50
- data.push(['dibuang', 'buang'])
51
- data.push(['kesakitan', 'sakit'])
52
- data.push(['sesuap', 'suap'])
53
-
54
- //data.push(['teriakanmu', 'teriak']) // wtf? kok jadi ria?
55
- //teriakanmu -> te-ria-kan-mu
56
-
57
- // template formulas for derivation prefix rules (disambiguation) //
58
-
59
- // rule 1a : berV -> ber-V
60
- data.push(['beradu', 'adu'])
61
-
62
- // rule 1b : berV -> be-rV
63
- data.push(['berambut', 'rambut'])
64
-
65
- // rule 2 : berCAP -> ber-CAP
66
- data.push(['bersuara', 'suara'])
67
-
68
- // rule 3 : berCAerV -> ber-CAerV where C != 'r'
69
- data.push(['berdaerah', 'daerah'])
70
-
71
- // rule 4 : belajar -> bel-ajar
72
- data.push(['belajar', 'ajar'])
73
-
74
- // rule 5 : beC1erC2 -> be-C1erC2 where C1 != {'r'|'l'}
75
- data.push(['bekerja', 'kerja'])
76
- data.push(['beternak', 'ternak'])
77
-
78
- // rule 6a : terV -> ter-V
79
- data.push(['terasing', 'asing'])
80
-
81
- // rule 6b : terV -> te-rV
82
- data.push(['teraup', 'raup'])
83
-
84
- // rule 7 : terCerV -> ter-CerV where C != 'r'
85
- data.push(['tergerak', 'gerak'])
86
-
87
- // rule 8 : terCP -> ter-CP where C != 'r' and P != 'er'
88
- data.push(['terpuruk', 'puruk'])
89
-
90
- // rule 9 : teC1erC2 -> te-C1erC2 where C1 != 'r'
91
- data.push(['teterbang', 'terbang'])
92
-
93
- // rule 10 : me{l|r|w|y}V -> me-{l|r|w|y}V
94
- data.push(['melipat', 'lipat'])
95
- data.push(['meringkas', 'ringkas'])
96
- data.push(['mewarnai', 'warna'])
97
- data.push(['meyakinkan', 'yakin'])
98
-
99
- // rule 11 : mem{b|f|v} -> mem-{b|f|v}
100
- data.push(['membangun', 'bangun'])
101
- data.push(['memfitnah', 'fitnah'])
102
- data.push(['memvonis', 'vonis'])
103
-
104
- // rule 12 : mempe{r|l} -> mem-pe
105
- data.push(['memperbarui', 'baru'])
106
- data.push(['mempelajari', 'ajar'])
107
-
108
- // rule 13a : mem{rV|V} -> mem{rV|V}
109
- data.push(['meminum', 'minum'])
110
-
111
- // rule 13b : mem{rV|V} -> me-p{rV|V}
112
- data.push(['memukul', 'pukul'])
113
-
114
- // rule 14 : men{c|d|j|z} -> men-{c|d|j|z}
115
- data.push(['mencinta', 'cinta'])
116
- data.push(['mendua', 'dua'])
117
- data.push(['menjauh', 'jauh'])
118
- data.push(['menziarah', 'ziarah'])
119
-
120
- // rule 15a : men{V} -> me-n{V}
121
- data.push(['menuklir', 'nuklir'])
122
-
123
- // rule 15b : men{V} -> me-t{V}
124
- data.push(['menangkap', 'tangkap'])
125
-
126
- // rule 16 : meng{g|h|q} -> meng-{g|h|q}
127
- data.push(['menggila', 'gila'])
128
- data.push(['menghajar', 'hajar'])
129
- data.push(['mengqasar', 'qasar'])
130
-
131
- // rule 17a : mengV -> meng-V
132
- data.push(['mengudara', 'udara'])
133
-
134
- // rule 17b : mengV -> meng-kV
135
- data.push(['mengupas', 'kupas'])
136
-
137
- // rule 18 : menyV -> meny-sV
138
- data.push(['menyuarakan', 'suara'])
139
-
140
- // rule 19 : mempV -> mem-pV where V != 'e'
141
- data.push(['mempopulerkan', 'populer'])
142
-
143
- // rule 20 : pe{w|y}V -> pe-{w|y}V
144
- data.push(['pewarna', 'warna'])
145
- data.push(['peyoga', 'yoga'])
146
-
147
- // rule 21a : perV -> per-V
148
- data.push(['peradilan', 'adil'])
149
-
150
- // rule 21b : perV -> pe-rV
151
- data.push(['perumahan', 'rumah'])
152
-
153
- // rule 22 is missing in the document?
154
-
155
- // rule 23 : perCAP -> per-CAP where C != 'r' and P != 'er'
156
- data.push(['permuka', 'muka'])
157
-
158
- // rule 24 : perCAerV -> per-CAerV where C != 'r'
159
- data.push(['perdaerah', 'daerah'])
160
-
161
- // rule 25 : pem{b|f|v} -> pem-{b|f|v}
162
- data.push(['pembangun', 'bangun'])
163
- data.push(['pemfitnah', 'fitnah'])
164
- data.push(['pemvonis', 'vonis'])
165
-
166
- // rule 26a : pem{rV|V} -> pe-m{rV|V}
167
- data.push(['peminum', 'minum'])
168
-
169
- // rule 26b : pem{rV|V} -> pe-p{rV|V}
170
- data.push(['pemukul', 'pukul'])
171
-
172
- // rule 27 : men{c|d|j|z} -> men-{c|d|j|z}
173
- data.push(['pencinta', 'cinta'])
174
- data.push(['pendahulu', 'dahulu'])
175
- data.push(['penjarah', 'jarah'])
176
- data.push(['penziarah', 'ziarah'])
177
-
178
- // rule 28a : pen{V} -> pe-n{V}
179
- data.push(['penasihat', 'nasihat'])
180
-
181
- // rule 28b : pen{V} -> pe-t{V}
182
- data.push(['penangkap', 'tangkap'])
183
-
184
- // rule 29 : peng{g|h|q} -> peng-{g|h|q}
185
- data.push(['penggila', 'gila'])
186
- data.push(['penghajar', 'hajar'])
187
- data.push(['pengqasar', 'qasar'])
188
-
189
- // rule 30a : pengV -> peng-V
190
- data.push(['pengudara', 'udara'])
191
-
192
- // rule 30b : pengV -> peng-kV
193
- data.push(['pengupas', 'kupas'])
194
-
195
- // rule 31 : penyV -> peny-sV
196
- data.push(['penyuara', 'suara'])
197
-
198
- // rule 32 : pelV -> pe-lV except pelajar -> ajar
199
- data.push(['pelajar', 'ajar'])
200
- data.push(['pelabuhan', 'labuh'])
201
-
202
- // rule 33 : peCerV -> per-erV where C != {r|w|y|l|m|n}
203
- // TODO : find the examples
204
-
205
- // rule 34 : peCP -> pe-CP where C != {r|w|y|l|m|n} and P != 'er'
206
- data.push(['petarung', 'tarung'])
207
-
208
- // CS additional rules
209
-
210
- // rule 35 : terC1erC2 -> ter-C1erC2 where C1 != 'r'
211
- data.push(['terpercaya', 'percaya'])
212
-
213
- // rule 36 : peC1erC2 -> pe-C1erC2 where C1 != {r|w|y|l|m|n}
214
- data.push(['pekerja', 'kerja'])
215
- data.push(['peserta', 'serta'])
216
-
217
- // CS modify rule 12
218
- data.push(['mempengaruhi', 'pengaruh'])
219
-
220
- // CS modify rule 16
221
- data.push(['mengkritik', 'kritik'])
222
-
223
- // CS adjusting rule precedence
224
- data.push(['bersekolah', 'sekolah']) //gagal sekolah -> seko why?
225
- data.push(['bertahan', 'tahan'])
226
- data.push(['mencapai', 'capai']) //gagal mencapai -> capa
227
- data.push(['dimulai', 'mulai'])
228
- data.push(['petani', 'tani']) //gagal petani -> petan
229
- data.push(['terabai', 'abai']) //gagal terabai -> aba
230
-
231
- // ECS
232
- data.push(['mensyaratkan', 'syarat'])
233
- data.push(['mensyukuri', 'syukur'])
234
- data.push(['mengebom', 'bom'])
235
- data.push(['mempromosikan', 'promosi'])
236
- data.push(['memproteksi', 'proteksi'])
237
- data.push(['memprediksi', 'prediksi'])
238
- data.push(['pengkajian', 'kaji'])
239
- data.push(['pengebom', 'bom'])
240
-
241
- // ECS loop pengembalian akhiran
242
- data.push(['bersembunyi', 'sembunyi'])
243
- data.push(['bersembunyilah', 'sembunyi'])
244
- data.push(['pelanggan', 'langgan'])
245
- data.push(['pelaku', 'laku'])
246
- data.push(['pelangganmukah', 'langgan'])
247
- data.push(['pelakunyalah', 'laku'])
248
-
249
- data.push(['perbaikan', 'baik'])
250
- data.push(['kebaikannya', 'baik'])
251
- data.push(['bisikan', 'bisik'])
252
- data.push(['menerangi', 'terang'])
253
- data.push(['berimanlah', 'iman'])
254
-
255
- data.push(['memuaskan', 'puas'])
256
- data.push(['berpelanggan', 'langgan'])
257
- data.push(['bermakanan', 'makan'])
258
-
259
- // CC (Modified ECS)
260
- data.push(['menyala', 'nyala'])
261
- data.push(['menyanyikan', 'nyanyi'])
262
- data.push(['menyatakannya', 'nyata'])
263
-
264
- data.push(['penyanyi', 'nyanyi'])
265
- data.push(['penyawaan', 'nyawa'])
266
-
267
- // CC infix
268
- data.push(['rerata', 'rata'])
269
- data.push(['lelembut', 'lembut'])
270
- data.push(['lemigas', 'ligas'])
271
- data.push(['kinerja', 'kerja'])
272
-
273
- // plurals
274
- data.push(['buku-buku', 'buku'])
275
- data.push(['berbalas-balasan', 'balas'])
276
- data.push(['bolak-balik', 'bolak-balik'])
277
-
278
- // combination of prefix + suffix
279
- data.push(['bertebaran', 'tebar'])
280
- data.push(['terasingkan', 'asing'])
281
- data.push(['membangunkan', 'bangun'])
282
- data.push(['mencintai', 'cinta'])
283
- data.push(['menduakan', 'dua'])
284
- data.push(['menjauhi', 'jauh'])
285
- data.push(['menggilai', 'gila'])
286
- data.push(['pembangunan', 'bangun'])
287
-
288
- // return the word if not found in the dictionary
289
- data.push(['marwan', 'marwan'])
290
- data.push(['subarkah', 'subarkah'])
291
-
292
- // recursively remove prefix
293
- data.push(['memberdayakan', 'daya'])
294
- data.push(['persemakmuran', 'makmur'])
295
- data.push(['keberuntunganmu', 'untung'])
296
- data.push(['kesepersepuluhnya', 'sepuluh'])
297
-
298
- // test stem sentence
299
- data.push(['siapakah memberdayakan pembangunan', 'siapa daya bangun'])
300
-
301
- // issues
302
- data.push(['Perekonomian', 'ekonomi'])
303
- data.push(['menahan', 'tahan'])
304
-
305
- // test stem multiple sentences
306
- multipleSentence1 = 'Cinta telah bertebaran.Keduanya saling mencintai.';
307
- multipleSentence2 = "(Cinta telah bertebaran)\n\n\n\nKeduanya saling mencintai.";
308
- data.push([multipleSentence1, 'cinta telah tebar dua saling cinta'])
309
- data.push([multipleSentence2, 'cinta telah tebar dua saling cinta'])
310
-
311
- // failed on other method / algorithm but we should succeed
312
- data.push(['peranan', 'peran'])
313
- data.push(['memberikan', 'beri'])
314
- data.push(['medannya', 'medan'])
315
-
316
- // TODO:
317
- //data.push(['sebagai', 'bagai'])
318
- //data.push(['bagian', 'bagian'])
319
- //data.push(['berbadan', 'badan'])
320
- //data.push(['abdullah', 'abdullah'])
321
-
322
- // adopted foreign suffixes
323
- //data.push(['budayawan', 'budaya'])
324
- //data.push(['karyawati', 'karya'])
325
- data.push(['idealis', 'ideal'])
326
- data.push(['idealisme', 'ideal'])
327
- data.push(['finalisasi', 'final'])
328
-
329
- // sastrawi additional rules
330
- data.push(['penstabilan', 'stabil'])
331
- data.push(['pentranskripsi', 'transkripsi'])
332
-
333
- data.push(['mentaati', 'taat'])
334
- data.push(['meniru-nirukan', 'tiru'])
335
- data.push(['menyepak-nyepak', 'sepak'])
336
-
337
- data.push(['melewati', 'lewat'])
338
- data.push(['menganga', 'nganga'])
339
-
340
- data.push(['kupukul', 'pukul'])
341
- data.push(['kauhajar', 'hajar'])
342
-
343
- data.push(['kuasa-Mu', 'kuasa'])
344
- data.push(['malaikat-malaikat-Nya', 'malaikat'])
345
- data.push(['nikmat-Ku', 'nikmat'])
346
- data.push(['allah-lah', 'allah'])
347
-
348
-
349
- function mochaSyncTest(data, i){
350
- it("Stemming " + data[i][0] + " to " + data[i][1] , function() {
351
- var output = Stemmer.tokenizeAndStem(data[i][0]);
352
- output = output.join(" ");
353
- console.log(output);
354
- expect(output).to.equal(data[i][1]);
355
- });
356
- }
357
- for(var i in data){
358
- describe("tryStem-" + i, function() {
359
- mochaSyncTest(data, i);
360
- });
361
- }