pragmatic_segmenter 0.3.6 → 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/lib/pragmatic_segmenter/abbreviation_replacer.rb +5 -4
- data/lib/pragmatic_segmenter/languages.rb +2 -0
- data/lib/pragmatic_segmenter/languages/bulgarian.rb +23 -0
- data/lib/pragmatic_segmenter/languages/russian.rb +1 -1
- data/lib/pragmatic_segmenter/list.rb +3 -3
- data/lib/pragmatic_segmenter/version.rb +1 -1
- data/pragmatic_segmenter.gemspec +1 -0
- data/spec/pragmatic_segmenter/languages/bulgarian_spec.rb +27 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e52784b9c640f8e05b250ef0382117952e385b38
|
4
|
+
data.tar.gz: b7ab33db4cb7c9e0b9b2d34a88e79a7a0f31f22d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2de3bd5dc14e04c4cdac85c0eee27912c74ffe0f7d3b098c2e82861a3d4c247d7ed48c3c84a6d850151acce4da324fa2c997be896890ec6bcd342b7f5c682f0
|
7
|
+
data.tar.gz: d2630ec99ffe38b08eadb619c75f8c9622bc79a20abb0987de36f8fd04f3bac7e58a90835891ff4e5db9cec7f8e29d7c1fba3ba8bf91386b7086263a3b3cbd52
|
data/README.md
CHANGED
@@ -828,6 +828,9 @@ To test the relative performance of different segmentation tools and libraries I
|
|
828
828
|
**Version 0.3.6**
|
829
829
|
* Refactor SENTENCE_STARTERS to each individual language and add SENTENCE_STARTERS for German
|
830
830
|
|
831
|
+
**Version 0.3.7**
|
832
|
+
* Add `unicode` gem and use it for downcasing to better handle cyrillic languages
|
833
|
+
|
831
834
|
## Contributing
|
832
835
|
|
833
836
|
If you find a text that is incorrectly segmented using this gem, please submit an issue.
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
require 'unicode'
|
2
3
|
|
3
4
|
module PragmaticSegmenter
|
4
5
|
# This class searches for periods within an abbreviation and
|
@@ -26,7 +27,7 @@ module PragmaticSegmenter
|
|
26
27
|
|
27
28
|
def search_for_abbreviations_in_string(txt)
|
28
29
|
original = txt.dup
|
29
|
-
downcased = txt
|
30
|
+
downcased = Unicode::downcase(txt)
|
30
31
|
@language::Abbreviation::ABBREVIATIONS.each do |a|
|
31
32
|
next unless downcased.include?(a.strip)
|
32
33
|
abbrev_match = original.scan(/(?:^|\s|\r|\n)#{Regexp.escape(a.strip)}/i)
|
@@ -45,10 +46,10 @@ module PragmaticSegmenter
|
|
45
46
|
prepositive = @language::Abbreviation::PREPOSITIVE_ABBREVIATIONS
|
46
47
|
number_abbr = @language::Abbreviation::NUMBER_ABBREVIATIONS
|
47
48
|
upper = /[[:upper:]]/.match(character.to_s)
|
48
|
-
if upper.nil? || prepositive.include?(am.
|
49
|
-
if prepositive.include?(am.
|
49
|
+
if upper.nil? || prepositive.include?(Unicode::downcase(am.strip))
|
50
|
+
if prepositive.include?(Unicode::downcase(am.strip))
|
50
51
|
txt = replace_prepositive_abbr(txt, am)
|
51
|
-
elsif number_abbr.include?(am.
|
52
|
+
elsif number_abbr.include?(Unicode::downcase(am.strip))
|
52
53
|
txt = replace_pre_number_abbr(txt, am)
|
53
54
|
else
|
54
55
|
txt = replace_period_of_abbr(txt, am)
|
@@ -22,11 +22,13 @@ require 'pragmatic_segmenter/languages/japanese'
|
|
22
22
|
require 'pragmatic_segmenter/languages/dutch'
|
23
23
|
require 'pragmatic_segmenter/languages/polish'
|
24
24
|
require 'pragmatic_segmenter/languages/chinese'
|
25
|
+
require 'pragmatic_segmenter/languages/bulgarian'
|
25
26
|
|
26
27
|
module PragmaticSegmenter
|
27
28
|
module Languages
|
28
29
|
LANGUAGE_CODES = {
|
29
30
|
'en' => English,
|
31
|
+
'bg' => Bulgarian,
|
30
32
|
'de' => Deutsch,
|
31
33
|
'es' => Spanish,
|
32
34
|
'fr' => French,
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PragmaticSegmenter
|
2
|
+
module Languages
|
3
|
+
module Bulgarian
|
4
|
+
include Languages::Common
|
5
|
+
|
6
|
+
module Abbreviation
|
7
|
+
ABBREVIATIONS = ["p.s", "акад", "ал", "б.р", "б.ред", "бел.а", "бел.пр", "бр", "бул", "в", "вж", "вкл", "вм", "вр", "г", "ген", "гр", "дж", "дм", "доц", "др", "ем", "заб", "зам", "инж", "к.с", "кв", "кв.м", "кг", "км", "кор", "куб", "куб.м", "л", "лв", "м", "м.г", "мин", "млн", "млрд", "мм", "н.с", "напр", "пл", "полк", "проф", "р", "рис", "с", "св", "сек", "см", "сп", "срв", "ст", "стр", "т", "т.г", "т.е", "т.н", "т.нар", "табл", "тел", "у", "ул", "фиг", "ха", "хил", "ч", "чл", "щ.д"]
|
8
|
+
NUMBER_ABBREVIATIONS = []
|
9
|
+
PREPOSITIVE_ABBREVIATIONS = []
|
10
|
+
end
|
11
|
+
|
12
|
+
class AbbreviationReplacer < AbbreviationReplacer
|
13
|
+
SENTENCE_STARTERS = [].freeze
|
14
|
+
|
15
|
+
private
|
16
|
+
def replace_period_of_abbr(txt, abbr)
|
17
|
+
txt.gsub!(/(?<=\s#{abbr.strip})\.|(?<=^#{abbr.strip})\./, '∯')
|
18
|
+
txt
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -4,7 +4,7 @@ module PragmaticSegmenter
|
|
4
4
|
include Languages::Common
|
5
5
|
|
6
6
|
module Abbreviation
|
7
|
-
ABBREVIATIONS = [
|
7
|
+
ABBREVIATIONS = ["y", "y.e", "а", "авт", "адм.-терр", "акад", "в", "вв", "вкз", "вост.-европ", "г", "гг", "гос", "гр", "д", "деп", "дисс", "дол", "долл", "ежедн", "ж", "жен", "з", "зап", "зап.-европ", "заруб", "и", "ин", "иностр", "инст", "к", "канд", "кв", "кг", "куб", "л", "л.h", "л.н", "м", "мин", "моск", "муж", "н", "нед", "о", "п", "пгт", "пер", "пп", "пр", "просп", "проф", "р", "руб", "с", "сек", "см", "спб", "стр", "т", "тел", "тов", "тт", "тыс", "у", "у.е", "ул", "ф", "ч"]
|
8
8
|
PREPOSITIVE_ABBREVIATIONS = []
|
9
9
|
NUMBER_ABBREVIATIONS = []
|
10
10
|
end
|
@@ -149,9 +149,9 @@ module PragmaticSegmenter
|
|
149
149
|
def replace_alphabet_list_parens(a)
|
150
150
|
@text.gsub!(EXTRACT_ALPHABETICAL_LIST_LETTERS_REGEX).with_index do |m|
|
151
151
|
if m.include?('(')
|
152
|
-
a.eql?(m.dup.
|
152
|
+
a.eql?(Unicode::downcase(m.dup).gsub!(/\(/, '')) ? "\r&✂&#{Regexp.escape(m.gsub!(/\(/, ''))}" : "#{m}"
|
153
153
|
else
|
154
|
-
a.eql?(m.dup
|
154
|
+
a.eql?(Unicode::downcase(m.dup)) ? "\r#{Regexp.escape(m)}" : "#{m}"
|
155
155
|
end
|
156
156
|
end
|
157
157
|
end
|
@@ -183,7 +183,7 @@ module PragmaticSegmenter
|
|
183
183
|
end
|
184
184
|
|
185
185
|
def iterate_alphabet_array(regex, parens: false, roman_numeral: false)
|
186
|
-
list_array = @text.scan(regex).map(
|
186
|
+
list_array = @text.scan(regex).map { |s| Unicode::downcase(s) }
|
187
187
|
if roman_numeral
|
188
188
|
alphabet = ROMAN_NUMERALS
|
189
189
|
else
|
data/pragmatic_segmenter.gemspec
CHANGED
@@ -18,6 +18,7 @@ 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.add_runtime_dependency "unicode"
|
21
22
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
23
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
24
|
spec.add_development_dependency "rspec"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PragmaticSegmenter::Languages::Bulgarian, '(bg)' do
|
4
|
+
|
5
|
+
describe '#segment' do
|
6
|
+
|
7
|
+
it 'correctly segments text #001' do
|
8
|
+
ps = PragmaticSegmenter::Segmenter.new(text: "В първата половина на ноември т.г. ще бъде свикан Консултативният съвет за национална сигурност, обяви държавният глава.", language: 'bg')
|
9
|
+
expect(ps.segment).to eq(["В първата половина на ноември т.г. ще бъде свикан Консултативният съвет за национална сигурност, обяви държавният глава."])
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'correctly segments text #002' do
|
13
|
+
ps = PragmaticSegmenter::Segmenter.new(text: "Компютърът е устройство с общо предназначение, което може да бъде програмирано да извършва набор от аритметични и/или логически операции. Възможността поредицата такива операции да бъде променяна позволява компютърът да се използва за решаването на теоретично всяка изчислителна/логическа задача. Обикновено целта на тези операции е обработката на въведена информация (данни), представена в цифров (дигитален) вид, резултатът от които може да се изведе в най-общо казано използваема форма.", language: 'bg')
|
14
|
+
expect(ps.segment).to eq(["Компютърът е устройство с общо предназначение, което може да бъде програмирано да извършва набор от аритметични и/или логически операции.", "Възможността поредицата такива операции да бъде променяна позволява компютърът да се използва за решаването на теоретично всяка изчислителна/логическа задача.", "Обикновено целта на тези операции е обработката на въведена информация (данни), представена в цифров (дигитален) вид, резултатът от които може да се изведе в най-общо казано използваема форма."])
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'correctly segments text #003' do
|
18
|
+
ps = PragmaticSegmenter::Segmenter.new(text: "Пл. \"20 Април\"", language: 'bg')
|
19
|
+
expect(ps.segment).to eq(["Пл. \"20 Април\""])
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'correctly segments text #004' do
|
23
|
+
ps = PragmaticSegmenter::Segmenter.new(text: "Той поставя началото на могъща династия, която управлява в продължение на 150 г. Саргон надделява в двубой с владетеля на град Ур и разширява териториите на държавата си по долното течение на Тигър и Ефрат. Стойностни, вкл. български и руски", language: 'bg')
|
24
|
+
expect(ps.segment).to eq(["Той поставя началото на могъща династия, която управлява в продължение на 150 г. Саргон надделява в двубой с владетеля на град Ур и разширява териториите на държавата си по долното течение на Тигър и Ефрат.", "Стойностни, вкл. български и руски"])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
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.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin S. Dias
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-12 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'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -93,6 +107,7 @@ files:
|
|
93
107
|
- lib/pragmatic_segmenter/languages/amharic.rb
|
94
108
|
- lib/pragmatic_segmenter/languages/arabic.rb
|
95
109
|
- lib/pragmatic_segmenter/languages/armenian.rb
|
110
|
+
- lib/pragmatic_segmenter/languages/bulgarian.rb
|
96
111
|
- lib/pragmatic_segmenter/languages/burmese.rb
|
97
112
|
- lib/pragmatic_segmenter/languages/chinese.rb
|
98
113
|
- lib/pragmatic_segmenter/languages/common.rb
|
@@ -122,6 +137,7 @@ files:
|
|
122
137
|
- spec/pragmatic_segmenter/languages/amharic_spec.rb
|
123
138
|
- spec/pragmatic_segmenter/languages/arabic_spec.rb
|
124
139
|
- spec/pragmatic_segmenter/languages/armenian_spec.rb
|
140
|
+
- spec/pragmatic_segmenter/languages/bulgarian_spec.rb
|
125
141
|
- spec/pragmatic_segmenter/languages/burmese_spec.rb
|
126
142
|
- spec/pragmatic_segmenter/languages/chinese_spec.rb
|
127
143
|
- spec/pragmatic_segmenter/languages/deutsch_spec.rb
|
@@ -170,6 +186,7 @@ test_files:
|
|
170
186
|
- spec/pragmatic_segmenter/languages/amharic_spec.rb
|
171
187
|
- spec/pragmatic_segmenter/languages/arabic_spec.rb
|
172
188
|
- spec/pragmatic_segmenter/languages/armenian_spec.rb
|
189
|
+
- spec/pragmatic_segmenter/languages/bulgarian_spec.rb
|
173
190
|
- spec/pragmatic_segmenter/languages/burmese_spec.rb
|
174
191
|
- spec/pragmatic_segmenter/languages/chinese_spec.rb
|
175
192
|
- spec/pragmatic_segmenter/languages/deutsch_spec.rb
|