petrovich 1.0.0 → 1.0.1
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 +4 -4
- data/README.md +7 -7
- data/Rakefile +5 -0
- data/lib/petrovich/case/rule.rb +10 -4
- data/lib/petrovich/case/rule/test.rb +2 -3
- data/lib/petrovich/gender/rule.rb +2 -3
- data/lib/petrovich/name.rb +7 -2
- data/lib/petrovich/rule_set.rb +6 -4
- data/lib/tasks/evaluate.rake +3 -2
- data/rules/rules.yml +13 -10
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 949de8e61c2087dace03572893fe90b5cbb4be2c
|
4
|
+
data.tar.gz: 85b19751be033e064283de4cfa875d2b4f299ae6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75183e9e1cc24646a4a28b3fc8a7f3cc2f357bbfe079540a0ed160539bd3472978d2351f8d96159856b21f14cb191287aac2f6a41d73f08beb618c73658e8058
|
7
|
+
data.tar.gz: 6de4c561b1dcf1379df536e481b80e4862d0b6f73f7badcc1e6a693b42ac4bcf3f1261f75a2a19a2c3b8c0e91f84f60373d7d0d2d1a064b779519efc4bc46ab6
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Petrovich также позволяет определять пол по имени, фамилии, отчеству.
|
7
7
|
|
8
|
-
[](https://travis-ci.org/petrovich/petrovich-ruby)
|
9
9
|
|
10
10
|
## Установка
|
11
11
|
|
@@ -48,13 +48,13 @@ Petrovich(
|
|
48
48
|
Petrovich(
|
49
49
|
firstname: 'Иван',
|
50
50
|
middlename: 'Петрович',
|
51
|
-
).to(:instrumental).middlename # => Петровича
|
51
|
+
).to(:instrumental).middlename # => Петровича
|
52
52
|
|
53
|
-
# Склонение с указанием пола. В данном
|
54
|
-
# человека, поэтому, если вам известен пол, всегда передавайте его в аргументах,
|
53
|
+
# Склонение с указанием пола. В данном случае, по имени и фамилии невозможно определить пол
|
54
|
+
# человека, поэтому, если вам известен пол, то всегда передавайте его в аргументах,
|
55
55
|
# чтобы склонение было верным.
|
56
56
|
# Если пол неизвестен, то гем попытается определить его самостоятельно.
|
57
|
-
# Пол должен быть указан в виде строки или
|
57
|
+
# Пол должен быть указан в виде строки или символа. Возможные значения: male, female.
|
58
58
|
Petrovich(
|
59
59
|
lastname: 'Андрейчук',
|
60
60
|
firstname: 'Саша',
|
@@ -143,8 +143,8 @@ petrovich -l Иванов -f Иван -m Иванович -t accusative -o
|
|
143
143
|
Наши приоритеты следующие:
|
144
144
|
|
145
145
|
* Повысить аккуратность склонения женских фамилий до 98%
|
146
|
-
* Обрабатывать ФИО в тексте. Например, чтобы выделить ФИО в виде гиперссылки.
|
147
|
-
* Перевести реализацию на язык Rust. Это даст возможность использовать библиотеку в различных языках, подключая её через FFI и не потребует отдельной реализации
|
146
|
+
* Обрабатывать ФИО (возможно просто фамилии, имена и так далее) в тексте. Например, чтобы выделить ФИО в виде гиперссылки.
|
147
|
+
* Перевести реализацию на язык Rust. Это даст возможность использовать библиотеку в различных языках, подключая её через FFI и не потребует отдельной реализации для каждого языка. Это также увеличит скорость работы библиотеки.
|
148
148
|
|
149
149
|
Если вы хотите помочь этому проекту, вы можете реализовать любую
|
150
150
|
вышеперечисленную идею. Перед этим желательно связаться с нами,
|
data/Rakefile
CHANGED
data/lib/petrovich/case/rule.rb
CHANGED
@@ -12,20 +12,26 @@ module Petrovich
|
|
12
12
|
@tests = opts[:tests]
|
13
13
|
@tags = []
|
14
14
|
|
15
|
+
@tests_regexp = Regexp.union(Array(@tests).map(&:suffix))
|
16
|
+
|
15
17
|
assert_name_part!(@as)
|
16
18
|
end
|
17
19
|
|
18
|
-
def match?(name, match_gender, match_as)
|
20
|
+
def match?(name, match_gender, match_as, known_gender = false)
|
19
21
|
assert_name_part!(match_as)
|
20
22
|
|
21
23
|
return false unless match_as == as
|
22
24
|
|
23
25
|
match_gender = match_gender.to_sym.downcase
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
+
if known_gender
|
28
|
+
return false if match_gender != gender
|
29
|
+
else
|
30
|
+
return false if gender != :female && match_gender == :female
|
31
|
+
return false if gender == :female && match_gender != :female
|
32
|
+
end
|
27
33
|
|
28
|
-
|
34
|
+
!!name.match(@tests_regexp)
|
29
35
|
end
|
30
36
|
|
31
37
|
# Is this exceptional rule?
|
@@ -6,12 +6,11 @@ module Petrovich
|
|
6
6
|
attr_reader :suffix
|
7
7
|
|
8
8
|
def initialize(suffix)
|
9
|
-
@suffix =
|
9
|
+
@suffix = /#{suffix}$/i
|
10
10
|
end
|
11
11
|
|
12
12
|
def match?(name)
|
13
|
-
name
|
14
|
-
suffix == name.slice([name.size - suffix.size, 0].max..-1)
|
13
|
+
!!name.match(suffix)
|
15
14
|
end
|
16
15
|
|
17
16
|
def inspect
|
@@ -8,14 +8,13 @@ module Petrovich
|
|
8
8
|
def initialize(opts)
|
9
9
|
@gender = opts[:gender]
|
10
10
|
@as = opts[:as]
|
11
|
-
@suffix = opts[:suffix]
|
11
|
+
@suffix = /#{opts[:suffix]}$/i
|
12
12
|
end
|
13
13
|
|
14
14
|
def match?(name, match_as)
|
15
15
|
return false unless match_as == as
|
16
16
|
|
17
|
-
name
|
18
|
-
@suffix == name.slice([name.size - @suffix.size, 0].max..-1)
|
17
|
+
!!name.match(suffix)
|
19
18
|
end
|
20
19
|
end
|
21
20
|
end
|
data/lib/petrovich/name.rb
CHANGED
@@ -17,13 +17,17 @@ module Petrovich
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def gender
|
20
|
-
if
|
20
|
+
if known_gender?
|
21
21
|
@gender.to_sym
|
22
22
|
else
|
23
23
|
Gender.detect(@name)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
def known_gender?
|
28
|
+
!@gender.nil? && [:male, :female, :androgynous].include?(@gender.to_sym)
|
29
|
+
end
|
30
|
+
|
27
31
|
def male?
|
28
32
|
Gender.detect(@name) == :male
|
29
33
|
end
|
@@ -55,7 +59,8 @@ module Petrovich
|
|
55
59
|
|
56
60
|
def inflect(name, gender, name_case)
|
57
61
|
inflector = Inflector.new(name, gender, name_case)
|
58
|
-
|
62
|
+
known_gender = known_gender?
|
63
|
+
find = proc { |x| @rule_set.find_all_case_rules(name.send(x), gender, x, known_gender) }
|
59
64
|
|
60
65
|
if !name.lastname.nil? && (rules = find.call(:lastname))
|
61
66
|
name.lastname = inflector.inflect_lastname(rules)
|
data/lib/petrovich/rule_set.rb
CHANGED
@@ -23,8 +23,9 @@ module Petrovich
|
|
23
23
|
@gender_rules << rule
|
24
24
|
end
|
25
25
|
|
26
|
-
def find_all_case_rules(name, gender, as)
|
27
|
-
name.split('-')
|
26
|
+
def find_all_case_rules(name, gender, as, known_gender = false)
|
27
|
+
parts = name.split('-')
|
28
|
+
parts.map.with_index { |part, index| find_case_rule(part, gender, as, (index == parts.count-1) && known_gender) }
|
28
29
|
end
|
29
30
|
|
30
31
|
def find_all_gender_rules(name, as)
|
@@ -78,8 +79,9 @@ module Petrovich
|
|
78
79
|
end
|
79
80
|
end
|
80
81
|
|
81
|
-
def find_case_rule(name, gender, as)
|
82
|
-
@case_rules.find { |rule| rule.match?(name, gender, as) }
|
82
|
+
def find_case_rule(name, gender, as, known_gender = false)
|
83
|
+
found_rule = @case_rules.find { |rule| rule.match?(name, gender, as, known_gender) }
|
84
|
+
found_rule || @case_rules.find { |rule| rule.match?(name, :androgynous, as) }
|
83
85
|
end
|
84
86
|
|
85
87
|
def find_gender_rule(name, as)
|
data/lib/tasks/evaluate.rake
CHANGED
@@ -3,7 +3,8 @@
|
|
3
3
|
require 'csv'
|
4
4
|
|
5
5
|
def check!(errors, correct, total, lemma, gender, gcase, expected)
|
6
|
-
|
6
|
+
petrovich = ENV['USE_GENDER'] ? Petrovich(lastname: lemma, gender: gender) : Petrovich(lastname: lemma)
|
7
|
+
actual = Petrovich::Unicode.upcase(petrovich.public_send(gcase).lastname)
|
7
8
|
total[[gender, gcase]] += 1
|
8
9
|
if actual == expected
|
9
10
|
correct[[gender, gcase]] += 1
|
@@ -16,7 +17,7 @@ end
|
|
16
17
|
|
17
18
|
desc 'Evaluate the inflector on lastnames'
|
18
19
|
task :evaluate => :petrovich do
|
19
|
-
filename = File.expand_path('../../../
|
20
|
+
filename = File.expand_path('../../../eval/surnames.tsv', __FILE__)
|
20
21
|
errors_filename = ENV['errors'] || 'errors.tsv'
|
21
22
|
|
22
23
|
correct, total = Hash.new(0), Hash.new(0)
|
data/rules/rules.yml
CHANGED
@@ -36,10 +36,6 @@ lastname:
|
|
36
36
|
test: [вий, сой, цой, хой]
|
37
37
|
mods: [-я, -ю, -я, -ем, -е]
|
38
38
|
|
39
|
-
- gender: androgynous
|
40
|
-
test: [я]
|
41
|
-
mods: [., ., ., ., .]
|
42
|
-
|
43
39
|
suffixes:
|
44
40
|
- gender: female
|
45
41
|
test: [б, в, г, д, ж, з, й, к, л, м, н, п, р, с, т, ф, х, ц, ч, ш, щ, ъ, ь]
|
@@ -104,11 +100,16 @@ lastname:
|
|
104
100
|
test: [ова, ева, на]
|
105
101
|
mods: [-ой, -ой, -у, -ой, -ой]
|
106
102
|
|
107
|
-
# Басалыга, Лазука, Пидкуймуха, Бобча, Гуща, Рогожа,
|
103
|
+
# Басалыга, Лазука, Пидкуймуха, Бобча, Гуща, Рогожа, Кваша
|
108
104
|
- gender: androgynous
|
109
|
-
test: [га, ка, ха, ча, ща, жа,
|
105
|
+
test: [га, ка, ха, ча, ща, жа, ша]
|
110
106
|
mods: [-и, -е, -у, -ой, -е]
|
111
107
|
|
108
|
+
# Глоба, Хакамада, Хамза, Бульба
|
109
|
+
- gender: androgynous
|
110
|
+
test: [а]
|
111
|
+
mods: [-ы, -е, -у, -ой, -е]
|
112
|
+
|
112
113
|
# Белоконь
|
113
114
|
- gender: male
|
114
115
|
test: [ь]
|
@@ -327,13 +328,11 @@ gender:
|
|
327
328
|
# не будет найдено совпадений, то фамилия будет считаться андрогенной.
|
328
329
|
female:
|
329
330
|
- ова
|
330
|
-
-
|
331
|
+
- ая
|
331
332
|
- на
|
332
333
|
- ина
|
333
334
|
- ева
|
334
|
-
- вая
|
335
335
|
- ска
|
336
|
-
- ная
|
337
336
|
male:
|
338
337
|
- кий
|
339
338
|
- ов
|
@@ -373,7 +372,6 @@ gender:
|
|
373
372
|
- ир
|
374
373
|
- их
|
375
374
|
- ри
|
376
|
-
- ис
|
377
375
|
- аф
|
378
376
|
- ор
|
379
377
|
- рь
|
@@ -439,5 +437,10 @@ gender:
|
|
439
437
|
middlename:
|
440
438
|
female:
|
441
439
|
- на
|
440
|
+
- кызы
|
441
|
+
- гызы
|
442
442
|
male:
|
443
443
|
- ич
|
444
|
+
- оглы
|
445
|
+
- улы
|
446
|
+
- уулу
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: petrovich
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kozlov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-07-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: commander
|
@@ -67,11 +67,11 @@ dependencies:
|
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
|
-
description: A library
|
71
|
-
and middle names.
|
70
|
+
description: A morphological library for Russian anthroponyms, such as first names,
|
71
|
+
last names, and middle names.
|
72
72
|
email:
|
73
73
|
- demerest@gmail.com
|
74
|
-
- dmitry@
|
74
|
+
- dmitry.ustalov@gmail.com
|
75
75
|
executables: []
|
76
76
|
extensions: []
|
77
77
|
extra_rdoc_files: []
|
@@ -113,8 +113,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
113
|
version: '0'
|
114
114
|
requirements: []
|
115
115
|
rubyforge_project:
|
116
|
-
rubygems_version: 2.
|
116
|
+
rubygems_version: 2.5.1
|
117
117
|
signing_key:
|
118
118
|
specification_version: 4
|
119
|
-
summary:
|
119
|
+
summary: Petrovich, an inflector for Russian anthroponyms.
|
120
120
|
test_files: []
|