petrovich 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 497c86554374fa1a2c75f764eaac90cfb91b7b6f
4
- data.tar.gz: 48eb5c6fdc37a1312405a72e23c89031474b02f4
3
+ metadata.gz: 641bd09d48d3c8a48ea3bc6ecdbbf569d93c5084
4
+ data.tar.gz: 5ded3884cc68b5018fdd02dea609110949680440
5
5
  SHA512:
6
- metadata.gz: ed072a7f8ca8d2b2b7758da3cf1913865f28135da6d99be1159a154ac972acd278c574581d2ed8fd349c8f07664e8cc34a0ddfc5447041e3292d474d6a87e100
7
- data.tar.gz: 4dd300b6cf3338b1396c0c5211f85c419019588c2ccb01120f0b526742bc5eaae462c0de1d4fc3756e532bbeb00e8b82dee66f36f56978365d2aa55e6245fa77
6
+ metadata.gz: bd46a801786008a0b968c2fff2d00312c585fec23648eb4df49f115a6e79de95d8c8e801f78011727cbd2b4421c03a509c5167cd36454de3845e18d2fbf05886
7
+ data.tar.gz: 9dfe2bbc5cda78d60dafb9d468f5f87954699dad7dfd0a58dbe377c9185a1a7268e9ed73c1e3804079d56aeccea65d30f26e0baeac2dc58baca7926384ab260c
@@ -2,18 +2,17 @@ module Petrovich
2
2
  module Gender
3
3
  # A gender rule from the set of rules
4
4
  class Rule
5
- attr_reader :gender, :as, :suffix
5
+ attr_reader :gender, :as, :suffix, :accuracy
6
6
 
7
7
  # TODO: check options (see Case::Rule)
8
8
  def initialize(opts)
9
9
  @gender = opts[:gender]
10
10
  @as = opts[:as]
11
11
  @suffix = /#{opts[:suffix]}$/i
12
+ @accuracy = opts[:suffix].length
12
13
  end
13
14
 
14
- def match?(name, match_as)
15
- return false unless match_as == as
16
-
15
+ def match?(name)
17
16
  !!name.match(suffix)
18
17
  end
19
18
  end
@@ -15,14 +15,6 @@ module Petrovich
15
15
  @case_rules << rule
16
16
  end
17
17
 
18
- def add_gender_rule(rule)
19
- unless rule.is_a?(Gender::Rule)
20
- fail ArgumentError, 'Expecting rule of type Petrovich::Gender::Rule'.freeze
21
- end
22
-
23
- @gender_rules << rule
24
- end
25
-
26
18
  def find_all_case_rules(name, gender, as, known_gender = false)
27
19
  parts = name.split('-')
28
20
  parts.map.with_index { |part, index| find_case_rule(part, gender, as, (index == parts.count-1) && known_gender) }
@@ -34,7 +26,8 @@ module Petrovich
34
26
 
35
27
  def clear!
36
28
  @case_rules = []
37
- @gender_rules = []
29
+ @gender_rules = {}
30
+ @gender_exceptions = {}
38
31
  end
39
32
 
40
33
  def load!
@@ -70,16 +63,23 @@ module Petrovich
70
63
  # Load rules for genders
71
64
  def load_gender_rules!(rules)
72
65
  [:lastname, :firstname, :middlename].each do |name_part|
73
- # First, add androgynous rules. Order is matters.
74
66
  Petrovich::GENDERS.each do |section|
75
- entries = rules['gender'][name_part.to_s][section.to_s]
76
- next if entries.nil?
77
-
78
- entries.each do |entry|
67
+ entries = rules['gender'][name_part.to_s]['suffixes'][section.to_s]
68
+ Array(entries).each do |entry|
79
69
  load_gender_entry(name_part, section, entry)
80
70
  end
71
+
72
+ exceptions = rules['gender'][name_part.to_s]['exceptions']
73
+ @gender_exceptions[name_part] ||= {}
74
+ next if exceptions.nil?
75
+ Array(exceptions[section.to_s]).each do |exception|
76
+ @gender_exceptions[name_part][exception] = Gender::Rule.new(as: name_part, gender: section, suffix: exception)
77
+ end
81
78
  end
82
79
  end
80
+ @gender_rules.each do |_, gender_rules|
81
+ gender_rules.sort_by!{ |rule| -rule.accuracy }
82
+ end
83
83
  end
84
84
 
85
85
  def find_case_rule(name, gender, as, known_gender = false)
@@ -88,7 +88,7 @@ module Petrovich
88
88
  end
89
89
 
90
90
  def find_gender_rule(name, as)
91
- @gender_rules.find { |rule| rule.match?(name, as) }
91
+ @gender_exceptions[as][Unicode.downcase(name)] || @gender_rules[as].find{ |rule| rule.match?(name) }
92
92
  end
93
93
 
94
94
  def load_case_entry(as, section, entry)
@@ -99,6 +99,7 @@ module Petrovich
99
99
  end
100
100
 
101
101
  tests = entry['test'].map do |suffix|
102
+ suffix = "^#{suffix}" if section == :exceptions
102
103
  Petrovich::Case::Rule::Test.new(suffix)
103
104
  end
104
105
 
@@ -113,11 +114,8 @@ module Petrovich
113
114
  end
114
115
 
115
116
  def load_gender_entry(as, section, entry)
116
- add_gender_rule Gender::Rule.new(
117
- as: as,
118
- gender: section,
119
- suffix: entry
120
- )
117
+ @gender_rules[as] ||= []
118
+ @gender_rules[as] << Gender::Rule.new(as: as, gender: section, suffix: entry)
121
119
  end
122
120
  end
123
121
  end
@@ -1,3 +1,3 @@
1
1
  module Petrovich
2
- VERSION = '1.1.0'
2
+ VERSION = '1.1.1'
3
3
  end
@@ -2,9 +2,10 @@
2
2
 
3
3
  require 'csv'
4
4
 
5
- def check!(errors, correct, total, lemma, gender, gcase, expected)
6
- petrovich = Petrovich(lastname: lemma, gender: gender)
7
- actual = Petrovich::Unicode.upcase(petrovich.public_send(gcase).lastname)
5
+ def check!(errors, correct, total, name, gender, gcase, expected)
6
+ petrovich = Petrovich(name.merge(gender: gender))
7
+ lemma = name.values.join(' ')
8
+ actual = Petrovich::Unicode.upcase(petrovich.public_send(gcase).to_s)
8
9
  total[[gender, gcase]] += 1
9
10
  if actual == expected
10
11
  correct[[gender, gcase]] += 1
@@ -15,18 +16,36 @@ def check!(errors, correct, total, lemma, gender, gcase, expected)
15
16
  end
16
17
  end
17
18
 
18
- desc 'Evaluate the inflector on lastnames'
19
- task :evaluate => :petrovich do
20
- filename = File.expand_path('../../../eval/surnames.tsv', __FILE__)
21
- errors_filename = ENV['errors'] || 'errors.tsv'
19
+ def figure_namepart(args)
20
+ namepart_filename = args[:namepart] || "surnames"
21
+ namepart_filename += 's' unless namepart_filename.end_with?('s')
22
+ namepart_symbol = namepart_filename.chop.to_sym
23
+ namepart_symbol = :lastname if namepart_symbol == :surname
24
+ namepart_symbol = :middlename if namepart_symbol == :midname
25
+ namepart_filename += ".#{args[:subset]}" if args[:subset]
26
+ [namepart_filename, namepart_symbol]
27
+ end
28
+
29
+ desc 'Evaluate Petrovich'
30
+ task :evaluate, [:namepart, :subset] => [:'evaluate:rules', :'evaluate:gender']
31
+
32
+ namespace :evaluate do
33
+ desc 'Evaluate the inflector on lastnames'
34
+ task :rules, [:namepart, :subset] => :petrovich do |_, args|
35
+ namepart_filename, namepart_symbol = figure_namepart(args)
36
+ filename = File.expand_path("../../../eval/#{namepart_filename}.tsv", __FILE__)
37
+ unless File.file?(filename)
38
+ warn "File #{filename} not found, skipping task"
39
+ next
40
+ end
41
+ errors_filename = ENV['errors'] || 'errors.tsv'
22
42
 
23
- correct, total = Hash.new(0), Hash.new(0)
43
+ correct, total = Hash.new(0), Hash.new(0)
24
44
 
25
- puts 'I will evaluate the inflector on "%s" ' \
26
- 'and store errors to "%s".' % [filename, errors_filename]
45
+ puts 'I will evaluate the inflector on "%s" ' \
46
+ 'and store errors to "%s".' % [filename, errors_filename]
27
47
 
28
- CSV.open(errors_filename, 'w', col_sep: "\t") do |errors|
29
- errors << %w(lemma expected actual params)
48
+ errors = []
30
49
 
31
50
  CSV.open(filename, "r:BINARY", col_sep: "\t", headers: true).each do |row|
32
51
  word = row['word'].force_encoding('UTF-8')
@@ -43,81 +62,110 @@ task :evaluate => :petrovich do
43
62
  if grammemes.include? '0'
44
63
  # some words are aptotic so we have to ensure that
45
64
  Petrovich::CASES.each do |gcase|
46
- check!(errors, correct, total, lemma, gender, gcase, word)
65
+ check!(errors, correct, total, { namepart_symbol => lemma }, gender, gcase, word)
47
66
  end
48
67
  elsif grammemes.include? 'им'
49
- check!(errors, correct, total, lemma, gender, :nominative, word)
68
+ check!(errors, correct, total, { namepart_symbol => lemma }, gender, :nominative, word)
50
69
  elsif grammemes.include? 'рд'
51
- check!(errors, correct, total, lemma, gender, :genitive, word)
70
+ check!(errors, correct, total, { namepart_symbol => lemma }, gender, :genitive, word)
52
71
  elsif grammemes.include? 'дт'
53
- check!(errors, correct, total, lemma, gender, :dative, word)
72
+ check!(errors, correct, total, { namepart_symbol => lemma }, gender, :dative, word)
54
73
  elsif grammemes.include? 'вн'
55
- check!(errors, correct, total, lemma, gender, :accusative, word)
74
+ check!(errors, correct, total, { namepart_symbol => lemma }, gender, :accusative, word)
56
75
  elsif grammemes.include? 'тв'
57
- check!(errors, correct, total, lemma, gender, :instrumental, word)
76
+ check!(errors, correct, total, { namepart_symbol => lemma }, gender, :instrumental, word)
58
77
  elsif grammemes.include? 'пр'
59
- check!(errors, correct, total, lemma, gender, :prepositional, word)
78
+ check!(errors, correct, total, { namepart_symbol => lemma }, gender, :prepositional, word)
60
79
  end
61
80
  end
62
- end
63
81
 
64
- total.each do |(gender, gcase), correct_count|
65
- accuracy = correct[[gender, gcase]] / correct_count.to_f * 100
66
- puts "\tAc(%s|%s) = %.4f%%" % [gcase, gender, accuracy]
67
- end
82
+ errors.sort_by!{ |array| array.first.reverse + array.last.first.to_s }
83
+
84
+ CSV.open(errors_filename, 'w', col_sep: "\t") do |errors_file|
85
+ errors_file << %w(lemma expected actual params)
86
+ errors.each do |array|
87
+ errors_file << array
88
+ end
89
+ end
68
90
 
69
- correct_size = correct.values.inject(&:+)
70
- total_size = total.values.inject(&:+)
91
+ total.each do |(gender, gcase), correct_count|
92
+ accuracy = correct[[gender, gcase]] / correct_count.to_f * 100
93
+ puts "\tAc(%s|%s) = %.4f%%" % [gcase, gender, accuracy]
94
+ end
71
95
 
72
- puts 'Well, the accuracy on %d examples is about %.4f%%.' %
73
- [total_size, (correct_size / total_size.to_f * 100)]
96
+ correct_size = correct.values.inject(&:+).to_i
97
+ total_size = total.values.inject(&:+).to_i
74
98
 
75
- puts 'Sum of the %d correct examples and %d mistakes is %d.' %
76
- [correct_size, total_size - correct_size, total_size]
77
- end
99
+ puts 'Well, the accuracy on %d examples is about %.4f%%.' %
100
+ [total_size, (correct_size / total_size.to_f * 100)]
78
101
 
79
- desc 'Evaluate gender detector'
80
- task :detect => :petrovich do
81
- GENDER_MAP = { 'мр' => :male, 'жр' => :female, 'мр-жр' => :androgynous }
102
+ puts 'Sum of the %d correct examples and %d mistakes is %d.' %
103
+ [correct_size, total_size - correct_size, total_size]
104
+ end
82
105
 
83
- filename = File.expand_path('../../../eval/surnames.gender.tsv', __FILE__)
84
- errors_filename = ENV['errors'] || 'errors.gender.tsv'
106
+ desc 'Evaluate the gender detector'
107
+ task :gender, [:namepart, :subset] => :petrovich do |_, args|
108
+ GENDER_MAP = { 'мр' => :male, 'жр' => :female, 'мр-жр' => :androgynous }
85
109
 
86
- correct, total = Hash.new(0), Hash.new(0)
110
+ namepart_filename, namepart_symbol = figure_namepart(args)
111
+ filename = File.expand_path("../../../eval/#{namepart_filename}.gender.tsv", __FILE__)
112
+ unless File.file?(filename)
113
+ warn "File #{filename} not found, skipping task"
114
+ next
115
+ end
116
+ errors_filename = ENV['errors'] || 'errors.gender.tsv'
87
117
 
88
- puts 'I will evaluate gender detector on "%s" ' \
89
- 'and store errors to "%s".' % [filename, errors_filename]
118
+ correct, total = Hash.new(0), Hash.new(0)
90
119
 
91
- CSV.open(errors_filename, 'w', col_sep: "\t") do |errors|
92
- errors << %w(lemma expected actual)
120
+ puts 'I will evaluate gender detector on "%s" ' \
121
+ 'and store errors to "%s".' % [filename, errors_filename]
122
+
123
+ errors = []
124
+ hard_error_count = 0
93
125
 
94
126
  CSV.open(filename, "r:BINARY", col_sep: "\t", headers: true).each do |row|
95
127
  lemma = row['lemma'].force_encoding('UTF-8')
96
128
  gender_name = row['gender'].force_encoding('UTF-8')
97
129
  expected_gender = GENDER_MAP[gender_name]
98
130
 
99
- detected_gender = Petrovich(lastname: lemma).gender
131
+ detected_gender = Petrovich(namepart_symbol => lemma).gender
100
132
 
101
133
  total[expected_gender] += 1
102
134
  if detected_gender == expected_gender
103
135
  correct[expected_gender] += 1
104
136
  else
105
137
  errors << [lemma, expected_gender, detected_gender]
138
+ if detected_gender != :androgynous
139
+ hard_error_count += 1
140
+ warn " - #{Petrovich::Unicode.downcase(lemma)}"
141
+ end
106
142
  end
107
143
  end
108
- end
109
144
 
110
- total.each do |gender, correct_count|
111
- accuracy = correct[gender] / correct_count.to_f * 100
112
- puts "\tAc(%s) = %.4f%%" % [gender, accuracy]
113
- end
145
+ puts 'Hard error count: %d.' % [hard_error_count]
114
146
 
115
- correct_size = correct.values.inject(&:+)
116
- total_size = total.values.inject(&:+)
147
+ PART_INDEX = {:female => 0, :male => 1, :androgynous => 3}
148
+ errors.sort_by!{ |array| array.first.reverse + PART_INDEX[array[1]].to_s }
117
149
 
118
- puts 'Well, the accuracy on %d examples is about %.4f%%.' %
119
- [total_size, (correct_size / total_size.to_f * 100)]
150
+ CSV.open(errors_filename, 'w', col_sep: "\t") do |errors_file|
151
+ errors_file << %w(lemma expected actual)
152
+ errors.each do |array|
153
+ errors_file << array
154
+ end
155
+ end
120
156
 
121
- puts 'Sum of the %d correct examples and %d mistakes is %d.' %
122
- [correct_size, total_size - correct_size, total_size]
157
+ total.each do |gender, correct_count|
158
+ accuracy = correct[gender] / correct_count.to_f * 100
159
+ puts "\tAc(%s) = %.4f%%" % [gender, accuracy]
160
+ end
161
+
162
+ correct_size = correct.values.inject(&:+).to_i
163
+ total_size = total.values.inject(&:+).to_i
164
+
165
+ puts 'Well, the accuracy on %d examples is about %.4f%%.' %
166
+ [total_size, (correct_size / total_size.to_f * 100)]
167
+
168
+ puts 'Sum of the %d correct examples and %d mistakes is %d.' %
169
+ [correct_size, total_size - correct_size, total_size]
170
+ end
123
171
  end
@@ -3,127 +3,482 @@ gender:
3
3
  lastname:
4
4
  # Здесь андрогинные фамилии не выделены в отдельную группу. Если в группе female и male
5
5
  # не будет найдено совпадений, то фамилия будет считаться андрогинной.
6
- female:
7
- - ова
8
- - ая
9
- - ына
10
- - ина
11
- - ева
12
- - ска
13
- - ёва
14
- male:
15
- - кий
16
- - ов
17
- - ын
18
- - ев
19
- - ин
20
- - ёв
21
- - хий
22
- - ний
23
- - ый
24
- - ой
6
+ exceptions:
7
+ androgynous:
8
+ - бова
9
+ - регин
10
+ - дарвин
11
+ - пэйлин
12
+ - грин
13
+ - цин
14
+ - шенгелая
15
+ suffixes:
16
+ female:
17
+ - ова
18
+ - ая
19
+ - ына
20
+ - ина
21
+ - ева
22
+ - ска
23
+ - ёва
24
+ male:
25
+ - кий
26
+ - ов
27
+ - ын
28
+ - ев
29
+ - ин
30
+ - ёв
31
+ - хий
32
+ - ний
33
+ - ый
34
+ - ой
25
35
  firstname:
26
- # Исключения - андрогинные имена
27
- androgynous:
28
- - ким
29
- - никита
30
- - саша
31
- - женя
32
- male:
33
- - кузьма
34
- - лука
35
- - савва
36
- - фома
37
- - ей
38
- - ий
39
- - ый
40
- - ой
41
- - др
42
- - тр
43
- - ел
44
- - ан
45
- - им
46
- - д
47
- - ис
48
- - рт
49
- - кт
50
- - ар
51
- - ен
52
- - ав
53
- - он
54
- - ил
55
- - ир
56
- - их
57
- - ри
58
- - аф
59
- - ор
60
- - рь
61
- - жи
62
- - ат
63
- - иф
64
- - ья
65
- - нт
66
- - к
67
- - ст
68
- - ян
69
- female:
70
- - фанни
71
- - фаня
72
- - жаден
73
- - жейден
74
- - ия
75
- - а
76
- - ся
77
- - ина
78
- - та
79
- - сья
80
- - ля
81
- - оя
82
- - да
83
- - йя
84
- - ея
85
- - вья
86
- - нья
87
- - ая
88
- - ель
89
- - ико
90
- - фья
91
- - рья
92
- - лья
93
- - биргит
94
- - илзе
95
- - овь
96
- - елли
97
- - ои
98
- - гюль
99
- - ес
100
- - есс
101
- - есси
102
- - естин
103
- - естини
104
- - истин
105
- - ети
106
- - нет
107
- - сти
108
- - сми
109
- - лин
110
- - линн
111
- - ейн
112
- - нифер
113
- - женни
114
- - еннис
115
- - енн
116
- - инн
117
- - ерин
118
- - ляра
119
- - лярам
36
+ # сортировка по окончанию
37
+ exceptions:
38
+ androgynous:
39
+ - сева
40
+ - иона
41
+ - муса
42
+ - саша
43
+ - алвард
44
+ - валери
45
+ - кири
46
+ - анри
47
+ - ким
48
+ - райхон
49
+ - закия
50
+ - захария
51
+ - женя
52
+ male:
53
+ - абиба
54
+ - савва
55
+ - лёва
56
+ - вова
57
+ - ага
58
+ - ахмедага
59
+ - алиага
60
+ - амирага
61
+ - агга
62
+ - серега
63
+ - фейга
64
+ - гога
65
+ - алиада
66
+ - муктада
67
+ - абида
68
+ - алда
69
+ - маджуда
70
+ - нурлыхуда
71
+ - гиа
72
+ - элиа
73
+ - гарсиа
74
+ - вавила
75
+ - гавриила
76
+ - генка
77
+ - лука
78
+ - дима
79
+ - зосима
80
+ - тима
81
+ - фима
82
+ - фома
83
+ - кузьма
84
+ - жора
85
+ - миша
86
+ - ермила
87
+ - данила
88
+ - гаврила
89
+ - абдалла
90
+ - аталла
91
+ - абдилла
92
+ - атилла
93
+ - кайролла
94
+ - абулла
95
+ - абула
96
+ - свитлана
97
+ - бена
98
+ - гена
99
+ - агелина
100
+ - джанна
101
+ - кришна
102
+ - степа
103
+ - дра
104
+ - назера
105
+ - валера
106
+ - эстера
107
+ - двойра
108
+ - калистра
109
+ - заратустра
110
+ - юра
111
+ - иса
112
+ - аиса
113
+ - халиса
114
+ - холиса
115
+ - валенса
116
+ - мусса
117
+ - ата
118
+ - паата
119
+ - алета
120
+ - никита
121
+ - мота
122
+ - шота
123
+ - фаста
124
+ - коста
125
+ - маритта
126
+ - малюта
127
+ - васюта
128
+ - вафа
129
+ - мустафа
130
+ - ганифа
131
+ - лев
132
+ - яков
133
+ - шелли
134
+ - константин
135
+ - марсель
136
+ - рамиль
137
+ - эмиль
138
+ - бактыгуль
139
+ - даниэль
140
+ - игорь
141
+ - арминэ
142
+ - изя
143
+ - кузя
144
+ - гия
145
+ - мазия
146
+ - кирикия
147
+ - ркия
148
+ - еркия
149
+ - эркия
150
+ - гулия
151
+ - аксания
152
+ - закария
153
+ - зекерия
154
+ - гарсия
155
+ - шендля
156
+ - филя
157
+ - вилля
158
+ - толя
159
+ - ваня
160
+ - саня
161
+ - загиря
162
+ - боря
163
+ - цайся
164
+ - вася
165
+ - ося
166
+ - петя
167
+ - витя
168
+ - митя
169
+ - костя
170
+ - алья
171
+ - илья
172
+ - ларья
173
+ female:
174
+ - судаба
175
+ - сураба
176
+ - любава
177
+ - джанлука
178
+ - варвара
179
+ - наташа
180
+ - зайнаб
181
+ - любов
182
+ - сольвейг
183
+ - шакед
184
+ - аннаид
185
+ - ингрид
186
+ - синди
187
+ - аллаберди
188
+ - сандали
189
+ - лали
190
+ - натали
191
+ - гулькай
192
+ - алтынай
193
+ - гюнай
194
+ - гюльчитай
195
+ - нурангиз
196
+ - лиз
197
+ - элиз
198
+ - ботагоз
199
+ - юлдуз
200
+ - диляфруз
201
+ - габи
202
+ - сажи
203
+ - фанни
204
+ - мери
205
+ - элдари
206
+ - эльдари
207
+ - хилари
208
+ - хиллари
209
+ - аннемари
210
+ - розмари
211
+ - товсари
212
+ - ансари
213
+ - одри
214
+ - тери
215
+ - ири
216
+ - катри
217
+ - мэри
218
+ - сатаней
219
+ - ефтений
220
+ - верунчик
221
+ - гюзел
222
+ - этел
223
+ - рэйчел
224
+ - джил
225
+ - мерил
226
+ - нинелл
227
+ - бурул
228
+ - ахлам
229
+ - майрам
230
+ - махаррам
231
+ - мириам
232
+ - дилярам
233
+ - асем
234
+ - мерьем
235
+ - мирьем
236
+ - эркаим
237
+ - гулаим
238
+ - айгерим
239
+ - марьям
240
+ - мирьям
241
+ - эван
242
+ - гульжиган
243
+ - айдан
244
+ - айжан
245
+ - вивиан
246
+ - гульжиан
247
+ - лилиан
248
+ - мариан
249
+ - саиман
250
+ - джоан
251
+ - чулпан
252
+ - лоран
253
+ - моран
254
+ - джохан
255
+ - гульшан
256
+ - аделин
257
+ - жаклин
258
+ - карин
259
+ - каролин
260
+ - каталин
261
+ - катрин
262
+ - керстин
263
+ - кэтрин
264
+ - мэрилин
265
+ - рузалин
266
+ - хелин
267
+ - цеткин
268
+ - ширин
269
+ - элисон
270
+ - дурсун
271
+ - кристин
272
+ - гульжиян
273
+ - марьян
274
+ - ренато
275
+ - зейнеп
276
+ - санабар
277
+ - дильбар
278
+ - гулизар
279
+ - гульзар
280
+ - пилар
281
+ - дагмар
282
+ - элинар
283
+ - нилуфар
284
+ - анхар
285
+ - гаухар
286
+ - естер
287
+ - эстер
288
+ - дженнифер
289
+ - линор
290
+ - элинор
291
+ - элеонор
292
+ - айнур
293
+ - гульнур
294
+ - шамсинур
295
+ - элнур
296
+ - ильсияр
297
+ - нигяр
298
+ - сигитас
299
+ - агнес
300
+ - анес
301
+ - долорес
302
+ - инес
303
+ - анаис
304
+ - таис
305
+ - эллис
306
+ - элис
307
+ - кларис
308
+ - амнерис
309
+ - айрис
310
+ - дорис
311
+ - беатрис
312
+ - грейс
313
+ - грэйс
314
+ - ботагос
315
+ - маргос
316
+ - джулианс
317
+ - арус
318
+ - диляфрус
319
+ - саодат
320
+ - зулхижат
321
+ - хамат
322
+ - патимат
323
+ - хатимат
324
+ - альжанат
325
+ - маймунат
326
+ - гульшат
327
+ - биргит
328
+ - рут
329
+ - иргаш
330
+ - айнаш
331
+ - агнеш
332
+ - зауреш
333
+ - тэрбиш
334
+ - ануш
335
+ - азгануш
336
+ - гаруш
337
+ - николь
338
+ - адась
339
+ - афиля
340
+ - тафиля
341
+ - фаня
342
+ - аня
343
+ suffixes:
344
+ androgynous:
345
+ - улла
346
+ male:
347
+ - аба
348
+ - б
349
+ - ав
350
+ - ев
351
+ - ов
352
+ - г
353
+ - д
354
+ - ж
355
+ - з
356
+ - би
357
+ - ди
358
+ - жи
359
+ - али
360
+ - ри
361
+ - ай
362
+ - ей
363
+ - ий
364
+ - ой
365
+ - ый
366
+ - к
367
+ - л
368
+ - ам
369
+ - ем
370
+ - им
371
+ - ом
372
+ - ум
373
+ - ым
374
+ - ям
375
+ - ан
376
+ - бен
377
+ - вен
378
+ - ген
379
+ - ден
380
+ - ин
381
+ - сейн
382
+ - он
383
+ - ун
384
+ - ян
385
+ - ио
386
+ - ло
387
+ - ро
388
+ - то
389
+ - шо
390
+ - п
391
+ - ар
392
+ - др
393
+ - ер
394
+ - ир
395
+ - ор
396
+ - тр
397
+ - ур
398
+ - ыр
399
+ - яр
400
+ - ас
401
+ - ес
402
+ - ис
403
+ - йс
404
+ - кс
405
+ - мс
406
+ - ос
407
+ - нс
408
+ - рс
409
+ - ус
410
+ - юс
411
+ - яс
412
+ - ат
413
+ - мет
414
+ - кт
415
+ - нт
416
+ - рт
417
+ - ст
418
+ - ут
419
+ - ф
420
+ - х
421
+ - ш
422
+ - ы
423
+ - сь
424
+ - емеля
425
+ - коля
426
+ female:
427
+ - иба
428
+ - люба
429
+ - лава
430
+ - ева
431
+ - га
432
+ - да
433
+ - еа
434
+ - иза
435
+ - иа
436
+ - ика
437
+ - нка
438
+ - ска
439
+ - ела
440
+ - ила
441
+ - лла
442
+ - эла
443
+ - има
444
+ - на
445
+ - ра
446
+ - са
447
+ - та
448
+ - фа
449
+ - елли
450
+ - еса
451
+ - сса
452
+ - гуль
453
+ - нуэль
454
+ - гюль
455
+ - нэ
456
+ - ая
457
+ - ея
458
+ - ия
459
+ - йя
460
+ - ля
461
+ - мя
462
+ - оя
463
+ - ря
464
+ - ся
465
+ - вья
466
+ - лья
467
+ - мья
468
+ - нья
469
+ - рья
470
+ - сья
471
+ - тья
472
+ - фья
473
+ - зя
120
474
  middlename:
121
- female:
122
- - на
123
- - кызы
124
- - гызы
125
- male:
126
- - ич
127
- - оглы
128
- - улы
129
- - уулу
475
+ suffixes:
476
+ female:
477
+ - на
478
+ - кызы
479
+ - гызы
480
+ male:
481
+ - ич
482
+ - оглы
483
+ - улы
484
+ - уулу
@@ -186,6 +186,11 @@ lastname:
186
186
  test: [ок]
187
187
  mods: [--ка, --ку, --ка, --ком, --ке]
188
188
 
189
+ # Коломиец
190
+ - gender: male
191
+ test: [иец, еец]
192
+ mods: [--йца, --йцу, --йца, --йцом, --йце]
193
+
189
194
  # Кравец
190
195
  - gender: male
191
196
  test: [ец]
@@ -230,16 +235,20 @@ firstname:
230
235
  mods: [., ., ., ., .]
231
236
 
232
237
  - gender: female
233
- test: [рашель, нинель, николь, габриэль, даниэль]
234
- mods: [., ., ., ., .]
238
+ test: [агидель, жизель, нинель, рашель, рахиль]
239
+ mods: [-и, -и, ., ю, ]
235
240
 
236
241
  suffixes:
237
242
  - gender: androgynous
238
243
  test: [е, ё, и, о, у, ы, э, ю]
239
244
  mods: [., ., ., ., .]
240
245
 
246
+ - gender: male
247
+ test: [уа, иа]
248
+ mods: [., ., ., ., .]
249
+
241
250
  - gender: female
242
- test: [б, в, г, д, ж, з, й, к, л, м, н, п, р, с, т, ф, х, ц, ч, ш, щ, ъ]
251
+ test: [б, в, г, д, ж, з, й, к, л, м, н, п, р, с, т, ф, х, ц, ч, ш, щ, ъ, иа, ль]
243
252
  mods: [., ., ., ., .]
244
253
 
245
254
  - gender: female
@@ -260,6 +269,11 @@ firstname:
260
269
  test: [ша]
261
270
  mods: [-и, -е, -у, -ей, -е]
262
271
 
272
+ # Даша, Саша
273
+ - gender: male
274
+ test: [ша, ча, жа]
275
+ mods: [-и, -е, -у, -ей, -е]
276
+
263
277
  - gender: androgynous
264
278
  test: [а]
265
279
  mods: [-ы, -е, -у, -ой, -е]
@@ -269,6 +283,16 @@ firstname:
269
283
  test: [ия]
270
284
  mods: [-и, -и, -ю, -ей, -и]
271
285
 
286
+ # Майка
287
+ - gender: female
288
+ test: [ка, га, ха]
289
+ mods: [-и, -е, -у, -ой, -е]
290
+
291
+ # Марица
292
+ - gender: female
293
+ test: [ца]
294
+ mods: [-ы, -е, -у, -ей, -е]
295
+
272
296
  # Светлана
273
297
  - gender: female
274
298
  test: [а]
@@ -287,15 +311,19 @@ firstname:
287
311
  test: [я]
288
312
  mods: [-и, -е, -ю, -ей, -е]
289
313
 
314
+ # Афанасий
315
+ - gender: male
316
+ test: [ий]
317
+ mods: [-я, -ю, -я, -ем, -и]
318
+
290
319
  # Андрей, *
291
320
  - gender: male
292
321
  test: [ей, й]
293
322
  mods: [-я, -ю, -я, -ем, -е]
294
323
 
295
- # Афанасий
296
324
  - gender: male
297
- test: [ий]
298
- mods: [-я, -ю, -я, -ем, ]
325
+ test: [ш, ж]
326
+ mods: [а, у, а, ем, е]
299
327
 
300
328
  - gender: male
301
329
  test: [б, в, г, д, ж, з, к, л, м, н, п, р, с, т, ф, х, ц, ч]
@@ -314,6 +342,10 @@ middlename:
314
342
  tags: [first_word]
315
343
 
316
344
  suffixes:
345
+ - gender: male
346
+ test: [мич, ьич, кич]
347
+ mods: [а, у, а, ом, е]
348
+
317
349
  - gender: male
318
350
  test: [ич]
319
351
  mods: [а, у, а, ем, е]
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.1.0
4
+ version: 1.1.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-07-20 00:00:00.000000000 Z
12
+ date: 2016-07-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake