pragmatic_segmenter 0.3.22 → 0.3.24
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 +5 -5
- data/NEWS +9 -0
- data/README.md +9 -1
- data/lib/pragmatic_segmenter/abbreviation_replacer.rb +4 -3
- data/lib/pragmatic_segmenter/cleaner.rb +12 -12
- data/lib/pragmatic_segmenter/languages/common/numbers.rb +1 -1
- data/lib/pragmatic_segmenter/languages/deutsch.rb +4 -3
- data/lib/pragmatic_segmenter/languages/japanese.rb +1 -1
- data/lib/pragmatic_segmenter/languages/kazakh.rb +2 -2
- data/lib/pragmatic_segmenter/list.rb +5 -5
- data/lib/pragmatic_segmenter/processor.rb +13 -11
- data/lib/pragmatic_segmenter/punctuation_replacer.rb +3 -3
- data/lib/pragmatic_segmenter/types.rb +7 -7
- data/lib/pragmatic_segmenter/version.rb +1 -1
- data/lib/unicode.rb +5 -0
- data/pragmatic_segmenter.gemspec +2 -3
- metadata +13 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 51ae71a6650fcd15671ac767d26ebe1315a9ea655d8fbf6e29ef9e4fa668fc93
|
4
|
+
data.tar.gz: 786246dc9e80872b423013fed2d69e0cba48cc7a7d5a693a3165b4cdf61fe00d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a830c5787a3818bc274b69aabd82bf5f837ba76c43921970c26a59f229d69bb24b698ff27389056ed6c536216edefdf4fa12338affbe883929b492065554af4c
|
7
|
+
data.tar.gz: f86cd6a66eaeb1890b5ddb2316d5ede734061b78212a490f8092bd20845cdb4dd47fac374972244785170ae266af21c566cbf59dd1a5667151ccd651269b72d8
|
data/NEWS
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
0.3.24 (2024-08-12):
|
2
|
+
|
3
|
+
* Bug Fix: Catastrophic backtracking in regular expression for numerical references
|
4
|
+
* Improvement: Remove unicode dependency
|
5
|
+
|
6
|
+
0.3.23 (2021-05-03):
|
7
|
+
|
8
|
+
* Improvement: Refactor for Ruby 3.0 compatibility
|
9
|
+
|
1
10
|
0.3.22 (2018-09-23):
|
2
11
|
|
3
12
|
* Improvement: Initial support for Kazakh
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Pragmatic Segmenter
|
2
2
|
|
3
|
-
[](http://badge.fury.io/rb/pragmatic_segmenter) [](http://badge.fury.io/rb/pragmatic_segmenter) [](https://travis-ci.org/diasks2/pragmatic_segmenter) [](https://github.com/diasks2/pragmatic_segmenter/blob/master/LICENSE.txt)
|
4
4
|
|
5
5
|
Pragmatic Segmenter is a rule-based sentence boundary detection gem that works out-of-the-box across many languages.
|
6
6
|
|
@@ -887,6 +887,13 @@ To test the relative performance of different segmentation tools and libraries I
|
|
887
887
|
**Version 0.3.22**
|
888
888
|
* Add initial support and tests for Kazakh
|
889
889
|
|
890
|
+
**Version 0.3.23**
|
891
|
+
* Refactor for Ruby 3.0 compatibility
|
892
|
+
|
893
|
+
**Version 0.3.24**
|
894
|
+
* Fix catastrophic backtracking in regular expression for numerical references
|
895
|
+
* Remove unicode dependency
|
896
|
+
|
890
897
|
## Contributing
|
891
898
|
|
892
899
|
If you find a text that is incorrectly segmented using this gem, please submit an issue.
|
@@ -900,6 +907,7 @@ If you find a text that is incorrectly segmented using this gem, please submit a
|
|
900
907
|
## Ports
|
901
908
|
|
902
909
|
* [C# - PragmaticSegmenterNet](https://github.com/UglyToad/PragmaticSegmenterNet)
|
910
|
+
* [Python - pySBD](https://github.com/nipunsadvilkar/pySBD)
|
903
911
|
|
904
912
|
## License
|
905
913
|
|
@@ -10,18 +10,19 @@ module PragmaticSegmenter
|
|
10
10
|
|
11
11
|
attr_reader :text
|
12
12
|
def initialize(text:, language: )
|
13
|
-
@text =
|
13
|
+
@text = text.dup
|
14
14
|
@language = language
|
15
15
|
end
|
16
16
|
|
17
17
|
def replace
|
18
|
-
|
18
|
+
Rule.apply(@text,
|
19
|
+
@language::PossessiveAbbreviationRule,
|
19
20
|
@language::KommanditgesellschaftRule,
|
20
21
|
@language::SingleLetterAbbreviationRules::All)
|
21
22
|
|
22
23
|
@text = search_for_abbreviations_in_string(@text)
|
23
24
|
@text = replace_multi_period_abbreviations(@text)
|
24
|
-
|
25
|
+
Rule.apply(@text, @language::AmPmRules::All)
|
25
26
|
replace_abbreviation_as_sentence_boundary(@text)
|
26
27
|
end
|
27
28
|
|
@@ -11,7 +11,7 @@ module PragmaticSegmenter
|
|
11
11
|
|
12
12
|
attr_reader :text, :doc_type
|
13
13
|
def initialize(text:, doc_type: nil, language: Languages::Common)
|
14
|
-
@text =
|
14
|
+
@text = text.dup
|
15
15
|
@doc_type = doc_type
|
16
16
|
@language = language
|
17
17
|
end
|
@@ -37,10 +37,10 @@ module PragmaticSegmenter
|
|
37
37
|
replace_newlines
|
38
38
|
replace_escaped_newlines
|
39
39
|
|
40
|
-
|
40
|
+
Rule.apply(@text, HTML::All)
|
41
41
|
|
42
42
|
replace_punctuation_in_brackets
|
43
|
-
|
43
|
+
Rule.apply(@text, InlineFormattingRule)
|
44
44
|
clean_quotations
|
45
45
|
clean_table_of_contents
|
46
46
|
check_for_no_space_in_between_sentences
|
@@ -72,7 +72,7 @@ module PragmaticSegmenter
|
|
72
72
|
if word =~ regex
|
73
73
|
unless URL_EMAIL_KEYWORDS.any? { |web| word =~ /#{web}/ }
|
74
74
|
unless abbreviations.any? { |abbr| word =~ /#{abbr}/i }
|
75
|
-
new_word = word.dup
|
75
|
+
new_word = Rule.apply(word.dup, rule)
|
76
76
|
txt.gsub!(/#{Regexp.escape(word)}/, new_word)
|
77
77
|
end
|
78
78
|
end
|
@@ -92,45 +92,45 @@ module PragmaticSegmenter
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def remove_newline_in_middle_of_word
|
95
|
-
|
95
|
+
Rule.apply @text, NewLineInMiddleOfWordRule
|
96
96
|
end
|
97
97
|
|
98
98
|
def replace_escaped_newlines
|
99
|
-
|
99
|
+
Rule.apply @text, EscapedNewLineRule, EscapedCarriageReturnRule,
|
100
100
|
TypoEscapedNewLineRule, TypoEscapedCarriageReturnRule
|
101
101
|
end
|
102
102
|
|
103
103
|
def replace_double_newlines
|
104
|
-
|
104
|
+
Rule.apply @text, DoubleNewLineWithSpaceRule, DoubleNewLineRule
|
105
105
|
end
|
106
106
|
|
107
107
|
def replace_newlines
|
108
108
|
if doc_type.eql?('pdf')
|
109
109
|
remove_pdf_line_breaks
|
110
110
|
else
|
111
|
-
|
111
|
+
Rule.apply @text, NewLineFollowedByPeriodRule,
|
112
112
|
ReplaceNewlineWithCarriageReturnRule
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
116
|
def remove_pdf_line_breaks
|
117
|
-
|
117
|
+
Rule.apply @text, NewLineFollowedByBulletRule,
|
118
118
|
|
119
119
|
PDF::NewLineInMiddleOfSentenceRule,
|
120
120
|
PDF::NewLineInMiddleOfSentenceNoSpacesRule
|
121
121
|
end
|
122
122
|
|
123
123
|
def clean_quotations
|
124
|
-
|
124
|
+
Rule.apply @text, QuotationsFirstRule, QuotationsSecondRule
|
125
125
|
end
|
126
126
|
|
127
127
|
def clean_table_of_contents
|
128
|
-
|
128
|
+
Rule.apply @text, TableOfContentsRule, ConsecutivePeriodsRule,
|
129
129
|
ConsecutiveForwardSlashRule
|
130
130
|
end
|
131
131
|
|
132
132
|
def clean_consecutive_characters
|
133
|
-
|
133
|
+
Rule.apply @text, ConsecutivePeriodsRule, ConsecutiveForwardSlashRule
|
134
134
|
end
|
135
135
|
end
|
136
136
|
end
|
@@ -47,7 +47,7 @@ module PragmaticSegmenter
|
|
47
47
|
# Rubular: http://rubular.com/r/mQ8Es9bxtk
|
48
48
|
CONTINUOUS_PUNCTUATION_REGEX = /(?<=\S)(!|\?){3,}(?=(\s|\z|$))/
|
49
49
|
|
50
|
-
NUMBERED_REFERENCE_REGEX = /(?<=[^\d\s])(\.|∯)((\[(\d{1,3},?\s?-?\s?)
|
50
|
+
NUMBERED_REFERENCE_REGEX = /(?<=[^\d\s])(\.|∯)((\[(\d{1,3},?\s?-?\s?)?\b\d{1,3}\])+|((\d{1,3}\s?){0,3}\d{1,3}))(\s)(?=[A-Z])/
|
51
51
|
|
52
52
|
# Rubular: http://rubular.com/r/yqa4Rit8EY
|
53
53
|
PossessiveAbbreviationRule = Rule.new(/\.(?='s\s)|\.(?='s$)|\.(?='s\z)/, '∯')
|
@@ -47,7 +47,7 @@ module PragmaticSegmenter
|
|
47
47
|
private
|
48
48
|
|
49
49
|
def replace_numbers
|
50
|
-
|
50
|
+
Rule.apply @text, Numbers::All
|
51
51
|
|
52
52
|
replace_period_in_deutsch_dates
|
53
53
|
end
|
@@ -68,7 +68,8 @@ module PragmaticSegmenter
|
|
68
68
|
).freeze
|
69
69
|
|
70
70
|
def replace
|
71
|
-
@text =
|
71
|
+
@text = Rule.apply(
|
72
|
+
text,
|
72
73
|
@language::PossessiveAbbreviationRule,
|
73
74
|
@language::SingleLetterAbbreviationRules::All,
|
74
75
|
SingleLowerCaseLetterRule,
|
@@ -76,7 +77,7 @@ module PragmaticSegmenter
|
|
76
77
|
|
77
78
|
@text = search_for_abbreviations_in_string(@text)
|
78
79
|
@text = replace_multi_period_abbreviations(@text)
|
79
|
-
|
80
|
+
Rule.apply(@text, Languages::Common::AmPmRules::All)
|
80
81
|
replace_abbreviation_as_sentence_boundary(@text)
|
81
82
|
end
|
82
83
|
|
@@ -23,7 +23,7 @@ module PragmaticSegmenter
|
|
23
23
|
|
24
24
|
def between_punctuation(txt)
|
25
25
|
super(txt)
|
26
|
-
|
26
|
+
Rule.apply(txt, QuestionMarkFollowedByDashLowercaseRule, ExclamationMarkFollowedByDashLowercaseRule)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -35,7 +35,7 @@ module PragmaticSegmenter
|
|
35
35
|
|
36
36
|
def replace
|
37
37
|
super
|
38
|
-
|
38
|
+
Rule.apply(@text, SingleUpperCaseCyrillicLetterAtStartOfLineRule, SingleUpperCaseCyrillicLetterRule)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -48,7 +48,7 @@ module PragmaticSegmenter
|
|
48
48
|
|
49
49
|
attr_reader :text
|
50
50
|
def initialize(text:)
|
51
|
-
@text =
|
51
|
+
@text = text.dup
|
52
52
|
end
|
53
53
|
|
54
54
|
def add_line_break
|
@@ -68,13 +68,13 @@ module PragmaticSegmenter
|
|
68
68
|
def format_numbered_list_with_parens
|
69
69
|
replace_parens_in_numbered_list
|
70
70
|
add_line_breaks_for_numbered_list_with_parens
|
71
|
-
|
71
|
+
Rule.apply(@text, ListMarkerRule)
|
72
72
|
end
|
73
73
|
|
74
74
|
def format_numbered_list_with_periods
|
75
75
|
replace_periods_in_numbered_list
|
76
76
|
add_line_breaks_for_numbered_list_with_periods
|
77
|
-
|
77
|
+
Rule.apply(@text, SubstituteListPeriodRule)
|
78
78
|
end
|
79
79
|
|
80
80
|
def format_alphabetical_lists
|
@@ -93,7 +93,7 @@ module PragmaticSegmenter
|
|
93
93
|
|
94
94
|
def add_line_breaks_for_numbered_list_with_periods
|
95
95
|
if @text.include?('♨') && @text !~ /♨.+\n.+♨|♨.+\r.+♨/ && @text !~ /for\s\d{1,2}♨\s[a-z]/
|
96
|
-
|
96
|
+
Rule.apply(@text, SpaceBetweenListItemsFirstRule, SpaceBetweenListItemsSecondRule)
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
@@ -105,7 +105,7 @@ module PragmaticSegmenter
|
|
105
105
|
|
106
106
|
def add_line_breaks_for_numbered_list_with_parens
|
107
107
|
if @text.include?('☝') && @text !~ /☝.+\n.+☝|☝.+\r.+☝/
|
108
|
-
|
108
|
+
Rule.apply(@text, SpaceBetweenListItemsThirdRule)
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -24,9 +24,9 @@ module PragmaticSegmenter
|
|
24
24
|
replace_numbers
|
25
25
|
replace_continuous_punctuation
|
26
26
|
replace_periods_before_numeric_references
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
Rule.apply(@text, @language::Abbreviations::WithMultiplePeriodsAndEmailRule)
|
28
|
+
Rule.apply(@text, @language::GeoLocationRule)
|
29
|
+
Rule.apply(@text, @language::FileFormatRule)
|
30
30
|
split_into_segments
|
31
31
|
end
|
32
32
|
|
@@ -34,18 +34,19 @@ module PragmaticSegmenter
|
|
34
34
|
|
35
35
|
def split_into_segments
|
36
36
|
check_for_parens_between_quotes(@text).split("\r")
|
37
|
-
.map! { |segment|
|
37
|
+
.map! { |segment| Rule.apply(segment, @language::SingleNewLineRule, @language::EllipsisRules::All) }
|
38
38
|
.map { |segment| check_for_punctuation(segment) }.flatten
|
39
|
-
.map! { |segment|
|
39
|
+
.map! { |segment| Rule.apply(segment, @language::SubSymbolsRules::All) }
|
40
40
|
.map { |segment| post_process_segments(segment) }
|
41
41
|
.flatten.compact.delete_if(&:empty?)
|
42
|
-
.map! { |segment|
|
42
|
+
.map! { |segment| Rule.apply(segment, @language::SubSingleQuoteRule) }
|
43
43
|
end
|
44
44
|
|
45
45
|
def post_process_segments(txt)
|
46
46
|
return txt if txt.length < 2 && txt =~ /\A[a-zA-Z]*\Z/
|
47
47
|
return if consecutive_underscore?(txt) || txt.length < 2
|
48
|
-
|
48
|
+
Rule.apply(
|
49
|
+
txt,
|
49
50
|
@language::ReinsertEllipsisRules::All,
|
50
51
|
@language::ExtraWhiteSpaceRule
|
51
52
|
)
|
@@ -91,7 +92,8 @@ module PragmaticSegmenter
|
|
91
92
|
txt << 'ȸ' unless @language::Punctuations.any? { |p| txt[-1].include?(p) }
|
92
93
|
ExclamationWords.apply_rules(txt)
|
93
94
|
between_punctuation(txt)
|
94
|
-
txt =
|
95
|
+
txt = Rule.apply(
|
96
|
+
txt,
|
95
97
|
@language::DoublePunctuationRules::All,
|
96
98
|
@language::QuestionMarkInQuotationRule,
|
97
99
|
@language::ExclamationPointRules::All
|
@@ -101,7 +103,7 @@ module PragmaticSegmenter
|
|
101
103
|
end
|
102
104
|
|
103
105
|
def replace_numbers
|
104
|
-
|
106
|
+
Rule.apply @text, @language::Numbers::All
|
105
107
|
end
|
106
108
|
|
107
109
|
def abbreviations_replacer
|
@@ -129,8 +131,8 @@ module PragmaticSegmenter
|
|
129
131
|
end
|
130
132
|
|
131
133
|
def sentence_boundary_punctuation(txt)
|
132
|
-
txt =
|
133
|
-
txt =
|
134
|
+
txt = Rule.apply txt, @language::ReplaceColonBetweenNumbersRule if defined? @language::ReplaceColonBetweenNumbersRule
|
135
|
+
txt = Rule.apply txt, @language::ReplaceNonSentenceBoundaryCommaRule if defined? @language::ReplaceNonSentenceBoundaryCommaRule
|
134
136
|
|
135
137
|
txt.scan(@language::SENTENCE_BOUNDARY_REGEX)
|
136
138
|
end
|
@@ -45,9 +45,9 @@ module PragmaticSegmenter
|
|
45
45
|
|
46
46
|
def replace_punctuation(array)
|
47
47
|
return if !array || array.empty?
|
48
|
-
|
48
|
+
Rule.apply(@text, Rules::EscapeRegexReservedCharacters::All)
|
49
49
|
array.each do |a|
|
50
|
-
|
50
|
+
Rule.apply(a, Rules::EscapeRegexReservedCharacters::All)
|
51
51
|
sub = sub_characters(a, '.', '∯')
|
52
52
|
sub_1 = sub_characters(sub, '。', '&ᓰ&')
|
53
53
|
sub_2 = sub_characters(sub_1, '.', '&ᓱ&')
|
@@ -59,7 +59,7 @@ module PragmaticSegmenter
|
|
59
59
|
sub_7 = sub_characters(sub_6, "'", '&⎋&')
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
62
|
+
Rule.apply(@text, Rules::SubEscapedRegexReservedCharacters::All)
|
63
63
|
end
|
64
64
|
|
65
65
|
def sub_characters(string, char_a, char_b)
|
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module PragmaticSegmenter
|
4
|
-
Rule
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
class Rule < Struct.new(:pattern, :replacement)
|
5
|
+
class << self
|
6
|
+
def apply(str, *rules)
|
7
|
+
rules.flatten.each do |rule|
|
8
|
+
str.gsub!(rule.pattern, rule.replacement)
|
9
|
+
end
|
10
|
+
str
|
10
11
|
end
|
11
|
-
self
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
data/lib/unicode.rb
ADDED
data/pragmatic_segmenter.gemspec
CHANGED
@@ -18,9 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.
|
22
|
-
spec.add_development_dependency "
|
23
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
+
spec.add_development_dependency "bundler", ">= 1.7"
|
22
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
24
23
|
spec.add_development_dependency "rspec"
|
25
24
|
spec.add_development_dependency "stackprof"
|
26
25
|
end
|
metadata
CHANGED
@@ -1,57 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pragmatic_segmenter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin S. Dias
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: unicode
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: bundler
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
|
-
- - "
|
17
|
+
- - ">="
|
32
18
|
- !ruby/object:Gem::Version
|
33
19
|
version: '1.7'
|
34
20
|
type: :development
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
|
-
- - "
|
24
|
+
- - ">="
|
39
25
|
- !ruby/object:Gem::Version
|
40
26
|
version: '1.7'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rake
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
|
-
- - "
|
31
|
+
- - ">="
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
33
|
+
version: 12.3.3
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- - "
|
38
|
+
- - ">="
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
40
|
+
version: 12.3.3
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: rspec
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +122,7 @@ files:
|
|
136
122
|
- lib/pragmatic_segmenter/segmenter.rb
|
137
123
|
- lib/pragmatic_segmenter/types.rb
|
138
124
|
- lib/pragmatic_segmenter/version.rb
|
125
|
+
- lib/unicode.rb
|
139
126
|
- pragmatic_segmenter.gemspec
|
140
127
|
- spec/performance_spec.rb
|
141
128
|
- spec/pragmatic_segmenter/languages/amharic_spec.rb
|
@@ -166,7 +153,7 @@ homepage: https://github.com/diasks2/pragmatic_segmenter
|
|
166
153
|
licenses:
|
167
154
|
- MIT
|
168
155
|
metadata: {}
|
169
|
-
post_install_message:
|
156
|
+
post_install_message:
|
170
157
|
rdoc_options: []
|
171
158
|
require_paths:
|
172
159
|
- lib
|
@@ -181,9 +168,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
168
|
- !ruby/object:Gem::Version
|
182
169
|
version: '0'
|
183
170
|
requirements: []
|
184
|
-
|
185
|
-
|
186
|
-
signing_key:
|
171
|
+
rubygems_version: 3.3.26
|
172
|
+
signing_key:
|
187
173
|
specification_version: 4
|
188
174
|
summary: A rule-based sentence boundary detection gem that works out-of-the-box across
|
189
175
|
many languages
|