pragmatic_segmenter 0.3.22 → 0.3.24
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Gem Version](https://badge.fury.io/rb/pragmatic_segmenter.svg)](http://badge.fury.io/rb/pragmatic_segmenter) [![
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/pragmatic_segmenter.svg)](http://badge.fury.io/rb/pragmatic_segmenter) [![Build Status](https://travis-ci.org/diasks2/pragmatic_segmenter.png)](https://travis-ci.org/diasks2/pragmatic_segmenter) [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat)](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
|