sastrawi-ruby 0.2.0 → 0.3.0

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/MILESTONES.md +12 -0
  4. data/data/base-word.txt +17 -1
  5. data/data/stop-words.txt +842 -0
  6. data/lib/sastrawi/dictionary/array_dictionary.rb +19 -6
  7. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule10.rb +2 -0
  8. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule11.rb +2 -0
  9. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule12.rb +2 -0
  10. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule13a.rb +2 -0
  11. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule13b.rb +2 -0
  12. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule14.rb +2 -0
  13. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule15a.rb +2 -0
  14. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule15b.rb +2 -0
  15. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule16.rb +2 -0
  16. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule17a.rb +2 -0
  17. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule17b.rb +2 -0
  18. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule17c.rb +2 -0
  19. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule17d.rb +2 -0
  20. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule18a.rb +2 -0
  21. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule18b.rb +2 -0
  22. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule19.rb +2 -0
  23. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule1a.rb +2 -0
  24. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule1b.rb +2 -0
  25. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule2.rb +2 -0
  26. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule20.rb +2 -0
  27. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule21a.rb +2 -0
  28. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule21b.rb +2 -0
  29. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule23.rb +2 -0
  30. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule24.rb +2 -0
  31. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule25.rb +2 -0
  32. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule26a.rb +2 -0
  33. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule26b.rb +2 -0
  34. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule27.rb +2 -0
  35. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule28a.rb +2 -0
  36. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule28b.rb +2 -0
  37. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule29.rb +2 -0
  38. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule3.rb +2 -0
  39. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule30a.rb +2 -0
  40. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule30b.rb +2 -0
  41. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule30c.rb +2 -0
  42. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule31a.rb +2 -0
  43. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule31b.rb +2 -0
  44. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule32.rb +2 -0
  45. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule34.rb +2 -0
  46. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule35.rb +2 -0
  47. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule36.rb +2 -0
  48. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule37a.rb +2 -0
  49. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule37b.rb +2 -0
  50. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule38a.rb +2 -0
  51. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule38b.rb +2 -0
  52. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule39a.rb +2 -0
  53. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule39b.rb +2 -0
  54. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule4.rb +2 -0
  55. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule40a.rb +2 -0
  56. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule40b.rb +2 -0
  57. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule41.rb +2 -0
  58. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule42.rb +2 -0
  59. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule5.rb +2 -0
  60. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule6a.rb +2 -0
  61. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule6b.rb +2 -0
  62. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule7.rb +2 -0
  63. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule8.rb +2 -0
  64. data/lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule9.rb +2 -0
  65. data/lib/sastrawi/morphology/invalid_affix_pair_specification.rb +2 -0
  66. data/lib/sastrawi/stemmer/cache/array_cache.rb +40 -5
  67. data/lib/sastrawi/stemmer/cached_stemmer.rb +8 -0
  68. data/lib/sastrawi/stemmer/confix_stripping/precedence_adjustment_specification.rb +2 -0
  69. data/lib/sastrawi/stemmer/context/context.rb +3 -5
  70. data/lib/sastrawi/stemmer/context/removal.rb +2 -0
  71. data/lib/sastrawi/stemmer/context/visitor/dont_stem_short_word.rb +2 -0
  72. data/lib/sastrawi/stemmer/context/visitor/prefix_disambiguator.rb +2 -0
  73. data/lib/sastrawi/stemmer/context/visitor/remove_derivational_suffix.rb +2 -0
  74. data/lib/sastrawi/stemmer/context/visitor/remove_inflectional_particle.rb +2 -0
  75. data/lib/sastrawi/stemmer/context/visitor/remove_inflectional_possessive_pronoun.rb +2 -0
  76. data/lib/sastrawi/stemmer/context/visitor/remove_plain_prefix.rb +2 -0
  77. data/lib/sastrawi/stemmer/context/visitor/visitor_provider.rb +2 -0
  78. data/lib/sastrawi/stemmer/filter/text_normalizer.rb +10 -0
  79. data/lib/sastrawi/stemmer/stemmer.rb +10 -0
  80. data/lib/sastrawi/stemmer/stemmer_factory.rb +2 -0
  81. data/lib/sastrawi/stop_word_remover/stop_word_remover.rb +4 -0
  82. data/lib/sastrawi/stop_word_remover/stop_word_remover_factory.rb +19 -107
  83. data/lib/sastrawi/version.rb +1 -1
  84. data/lib/sastrawi.rb +2 -0
  85. metadata +3 -1
@@ -1,8 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Sastrawi
2
4
  module Stemmer
3
5
  module Filter
4
6
  class TextNormalizer
5
7
  def self.normalize_text(text)
8
+ return "" if text.nil?
9
+
10
+ unless text.is_a?(String)
11
+ raise ArgumentError, "expected a String, got #{text.class}"
12
+ end
13
+
14
+ return "" if text.empty?
15
+
6
16
  lowercase_text = text.downcase
7
17
  replaced_text = lowercase_text.gsub(/[^a-z0-9 -]/im, ' ')
8
18
  replaced_text = replaced_text.gsub(/( +)/im, ' ')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sastrawi/stemmer/context/context'
2
4
 
3
5
  require 'sastrawi/stemmer/context/visitor/visitor_provider'
@@ -24,6 +26,8 @@ module Sastrawi
24
26
  def stem(text)
25
27
  normalized_text = Sastrawi::Stemmer::Filter::TextNormalizer.normalize_text(text)
26
28
 
29
+ return "" if normalized_text.empty?
30
+
27
31
  words = normalized_text.split(' ')
28
32
  stems = []
29
33
 
@@ -82,6 +86,12 @@ module Sastrawi
82
86
 
83
87
  if root_first_word == root_second_word
84
88
  root_first_word
89
+ elsif @dictionary.contains?(root_second_word)
90
+ # Handle partial/rhyming reduplication (bolak-balik, sayur-mayur, lauk-pauk)
91
+ # Prefer the second word's stem when it's a dictionary word
92
+ root_second_word
93
+ elsif @dictionary.contains?(root_first_word)
94
+ root_first_word
85
95
  else
86
96
  word
87
97
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sastrawi/dictionary/array_dictionary'
2
4
 
3
5
  require 'sastrawi/stemmer/cached_stemmer'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Sastrawi
2
4
  module StopWordRemover
3
5
  class StopWordRemover
@@ -11,6 +13,8 @@ module Sastrawi
11
13
  # Remove stop words
12
14
 
13
15
  def remove(text)
16
+ return "" if text.nil? || text.empty?
17
+
14
18
  words = text.split(' ')
15
19
  stop_words = []
16
20
 
@@ -1,123 +1,35 @@
1
- require 'sastrawi/dictionary/array_dictionary'
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'sastrawi/dictionary/array_dictionary'
3
4
  require 'sastrawi/stop_word_remover/stop_word_remover'
4
5
 
5
6
  module Sastrawi
6
7
  module StopWordRemover
7
8
  class StopWordRemoverFactory
9
+ STOP_WORDS_FILE = File.join(File.dirname(__FILE__), '..', '..', '..', 'data', 'stop-words.txt')
10
+
8
11
  def create_stop_word_remover
9
12
  stop_words = get_stop_word
10
-
11
13
  dictionary = Sastrawi::Dictionary::ArrayDictionary.new(stop_words)
12
- stop_word_remover = Sastrawi::StopWordRemover::StopWordRemover.new(dictionary)
13
-
14
- stop_word_remover
14
+ Sastrawi::StopWordRemover::StopWordRemover.new(dictionary)
15
15
  end
16
16
 
17
17
  def get_stop_word
18
- stop_words = %w[a ada adalah adanya adapun agak agaknya agar akan
19
- akankah akhir akhiri akhirnya aku akulah amat amatlah anda andalah
20
- antar antara antaranya apa apaan apabila apakah apalagi apatah arti
21
- artinya asal asalkan atas atau ataukah ataupun awal awalnya b bagai
22
- bagaikan bagaimana bagaimanakah bagaimanapun bagainamakah bagi bagian
23
- bahkan bahwa bahwasannya bahwasanya baik baiklah bakal bakalan balik
24
- banyak bapak baru bawah beberapa begini beginian beginikah beginilah
25
- begitu begitukah begitulah begitupun bekerja belakang belakangan
26
- belum belumlah benar benarkah benarlah berada berakhir berakhirlah
27
- berakhirnya berapa berapakah berapalah berapapun berarti berawal
28
- berbagai berdatangan beri berikan berikut berikutnya berjumlah
29
- berkali-kali berkata berkehendak berkeinginan berkenaan berlainan
30
- berlalu berlangsung berlebihan bermacam bermacam-macam bermaksud
31
- bermula bersama bersama-sama bersiap bersiap-siap bertanya
32
- bertanya-tanya berturut berturut-turut bertutur berujar berupa besar
33
- betul betulkah biasa biasanya bila bilakah bisa bisakah boleh bolehkah
34
- bolehlah buat bukan bukankah bukanlah bukannya bulan bung c cara
35
- caranya cukup cukupkah cukuplah cuma d dahulu dalam dan dapat dari
36
- daripada datang dekat demi demikian demikianlah dengan depan di dia
37
- diakhiri diakhirinya dialah diantara diantaranya diberi diberikan
38
- diberikannya dibuat dibuatnya didapat didatangkan digunakan
39
- diibaratkan diibaratkannya diingat diingatkan diinginkan dijawab
40
- dijelaskan dijelaskannya dikarenakan dikatakan dikatakannya dikerjakan
41
- diketahui diketahuinya dikira dilakukan dilalui dilihat dimaksud
42
- dimaksudkan dimaksudkannya dimaksudnya diminta dimintai dimisalkan
43
- dimulai dimulailah dimulainya dimungkinkan dini dipastikan diperbuat
44
- diperbuatnya dipergunakan diperkirakan diperlihatkan diperlukan
45
- diperlukannya dipersoalkan dipertanyakan dipunyai diri dirinya
46
- disampaikan disebut disebutkan disebutkannya disini disinilah
47
- ditambahkan ditandaskan ditanya ditanyai ditanyakan ditegaskan
48
- ditujukan ditunjuk ditunjuki ditunjukkan ditunjukkannya ditunjuknya
49
- dituturkan dituturkannya diucapkan diucapkannya diungkapkan dong dua
50
- dulu e empat enak enggak enggaknya entah entahlah f g guna gunakan h
51
- hadap hai hal halo hallo hampir hanya hanyalah hari harus haruslah
52
- harusnya helo hello hendak hendaklah hendaknya hingga i ia ialah
53
- ibarat ibaratkan ibaratnya ibu ikut ingat ingat-ingat ingin inginkah
54
- inginkan ini inikah inilah itu itukah itulah j jadi jadilah jadinya
55
- jangan jangankan janganlah jauh jawab jawaban jawabnya jelas jelaskan
56
- jelaslah jelasnya jika jikalau juga jumlah jumlahnya justru k kadar
57
- kala kalau kalaulah kalaupun kali kalian kami kamilah kamu kamulah kan
58
- kapan kapankah kapanpun karena karenanya kasus kata katakan katakanlah
59
- katanya ke keadaan kebetulan kecil kedua keduanya keinginan kelamaan
60
- kelihatan kelihatannya kelima keluar kembali kemudian kemungkinan
61
- kemungkinannya kena kenapa kepada kepadanya kerja kesampaian
62
- keseluruhan keseluruhannya keterlaluan ketika khusus khususnya kini
63
- kinilah kira kira-kira kiranya kita kitalah kok kurang l lagi lagian
64
- lah lain lainnya laku lalu lama lamanya langsung lanjut lanjutnya
65
- lebih lewat lihat lima luar m macam maka makanya makin maksud malah
66
- malahan mampu mampukah mana manakala manalagi masa masalah masalahnya
67
- masih masihkah masing masing-masing masuk mata mau maupun melainkan
68
- melakukan melalui melihat melihatnya memang memastikan memberi
69
- memberikan membuat memerlukan memihak meminta memintakan memisalkan
70
- memperbuat mempergunakan memperkirakan memperlihatkan mempersiapkan
71
- mempersoalkan mempertanyakan mempunyai memulai memungkinkan menaiki
72
- menambahkan menandaskan menanti menanti-nanti menantikan menanya
73
- menanyai menanyakan mendapat mendapatkan mendatang mendatangi
74
- mendatangkan menegaskan mengakhiri mengapa mengatakan mengatakannya
75
- mengenai mengerjakan mengetahui menggunakan menghendaki mengibaratkan
76
- mengibaratkannya mengingat mengingatkan menginginkan mengira
77
- mengucapkan mengucapkannya mengungkapkan menjadi menjawab menjelaskan
78
- menuju menunjuk menunjuki menunjukkan menunjuknya menurut menuturkan
79
- menyampaikan menyangkut menyatakan menyebutkan menyeluruh menyiapkan
80
- merasa mereka merekalah merupakan meski meskipun meyakini meyakinkan
81
- minta mirip misal misalkan misalnya mohon mula mulai mulailah mulanya
82
- mungkin mungkinkah n nah naik namun nanti nantinya nya nyaris nyata
83
- nyatanya o oleh olehnya orang p pada padahal padanya pak paling
84
- panjang pantas para pasti pastilah penting pentingnya per percuma
85
- perlu perlukah perlunya pernah persoalan pertama pertama-tama
86
- pertanyaan pertanyakan pihak pihaknya pukul pula pun punya q r rasa
87
- rasanya rupa rupanya s saat saatnya saja sajalah salam saling sama
88
- sama-sama sambil sampai sampai-sampai sampaikan sana sangat sangatlah
89
- sangkut satu saya sayalah se sebab sebabnya sebagai sebagaimana
90
- sebagainya sebagian sebaik sebaik-baiknya sebaiknya sebaliknya
91
- sebanyak sebegini sebegitu sebelum sebelumnya sebenarnya seberapa
92
- sebesar sebetulnya sebisanya sebuah sebut sebutlah sebutnya secara
93
- secukupnya sedang sedangkan sedemikian sedikit sedikitnya seenaknya
94
- segala segalanya segera seharusnya sehingga seingat sejak sejauh
95
- sejenak sejumlah sekadar sekadarnya sekali sekali-kali sekalian
96
- sekaligus sekalipun sekarang sekaranglah sekecil seketika sekiranya
97
- sekitar sekitarnya sekurang-kurangnya sekurangnya sela selain selaku
98
- selalu selama selama-lamanya selamanya selanjutnya seluruh seluruhnya
99
- semacam semakin semampu semampunya semasa semasih semata semata-mata
100
- semaunya sementara semisal semisalnya sempat semua semuanya semula
101
- sendiri sendirian sendirinya seolah seolah-olah seorang sepanjang
102
- sepantasnya sepantasnyalah seperlunya seperti sepertinya sepihak
103
- sering seringnya serta serupa sesaat sesama sesampai sesegera sesekali
104
- seseorang sesuatu sesuatunya sesudah sesudahnya setelah setempat
105
- setengah seterusnya setiap setiba setibanya setidak-tidaknya
106
- setidaknya setinggi seusai sewaktu siap siapa siapakah siapapun sini
107
- sinilah soal soalnya suatu sudah sudahkah sudahlah supaya t tadi
108
- tadinya tahu tak tambah tambahnya tampak tampaknya tandas tandasnya
109
- tanpa tanya tanyakan tanyanya tapi tegas tegasnya telah tempat tentang
110
- tentu tentulah tentunya tepat terakhir terasa terbanyak terdahulu
111
- terdapat terdiri terhadap terhadapnya teringat teringat-ingat terjadi
112
- terjadilah terjadinya terkira terlalu terlebih terlihat termasuk
113
- ternyata tersampaikan tersebut tersebutlah tertentu tertuju terus
114
- terutama tetap tetapi tiap tiba tiba-tiba tidak tidakkah tidaklah tiga
115
- toh tuju tunjuk turut tutur tuturnya u ucap ucapnya ujar ujarnya
116
- umumnya ungkap ungkapnya untuk usah usai v w waduh wah wahai waktunya
117
- walau walaupun wong x y ya yaitu yakin yakni yang z
118
- ]
18
+ if File.exist?(STOP_WORDS_FILE)
19
+ File.readlines(STOP_WORDS_FILE, chomp: true).reject(&:empty?)
20
+ else
21
+ default_stop_words
22
+ end
23
+ end
24
+
25
+ private
119
26
 
120
- stop_words
27
+ def default_stop_words
28
+ %w[yang dan di ini itu dengan untuk dari pada adalah ke
29
+ tidak ada juga akan tetapi oleh atau sudah saya kami
30
+ mereka dia ia anda kita bisa harus lebih sangat
31
+ telah belum masih sedang bahwa karena jika maka
32
+ saat ketika setelah sebelum antara namun walau meski]
121
33
  end
122
34
  end
123
35
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sastrawi
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/sastrawi.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sastrawi/version'
2
4
 
3
5
  require 'sastrawi/stemmer/stemmer_factory'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sastrawi-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johannes Dwi Cahyo
@@ -67,11 +67,13 @@ files:
67
67
  - CONTRIBUTING.md
68
68
  - Gemfile
69
69
  - LICENSE.txt
70
+ - MILESTONES.md
70
71
  - README.md
71
72
  - Rakefile
72
73
  - _config.yml
73
74
  - bin/sastrawi
74
75
  - data/base-word.txt
76
+ - data/stop-words.txt
75
77
  - lib/sastrawi.rb
76
78
  - lib/sastrawi/dictionary/array_dictionary.rb
77
79
  - lib/sastrawi/morphology/disambiguator/disambiguator_prefix_rule10.rb