petrovich 0.2.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,12 @@
1
+ module Petrovich
2
+ # Value-object for name
3
+ class Value
4
+ attr_accessor :firstname, :lastname, :middlename
5
+
6
+ def initialize(name)
7
+ @firstname = name[:firstname]
8
+ @lastname = name[:lastname]
9
+ @middlename = name[:middlename]
10
+ end
11
+ end
12
+ end
@@ -1,39 +1,22 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'csv'
4
- require 'petrovich/unicode'
5
-
6
- class Object
7
- include Petrovich::Unicode
8
- end
9
-
10
- CASES = [
11
- :nominative,
12
- :genitive,
13
- :dative,
14
- :accusative,
15
- :instrumental,
16
- :prepositional
17
- ]
18
4
 
19
5
  def check!(errors, correct, total, lemma, gender, gcase, expected)
20
- inflector = Petrovich.new(gender)
21
- inflection = upcase(inflector.lastname(lemma, gcase))
22
-
6
+ actual = Petrovich::Unicode.upcase(Petrovich(lastname: lemma).public_send(gcase).lastname)
23
7
  total[[gender, gcase]] += 1
24
-
25
- if inflection == expected
8
+ if actual == expected
26
9
  correct[[gender, gcase]] += 1
27
10
  true
28
11
  else
29
- errors << [lemma, expected, inflection, [gender, gcase]]
30
- inflection
12
+ errors << [lemma, expected, actual, [gender, gcase]]
13
+ actual
31
14
  end
32
15
  end
33
16
 
34
- desc 'Evaluate the inflector on surnames'
17
+ desc 'Evaluate the inflector on lastnames'
35
18
  task :evaluate => :petrovich do
36
- filename = File.expand_path('../../../spec/data/surnames.tsv', __FILE__)
19
+ filename = File.expand_path('../../../test/data/surnames.tsv', __FILE__)
37
20
  errors_filename = ENV['errors'] || 'errors.tsv'
38
21
 
39
22
  correct, total = Hash.new(0), Hash.new(0)
@@ -58,22 +41,21 @@ task :evaluate => :petrovich do
58
41
 
59
42
  if grammemes.include? '0'
60
43
  # some words are aptotic so we have to ensure that
61
- CASES.each do |gcase|
62
- check! errors, correct, total, lemma, gender, gcase, word
44
+ Petrovich::CASES.each do |gcase|
45
+ check!(errors, correct, total, lemma, gender, gcase, word)
63
46
  end
64
47
  elsif grammemes.include? 'им'
65
- check! errors, correct, total, lemma, gender, :nominative, word
48
+ check!(errors, correct, total, lemma, gender, :nominative, word)
66
49
  elsif grammemes.include? 'рд'
67
- check! errors, correct, total, lemma, gender, :genitive, word
50
+ check!(errors, correct, total, lemma, gender, :genitive, word)
68
51
  elsif grammemes.include? 'дт'
69
- check! errors, correct, total, lemma, gender, :dative, word
52
+ check!(errors, correct, total, lemma, gender, :dative, word)
70
53
  elsif grammemes.include? 'вн'
71
- check! errors, correct, total, lemma, gender, :accusative, word
54
+ check!(errors, correct, total, lemma, gender, :accusative, word)
72
55
  elsif grammemes.include? 'тв'
73
- # actually, it's called the instrumetal case
74
- check! errors, correct, total, lemma, gender, :instrumental, word
56
+ check!(errors, correct, total, lemma, gender, :instrumental, word)
75
57
  elsif grammemes.include? 'пр'
76
- check! errors, correct, total, lemma, gender, :prepositional, word
58
+ check!(errors, correct, total, lemma, gender, :prepositional, word)
77
59
  end
78
60
  end
79
61
  end
data/rules/rules.yml CHANGED
@@ -1,7 +1,9 @@
1
+ # Порядок имеет значение!
2
+ # http://to-name.ru/surname/familnye-okonchania.htm
3
+ # http://gramma.ru/SPR/?id=2.1
1
4
  lastname:
2
5
  exceptions:
3
6
  # Неизменяемые первые части двойных русских фамилий.
4
- #
5
7
  - gender: androgynous
6
8
  test:
7
9
  - бонч
@@ -47,153 +49,161 @@ lastname:
47
49
  test: [гава, орота]
48
50
  mods: [., ., ., ., .]
49
51
 
52
+ # Брыльска, *
50
53
  - gender: female
51
54
  test: [ска, цка]
52
55
  mods: [-ой, -ой, -ую, -ой, -ой]
53
56
 
57
+ # Дубовицкая, Суперанская, Лесная, Барановская
54
58
  - gender: female
55
59
  test: [цкая, ская, ная, ая]
56
60
  mods: [--ой, --ой, --ую, --ой, --ой]
57
61
 
62
+ # Зимняя
58
63
  - gender: female
59
64
  test: [яя]
60
65
  mods: [--ей, --ей, --юю, --ей, --ей]
61
66
 
62
- - gender: female
63
- test: [на]
64
- mods: [-ой, -ой, -у, -ой, -ой]
65
-
66
- - gender: male
67
- test: [иной]
68
- mods: [-я, -ю, -я, -ем, -е]
69
-
67
+ # *, Иллуй
70
68
  - gender: male
71
- test: [уй]
69
+ test: [иной, уй]
72
70
  mods: [-я, -ю, -я, -ем, -е]
73
71
 
72
+ # Ярица
74
73
  - gender: androgynous
75
74
  test: [ца]
76
75
  mods: [-ы, -е, -у, -ей, -е]
77
76
 
77
+ # Эрих
78
78
  - gender: male
79
79
  test: [рих]
80
80
  mods: [а, у, а, ом, е]
81
81
 
82
+ # Кантария
82
83
  - gender: androgynous
83
84
  test: [ия]
84
- mods: [., ., ., ., .]
85
+ mods: [-и, -и, -ю, -ей, ]
85
86
 
87
+ # Гулиа, *, *, Джабуа, *, *, *, *
86
88
  - gender: androgynous
87
89
  test: [иа, аа, оа, уа, ыа, еа, юа, эа]
88
90
  mods: [., ., ., ., .]
89
91
 
90
- - gender: male
91
- test: [их, ых]
92
- mods: [., ., ., ., .]
93
-
92
+ # Осипенко, *, Мегрэ, *, *, Хереску, *
94
93
  - gender: androgynous
95
94
  test: [о, е, э, и, ы, у, ю]
96
95
  mods: [., ., ., ., .]
97
96
 
97
+ # Широких, Больных
98
+ - gender: male
99
+ test: [их, ых]
100
+ mods: [., ., ., ., .]
101
+
102
+ # Кузнецова, Голубева, Скурихина
98
103
  - gender: female
99
- test: [ова, ева]
104
+ test: [ова, ева, на]
100
105
  mods: [-ой, -ой, -у, -ой, -ой]
101
106
 
107
+ # Басалыга, Лазука, Пидкуймуха, Бобча, Гуща, Рогожа, Кваша, Глоба
102
108
  - gender: androgynous
103
- test: [га, ка, ха, ча, ща, жа, ша]
109
+ test: [га, ка, ха, ча, ща, жа, ша, a]
104
110
  mods: [-и, -е, -у, -ой, -е]
105
111
 
106
- - gender: androgynous
107
- test: [а]
108
- mods: [-ы, -е, -у, -ой, -е]
109
-
112
+ # Белоконь
110
113
  - gender: male
111
114
  test: [ь]
112
115
  mods: [-я, -ю, -я, -ем, -е]
113
116
 
114
- - gender: androgynous
115
- test: [ия]
116
- mods: [-и, -и, -ю, -ей, -и]
117
-
117
+ # Фидря
118
118
  - gender: androgynous
119
119
  test: [я]
120
120
  mods: [-и, -е, -ю, -ей, -е]
121
121
 
122
+ # Воробей
123
+ - gender: male
124
+ test: [обей]
125
+ mods: [--ья, --ью, --ья, --ьем, --ье]
126
+
127
+ # Кочубей
122
128
  - gender: male
123
129
  test: [ей]
124
130
  mods: [-я, -ю, -я, -ем, -е]
125
131
 
132
+ # Хачикян, Богдан, *
126
133
  - gender: male
127
134
  test: [ян, ан, йн]
128
135
  mods: [а, у, а, ом, е]
129
136
 
137
+ # Волынец, Горобец
130
138
  - gender: male
131
139
  test: [ынец, обец]
132
140
  mods: [--ца, --цу, --ца, --цем, --це]
133
141
 
142
+ # *, Быховец
143
+ # TODO: Проверить Брагинец
134
144
  - gender: male
135
145
  test: [онец, овец]
136
146
  mods: [--ца, --цу, --ца, --цом, --це]
137
147
 
148
+ # Порывай
138
149
  - gender: male
139
150
  test: [ай]
140
151
  mods: [-я, -ю, -я, -ем, -е]
141
152
 
153
+ # Дорогой, Руцкой
142
154
  - gender: male
143
- test: [кой]
144
- mods: [-го, -му, -го, --им, -м]
145
-
146
- - gender: male
147
- test: [гой]
155
+ test: [гой, кой]
148
156
  mods: [-го, -му, -го, --им, -м]
149
157
 
158
+ # Беpеговой
150
159
  - gender: male
151
160
  test: [ой]
152
161
  mods: [-го, -му, -го, --ым, -м]
153
162
 
163
+ # *, *
154
164
  - gender: male
155
165
  test: [ах, ив]
156
166
  mods: [а, у, а, ом, е]
157
167
 
168
+ # *, *, *, *
158
169
  - gender: male
159
170
  test: [ший, щий, жий, ний]
160
171
  mods: [--его, --ему, --его, -м, --ем]
161
172
 
162
173
  - gender: male
163
- test: [ый]
164
- mods: [--ого, --ому, --ого, -м, --ом]
165
-
166
- - gender: male
167
- test: [кий]
174
+ test: [ый, кий]
168
175
  mods: [--ого, --ому, --ого, -м, --ом]
169
176
 
177
+ # Хорунжий
170
178
  - gender: male
171
179
  test: [ий]
172
180
  mods: [-я, -ю, -я, -ем, -и]
173
181
 
182
+ # Починок
174
183
  - gender: male
175
184
  test: [ок]
176
185
  mods: [--ка, --ку, --ка, --ком, --ке]
177
186
 
187
+ # Кравец
178
188
  - gender: male
179
189
  test: [ец]
180
190
  mods: [--ца, --цу, --ца, --цом, --це]
181
191
 
192
+ # Лившиц, Концевич, Гармаш, Хрущ
182
193
  - gender: male
183
194
  test: [ц, ч, ш, щ]
184
195
  mods: [а, у, а, ем, е]
185
196
 
197
+ # Любен, Манн, Гордон, Прядун
186
198
  - gender: male
187
- test: [ен, нн, он, ун]
199
+ test: [ен, нн, он, ун, б, г, д, ж, з, к, л, м, п, р, с, т, ф, х]
188
200
  mods: [а, у, а, ом, е]
189
201
 
202
+ # Петров, Левин
190
203
  - gender: male
191
204
  test: [в, н]
192
205
  mods: [а, у, а, ым, е]
193
206
 
194
- - gender: male
195
- test: [б, г, д, ж, з, к, л, м, п, р, с, т, ф, х]
196
- mods: [а, у, а, ом, е]
197
207
 
198
208
  firstname:
199
209
  exceptions:
@@ -234,6 +244,7 @@ firstname:
234
244
  test: [ь]
235
245
  mods: [-и, -и, ., ю, -и]
236
246
 
247
+ # Олесь
237
248
  - gender: male
238
249
  test: [ь]
239
250
  mods: [-я, -ю, -я, -ем, -е]
@@ -242,6 +253,7 @@ firstname:
242
253
  test: [га, ка, ха, ча, ща, жа]
243
254
  mods: [-и, -е, -у, -ой, -е]
244
255
 
256
+ # Даша, Саша
245
257
  - gender: female
246
258
  test: [ша]
247
259
  mods: [-и, -е, -у, -ей, -е]
@@ -250,14 +262,17 @@ firstname:
250
262
  test: [а]
251
263
  mods: [-ы, -е, -у, -ой, -е]
252
264
 
265
+ # Зульфия
253
266
  - gender: female
254
267
  test: [ия]
255
268
  mods: [-и, -и, -ю, -ей, -и]
256
269
 
270
+ # Светлана
257
271
  - gender: female
258
272
  test: [а]
259
273
  mods: [-ы, -е, -у, -ой, -е]
260
274
 
275
+ # Юлия
261
276
  - gender: female
262
277
  test: [я]
263
278
  mods: [-и, -е, -ю, -ей, -е]
@@ -270,18 +285,16 @@ firstname:
270
285
  test: [я]
271
286
  mods: [-и, -е, -ю, -ей, -е]
272
287
 
288
+ # Андрей, *
273
289
  - gender: male
274
- test: [ей]
290
+ test: [ей, й]
275
291
  mods: [-я, -ю, -я, -ем, -е]
276
292
 
293
+ # Афанасий
277
294
  - gender: male
278
295
  test: [ий]
279
296
  mods: [-я, -ю, -я, -ем, -и]
280
297
 
281
- - gender: male
282
- test: [й]
283
- mods: [-я, -ю, -я, -ем, -е]
284
-
285
298
  - gender: male
286
299
  test: [б, в, г, д, ж, з, к, л, м, н, п, р, с, т, ф, х, ц, ч]
287
300
  mods: [а, у, а, ом, е]
@@ -291,6 +304,13 @@ firstname:
291
304
  mods: [-и, -и, -ю, -ем, -ем]
292
305
 
293
306
  middlename:
307
+ exceptions:
308
+ - gender: androgynous
309
+ test:
310
+ - борух
311
+ mods: [., ., ., ., .]
312
+ tags: [first_word]
313
+
294
314
  suffixes:
295
315
  - gender: male
296
316
  test: [ич]
@@ -299,3 +319,125 @@ middlename:
299
319
  - gender: female
300
320
  test: [на]
301
321
  mods: [-ы, -е, -у, -ой, -е]
322
+
323
+ # Эвристики для определения пола
324
+ gender:
325
+ lastname:
326
+ # Здесь андрогенные фамилии не выделены в отдельную группу. Если в группе female и male
327
+ # не будет найдено совпадений, то фамилия будет считаться андрогенной.
328
+ female:
329
+ - ова
330
+ - кая
331
+ - на
332
+ - ина
333
+ - ева
334
+ - вая
335
+ - ска
336
+ - ная
337
+ male:
338
+ - кий
339
+ - ов
340
+ - ын
341
+ - ев
342
+ - ин
343
+ firstname:
344
+ # Исключения - андрогенные имена
345
+ androgynous:
346
+ - ким
347
+ - никита
348
+ - саша
349
+ - женя
350
+ male:
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
+ female:
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
+ - сти
427
+ - сми
428
+ - лин
429
+ - линн
430
+ - ейн
431
+ - нифер
432
+ - женни
433
+ - еннис
434
+ - енн
435
+ - инн
436
+ - ерин
437
+ - ляра
438
+ - лярам
439
+ middlename:
440
+ female:
441
+ - на
442
+ male:
443
+ - ич