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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +23 -0
- data/LICENSE +21 -0
- data/README.md +236 -0
- data/bin/twpipeline +15 -0
- data/data/hplt/README.md +26 -0
- data/data/hplt/taiwan_domains.candidates.txt +300 -0
- data/data/hplt/taiwan_domains.txt +0 -0
- data/lib/twpipeline/bench.rb +55 -0
- data/lib/twpipeline/cli.rb +144 -0
- data/lib/twpipeline/frequency.rb +48 -0
- data/lib/twpipeline/jsonl.rb +30 -0
- data/lib/twpipeline/parallel.rb +92 -0
- data/lib/twpipeline/resources.rb +64 -0
- data/lib/twpipeline/rusage.rb +41 -0
- data/lib/twpipeline/segmenter.rb +134 -0
- data/lib/twpipeline/sorting.rb +51 -0
- data/lib/twpipeline/sources/hplt.rb +112 -0
- data/lib/twpipeline/stage.rb +71 -0
- data/lib/twpipeline/stages/count.rb +89 -0
- data/lib/twpipeline/stages/dedup.rb +46 -0
- data/lib/twpipeline/stages/evidence.rb +80 -0
- data/lib/twpipeline/stages/ingest.rb +66 -0
- data/lib/twpipeline/stages/lexicon.rb +16 -0
- data/lib/twpipeline/stages/normalize.rb +15 -0
- data/lib/twpipeline/stages/script.rb +14 -0
- data/lib/twpipeline/stages/segment.rb +50 -0
- data/lib/twpipeline/stages/tokenize.rb +42 -0
- data/lib/twpipeline/version.rb +5 -0
- data/lib/twpipeline.rb +59 -0
- data/sig/twpipeline.rbs +228 -0
- metadata +149 -0
data/sig/twpipeline.rbs
ADDED
|
@@ -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: []
|