twpipeline 0.1.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.
@@ -0,0 +1,228 @@
1
+ module TWPipeline
2
+ VERSION: String
3
+ ROOT: Pathname
4
+
5
+ type record = ::Hash[::Symbol, untyped]
6
+
7
+ class Error < ::StandardError
8
+ end
9
+
10
+ def self.resources: () -> Resources
11
+ def self.resources=: (Resources?) -> Resources?
12
+ def self.work: () -> Pathname
13
+ def self.data: (*::String parts) -> Pathname
14
+ def self.warm_up: () -> singleton(TWPipeline)
15
+
16
+ class Resources
17
+ UNITS: ::Hash[::String, ::Integer]
18
+ DEFAULT_SHARE: ::Float
19
+
20
+ attr_reader cores: ::Integer
21
+ attr_reader memory_bytes: ::Integer
22
+
23
+ def self.detect: (?cores: untyped, ?memory: untyped) -> Resources
24
+ def self.ask: (?io: ::IO, ?input: ::IO) -> Resources
25
+ def self.parse: (untyped value) -> ::Integer?
26
+ def self.total_memory: () -> ::Integer
27
+
28
+ def memory: () -> ::String
29
+ def sort_buffer: () -> ::String
30
+ def memory_per_worker_bytes: () -> ::Integer
31
+ def to_h: () -> ::Hash[::Symbol, untyped]
32
+ def to_s: () -> ::String
33
+ end
34
+
35
+ module Parallel
36
+ CHUNK_CAP: ::Integer
37
+ CHUNK_SHARE: ::Integer
38
+ LINE_CAP: ::Integer
39
+
40
+ def self?.map: [T, R] (::Enumerable[T], ?workers: ::Integer) { (T) -> R } -> ::Array[R]
41
+ def self?.fold: [T, R] (::Enumerable[T], ?workers: ::Integer) { (::Array[T]) -> R } -> ::Array[R]
42
+ def self?.chunk_bytes: (?Resources) -> ::Integer
43
+ def self?.pipe: (untyped input, untyped output, ?workers: ::Integer, ?budget: ::Integer) { (::String) -> untyped } -> ::Hash[::Symbol, ::Integer]
44
+ def self?.slices: [T] (::Array[T], ::Integer workers) -> ::Array[::Array[T]]
45
+ def self?.spawn: [T, R] (::Array[T]) { (T) -> R } -> [::Integer, ::IO]
46
+ def self?.collect: (::Integer pid, ::IO reader) -> untyped
47
+ end
48
+
49
+ module Jsonl
50
+ def self?.parse: (::String line) -> record
51
+ def self?.dump: (record) -> ::String
52
+ def self?.each: (untyped io) { (record) -> void } -> void
53
+ | (untyped io) -> ::Enumerator[record, void]
54
+ def self?.wrap: (::String text, ?source: ::String, ?index: ::Integer) -> record
55
+ end
56
+
57
+ module Sorting
58
+ def self?.program: () -> ::String
59
+ def self?.sort: (*::String extra, ?resources: Resources) -> ::String
60
+ def self?.unique_pipeline: (floor: ::Integer, resources: Resources, ?collapse: bool) -> ::String
61
+ def self?.tally: (untyped output_path, ?floor: ::Integer, ?resources: Resources, ?collapse: bool) { (^(::String) -> void) -> void } -> ::Hash[::Symbol, untyped]
62
+ end
63
+
64
+ module Bench
65
+ class Sample
66
+ attr_reader label: ::String
67
+ attr_reader seconds: ::Float
68
+ attr_reader cpu_seconds: ::Float
69
+ attr_reader peak_rss_bytes: ::Integer
70
+ attr_reader facts: ::Hash[::Symbol, untyped]
71
+
72
+ def cores_used: () -> ::Float
73
+ def to_h: () -> ::Hash[::Symbol, untyped]
74
+ end
75
+
76
+ def self?.path: () -> Pathname
77
+ def self?.measure: (::String label, **untyped facts) { () -> untyped } -> Sample
78
+ def self?.cpu_seconds: () -> ::Float
79
+ def self?.peak_rss: () -> ::Integer
80
+ def self?.record: (Sample) -> Sample
81
+ end
82
+
83
+ module Rusage
84
+ SELF: ::Integer
85
+ CHILDREN: ::Integer
86
+ MAXRSS_OFFSET: ::Integer
87
+ SCALE: ::Integer
88
+
89
+ def self.available?: () -> bool
90
+ def self.max_rss: (::Integer who) -> ::Integer
91
+ def self.peak: () -> ::Integer
92
+ end
93
+
94
+ module Frequency
95
+ def self?.dispersion: (::Hash[::String?, ::Integer] counts, ::Hash[::String?, ::Integer] sizes) -> ::Float
96
+ def self?.each_key: (untyped path) { ([::String, ::Hash[::String?, ::Integer]]) -> void } -> void
97
+ | (untyped path) -> ::Enumerator[[::String, ::Hash[::String?, ::Integer]], void]
98
+ def self?.table: (untyped path, ::Hash[::String?, ::Integer] sizes) -> ::Array[::Hash[::Symbol, untyped]]
99
+ end
100
+
101
+ class Segmenter
102
+ MAX_WORD: ::Integer
103
+ HAN_RUN: ::Regexp
104
+
105
+ class Model
106
+ attr_reader cost: ::Hash[::String, ::Float]
107
+ attr_reader char_cost: ::Hash[::String, ::Float]
108
+ attr_reader unseen_word: ::Float
109
+ attr_reader unseen_char: ::Float
110
+ attr_reader max_word: ::Integer
111
+ end
112
+
113
+ attr_reader words: ::Set[::String]
114
+ attr_reader model: Model?
115
+
116
+ def self.load: (untyped path) -> Segmenter
117
+ def self.entries: (untyped value) -> ::Set[::String]
118
+ def self.runs: (::String text) -> ::Array[::String]
119
+
120
+ def initialize: (words: ::Set[::String], ?chars: ::Set[::String], ?model: Model?) -> void
121
+ def fit: (::Array[::String] runs, ?rounds: ::Integer) -> self
122
+ def call: (::String text) -> ::Array[::String]
123
+ def segment: (::String run) -> ::Array[::String]
124
+ end
125
+
126
+ class Stage
127
+ REGISTRY: ::Hash[::String, singleton(Stage)]
128
+
129
+ def self.register: (::String slug, ::Integer order) -> singleton(Stage)
130
+ def self.slug: () -> ::String
131
+ def self.order: () -> ::Integer
132
+ def self.ordered: () -> ::Array[singleton(Stage)]
133
+ def self.lookup: (::String name) -> singleton(Stage)
134
+
135
+ attr_reader policy: untyped
136
+ attr_reader resources: Resources
137
+ attr_reader options: ::Hash[::Symbol, untyped]
138
+
139
+ def initialize: (?policy: untyped, ?drop: bool, ?resources: Resources, **untyped options) -> void
140
+ def drop?: () -> bool
141
+ def call: (untyped input, untyped output) -> untyped
142
+
143
+ private
144
+
145
+ def reject: (record, ::Array[untyped] findings) -> record
146
+ def flag: (record, ::Array[untyped] findings) -> record
147
+ end
148
+
149
+ class MapStage < Stage
150
+ def process: (::String line) -> ::String?
151
+ def transform: (record) -> record?
152
+ end
153
+
154
+ module Stages
155
+ class Ingest < Stage
156
+ end
157
+
158
+ class Normalize < MapStage
159
+ end
160
+
161
+ class Segment < Stage
162
+ CARRIED: ::Array[::Symbol]
163
+ end
164
+
165
+ class Script < MapStage
166
+ end
167
+
168
+ class Lexicon < MapStage
169
+ CHECKS: ::Array[untyped]
170
+ end
171
+
172
+ class Evidence < Stage
173
+ BATCH: ::Integer
174
+ end
175
+
176
+ class Dedup < Stage
177
+ MASK: ::Integer
178
+ end
179
+
180
+ class Tokenize < MapStage
181
+ FIT_LINES: ::Integer
182
+ end
183
+
184
+ class Count < Stage
185
+ DEFAULT_ORDERS: ::Array[::Integer]
186
+ end
187
+ end
188
+
189
+ module Sources
190
+ class HPLT
191
+ EXCLUDED_TLDS: ::Set[::String]
192
+ TAIWAN_TLD: ::String
193
+ TAIWAN_LANG: ::Regexp
194
+ URL_HEAD: ::Integer
195
+ URL: ::Regexp
196
+ HTML_LANG: ::Regexp
197
+ REGISTERS: ::Array[::String]
198
+
199
+ class Decision
200
+ attr_reader keep: bool
201
+ attr_reader gate: ::Symbol
202
+ attr_reader host: ::String?
203
+ end
204
+
205
+ def self.open: (untyped path) { (::IO) -> untyped } -> untyped
206
+ def self.allowlist: (untyped path) -> ::Set[::String]
207
+
208
+ def initialize: (?allowlist: ::Set[::String]) -> void
209
+ def each_record: (untyped io) { (record) -> void } -> void
210
+ | (untyped io) -> ::Enumerator[record, void]
211
+ def decide: (::String line) -> Decision
212
+ def host_of: (::String line) -> ::String?
213
+ def probe: (::String line, ::Integer size) -> ::String
214
+ def taiwan_lang?: (::String line) -> bool
215
+ def build: (::String line, Decision decision) -> record
216
+ def score: (record document) -> ::Float?
217
+ def register: (record document) -> ::String?
218
+ end
219
+ end
220
+
221
+ class CLI
222
+ COMMANDS: ::Array[::String]
223
+
224
+ def self.call: (::Array[::String] argv) -> ::Integer
225
+ def initialize: (::Array[::String] argv) -> void
226
+ def call: () -> ::Integer
227
+ end
228
+ end
metadata ADDED
@@ -0,0 +1,149 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: twpipeline
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Den Patin
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: fiddle
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: twfilter
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0.1'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rake
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '13.4'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '13.4'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rbs
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '4.1'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '4.1'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.13'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.13'
82
+ description: 'Nine JSONL stages from a raw web crawl to dispersion-corrected frequency
83
+ and n-gram tables: source gating, Taiwan-standard punctuation normalization, sentence
84
+ segmentation, character-inventory and lexical-origin filtering, block-level evidence
85
+ judgment, type deduplication, Viterbi word segmentation and external-sort counting.
86
+ Resource-bounded by declared cores and memory.'
87
+ email: hi@dpat.in
88
+ executables:
89
+ - twpipeline
90
+ extensions: []
91
+ extra_rdoc_files: []
92
+ files:
93
+ - CHANGELOG.md
94
+ - LICENSE
95
+ - README.md
96
+ - bin/twpipeline
97
+ - data/hplt/README.md
98
+ - data/hplt/taiwan_domains.candidates.txt
99
+ - data/hplt/taiwan_domains.txt
100
+ - lib/twpipeline.rb
101
+ - lib/twpipeline/bench.rb
102
+ - lib/twpipeline/cli.rb
103
+ - lib/twpipeline/frequency.rb
104
+ - lib/twpipeline/jsonl.rb
105
+ - lib/twpipeline/parallel.rb
106
+ - lib/twpipeline/resources.rb
107
+ - lib/twpipeline/rusage.rb
108
+ - lib/twpipeline/segmenter.rb
109
+ - lib/twpipeline/sorting.rb
110
+ - lib/twpipeline/sources/hplt.rb
111
+ - lib/twpipeline/stage.rb
112
+ - lib/twpipeline/stages/count.rb
113
+ - lib/twpipeline/stages/dedup.rb
114
+ - lib/twpipeline/stages/evidence.rb
115
+ - lib/twpipeline/stages/ingest.rb
116
+ - lib/twpipeline/stages/lexicon.rb
117
+ - lib/twpipeline/stages/normalize.rb
118
+ - lib/twpipeline/stages/script.rb
119
+ - lib/twpipeline/stages/segment.rb
120
+ - lib/twpipeline/stages/tokenize.rb
121
+ - lib/twpipeline/version.rb
122
+ - sig/twpipeline.rbs
123
+ homepage: https://github.com/taiwan-corpora/twpipeline
124
+ licenses:
125
+ - MIT
126
+ metadata:
127
+ source_code_uri: https://github.com/taiwan-corpora/twpipeline
128
+ changelog_uri: https://github.com/taiwan-corpora/twpipeline/blob/main/CHANGELOG.md
129
+ bug_tracker_uri: https://github.com/taiwan-corpora/twpipeline/issues
130
+ documentation_uri: https://huggingface.co/datasets/taiwan-corpora/twngrams
131
+ rubygems_mfa_required: 'true'
132
+ rdoc_options: []
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '3.4'
140
+ required_rubygems_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ requirements: []
146
+ rubygems_version: 4.0.17
147
+ specification_version: 4
148
+ summary: Corpus construction pipeline for Taiwan Mandarin
149
+ test_files: []