petrovich 1.0.1 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 949de8e61c2087dace03572893fe90b5cbb4be2c
4
- data.tar.gz: 85b19751be033e064283de4cfa875d2b4f299ae6
3
+ metadata.gz: 497c86554374fa1a2c75f764eaac90cfb91b7b6f
4
+ data.tar.gz: 48eb5c6fdc37a1312405a72e23c89031474b02f4
5
5
  SHA512:
6
- metadata.gz: 75183e9e1cc24646a4a28b3fc8a7f3cc2f357bbfe079540a0ed160539bd3472978d2351f8d96159856b21f14cb191287aac2f6a41d73f08beb618c73658e8058
7
- data.tar.gz: 6de4c561b1dcf1379df536e481b80e4862d0b6f73f7badcc1e6a693b42ac4bcf3f1261f75a2a19a2c3b8c0e91f84f60373d7d0d2d1a064b779519efc4bc46ab6
6
+ metadata.gz: ed072a7f8ca8d2b2b7758da3cf1913865f28135da6d99be1159a154ac972acd278c574581d2ed8fd349c8f07664e8cc34a0ddfc5447041e3292d474d6a87e100
7
+ data.tar.gz: 4dd300b6cf3338b1396c0c5211f85c419019588c2ccb01120f0b526742bc5eaae462c0de1d4fc3756e532bbeb00e8b82dee66f36f56978365d2aa55e6245fa77
data/README.md CHANGED
@@ -5,7 +5,12 @@
5
5
 
6
6
  Petrovich также позволяет определять пол по имени, фамилии, отчеству.
7
7
 
8
- [![Build Status](https://travis-ci.org/petrovich/petrovich-ruby.svg)](https://travis-ci.org/petrovich/petrovich-ruby)
8
+ [![RubyGems][rubygems_badge]][rubygems_link] [![Build Status][travis_ci_badge]][travis_ci_link]
9
+
10
+ [rubygems_badge]: https://badge.fury.io/rb/petrovich.svg
11
+ [rubygems_link]: https://rubygems.org/gems/petrovich
12
+ [travis_ci_badge]: https://travis-ci.org/petrovich/petrovich-ruby.svg
13
+ [travis_ci_link]: https://travis-ci.org/petrovich/petrovich-ruby
9
14
 
10
15
  ## Установка
11
16
 
@@ -103,17 +108,17 @@ Petrovich(
103
108
  ).male? # => true
104
109
  ```
105
110
 
106
- ## CLI
111
+ ## Интерфейс командной строки
107
112
 
108
113
  Примеры вызовов:
109
114
 
110
115
  ```bash
111
- petrovich -l Иванов -f Иван -m Иванович -g male -t accusative
112
- petrovich -l Иванов -f Иван -m Иванович -t accusative -d
113
- petrovich -l Иванов -f Иван -m Иванович -t accusative -o
116
+ petrovich -l Иванов -f Иван -m Иванович -g male -c accusative
117
+ petrovich -l Иванов -f Иван -m Иванович -c accusative -n
118
+ petrovich -l Иванов -f Иван -m Иванович -c accusative -o
114
119
  ```
115
120
 
116
- Подробное руководство: `petrovich inflect --help`
121
+ Подробное руководство: `petrovich --help`.
117
122
 
118
123
  ## Модульные тесты
119
124
 
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require "bundler/gem_tasks"
5
5
  require "rake/testtask"
6
6
 
7
7
  Rake::TestTask.new do |t|
8
- t.test_files = FileList['test/*_test.rb']
8
+ t.test_files = FileList['test/**/*_test.rb']
9
9
  end
10
10
 
11
11
  task default: :test
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
2
  require 'forwardable'
3
+ require 'petrovich/version'
3
4
  require 'petrovich/value'
4
5
  require 'petrovich/inflector'
5
6
  require 'petrovich/inflected'
@@ -23,6 +24,13 @@ module Petrovich
23
24
  :prepositional
24
25
  ]
25
26
 
27
+ # Possible genders
28
+ GENDERS = [
29
+ :androgynous,
30
+ :male,
31
+ :female
32
+ ]
33
+
26
34
  class << self
27
35
  # A place that keeps inflection and gender rules loaded from yaml file.
28
36
  #
@@ -13,17 +13,11 @@ module Petrovich
13
13
  @tags = []
14
14
 
15
15
  @tests_regexp = Regexp.union(Array(@tests).map(&:suffix))
16
-
17
- assert_name_part!(@as)
18
16
  end
19
17
 
20
18
  def match?(name, match_gender, match_as, known_gender = false)
21
- assert_name_part!(match_as)
22
-
23
19
  return false unless match_as == as
24
20
 
25
- match_gender = match_gender.to_sym.downcase
26
-
27
21
  if known_gender
28
22
  return false if match_gender != gender
29
23
  else
@@ -57,13 +51,6 @@ module Petrovich
57
51
  fail UnknownCaseError, "Unknown grammatic case: #{name_case}".freeze
58
52
  end
59
53
  end
60
-
61
- private
62
-
63
- def assert_name_part!(name_part)
64
- return if [:lastname, :firstname, :middlename].include?(name_part)
65
- fail ArgumentError, "Unknown 'as' option #{name_part}".freeze
66
- end
67
54
  end
68
55
  end
69
56
  end
@@ -25,7 +25,7 @@ module Petrovich
25
25
  end
26
26
 
27
27
  def known_gender?
28
- !@gender.nil? && [:male, :female, :androgynous].include?(@gender.to_sym)
28
+ !@gender.nil? && Petrovich::GENDERS.include?(@gender.to_sym)
29
29
  end
30
30
 
31
31
  def male?
@@ -43,9 +43,12 @@ module Petrovich
43
43
  rules = YAML.load_file(
44
44
  File.expand_path('../../../rules/rules.yml', __FILE__)
45
45
  )
46
+ gender = YAML.load_file(
47
+ File.expand_path('../../../rules/gender.yml', __FILE__)
48
+ )
46
49
 
47
50
  load_case_rules!(rules)
48
- load_gender_rules!(rules)
51
+ load_gender_rules!(gender)
49
52
  end
50
53
 
51
54
  private
@@ -68,7 +71,7 @@ module Petrovich
68
71
  def load_gender_rules!(rules)
69
72
  [:lastname, :firstname, :middlename].each do |name_part|
70
73
  # First, add androgynous rules. Order is matters.
71
- [:androgynous, :male, :female].each do |section|
74
+ Petrovich::GENDERS.each do |section|
72
75
  entries = rules['gender'][name_part.to_s][section.to_s]
73
76
  next if entries.nil?
74
77
 
@@ -0,0 +1,3 @@
1
+ module Petrovich
2
+ VERSION = '1.1.0'
3
+ end
@@ -3,7 +3,7 @@
3
3
  require 'csv'
4
4
 
5
5
  def check!(errors, correct, total, lemma, gender, gcase, expected)
6
- petrovich = ENV['USE_GENDER'] ? Petrovich(lastname: lemma, gender: gender) : Petrovich(lastname: lemma)
6
+ petrovich = Petrovich(lastname: lemma, gender: gender)
7
7
  actual = Petrovich::Unicode.upcase(petrovich.public_send(gcase).lastname)
8
8
  total[[gender, gcase]] += 1
9
9
  if actual == expected
@@ -28,7 +28,7 @@ task :evaluate => :petrovich do
28
28
  CSV.open(errors_filename, 'w', col_sep: "\t") do |errors|
29
29
  errors << %w(lemma expected actual params)
30
30
 
31
- CSV.open(filename, col_sep: "\t", headers: true).each do |row|
31
+ CSV.open(filename, "r:BINARY", col_sep: "\t", headers: true).each do |row|
32
32
  word = row['word'].force_encoding('UTF-8')
33
33
  lemma = row['lemma'].force_encoding('UTF-8')
34
34
 
@@ -75,3 +75,49 @@ task :evaluate => :petrovich do
75
75
  puts 'Sum of the %d correct examples and %d mistakes is %d.' %
76
76
  [correct_size, total_size - correct_size, total_size]
77
77
  end
78
+
79
+ desc 'Evaluate gender detector'
80
+ task :detect => :petrovich do
81
+ GENDER_MAP = { 'мр' => :male, 'жр' => :female, 'мр-жр' => :androgynous }
82
+
83
+ filename = File.expand_path('../../../eval/surnames.gender.tsv', __FILE__)
84
+ errors_filename = ENV['errors'] || 'errors.gender.tsv'
85
+
86
+ correct, total = Hash.new(0), Hash.new(0)
87
+
88
+ puts 'I will evaluate gender detector on "%s" ' \
89
+ 'and store errors to "%s".' % [filename, errors_filename]
90
+
91
+ CSV.open(errors_filename, 'w', col_sep: "\t") do |errors|
92
+ errors << %w(lemma expected actual)
93
+
94
+ CSV.open(filename, "r:BINARY", col_sep: "\t", headers: true).each do |row|
95
+ lemma = row['lemma'].force_encoding('UTF-8')
96
+ gender_name = row['gender'].force_encoding('UTF-8')
97
+ expected_gender = GENDER_MAP[gender_name]
98
+
99
+ detected_gender = Petrovich(lastname: lemma).gender
100
+
101
+ total[expected_gender] += 1
102
+ if detected_gender == expected_gender
103
+ correct[expected_gender] += 1
104
+ else
105
+ errors << [lemma, expected_gender, detected_gender]
106
+ end
107
+ end
108
+ end
109
+
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
114
+
115
+ correct_size = correct.values.inject(&:+)
116
+ total_size = total.values.inject(&:+)
117
+
118
+ puts 'Well, the accuracy on %d examples is about %.4f%%.' %
119
+ [total_size, (correct_size / total_size.to_f * 100)]
120
+
121
+ puts 'Sum of the %d correct examples and %d mistakes is %d.' %
122
+ [correct_size, total_size - correct_size, total_size]
123
+ end
@@ -0,0 +1,129 @@
1
+ # Эвристики для определения пола
2
+ gender:
3
+ lastname:
4
+ # Здесь андрогинные фамилии не выделены в отдельную группу. Если в группе female и male
5
+ # не будет найдено совпадений, то фамилия будет считаться андрогинной.
6
+ female:
7
+ - ова
8
+ - ая
9
+ - ына
10
+ - ина
11
+ - ева
12
+ - ска
13
+ - ёва
14
+ male:
15
+ - кий
16
+ - ов
17
+ - ын
18
+ - ев
19
+ - ин
20
+ - ёв
21
+ - хий
22
+ - ний
23
+ - ый
24
+ - ой
25
+ 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
+ - лярам
120
+ middlename:
121
+ female:
122
+ - на
123
+ - кызы
124
+ - гызы
125
+ male:
126
+ - ич
127
+ - оглы
128
+ - улы
129
+ - уулу
@@ -42,7 +42,7 @@ lastname:
42
42
  mods: [., ., ., ., .]
43
43
 
44
44
  - gender: androgynous
45
- test: [гава, орота]
45
+ test: [орота]
46
46
  mods: [., ., ., ., .]
47
47
 
48
48
  # Брыльска, *
@@ -97,7 +97,7 @@ lastname:
97
97
 
98
98
  # Кузнецова, Голубева, Скурихина
99
99
  - gender: female
100
- test: [ова, ева, на]
100
+ test: [ова, ева, на, ёва]
101
101
  mods: [-ой, -ой, -у, -ой, -ой]
102
102
 
103
103
  # Басалыга, Лазука, Пидкуймуха, Бобча, Гуща, Рогожа, Кваша
@@ -135,17 +135,17 @@ lastname:
135
135
  test: [ян, ан, йн]
136
136
  mods: [а, у, а, ом, е]
137
137
 
138
- # Волынец, Горобец
139
- - gender: male
140
- test: [ынец, обец]
141
- mods: [--ца, --цу, --ца, --цем, --це]
142
-
143
138
  # *, Быховец
144
139
  # TODO: Проверить Брагинец
145
140
  - gender: male
146
- test: [онец, овец]
141
+ test: [ынец, овец]
147
142
  mods: [--ца, --цу, --ца, --цом, --це]
148
143
 
144
+ # Волынец, Горобец
145
+ - gender: male
146
+ test: [нец, обец]
147
+ mods: [--ца, --цу, --ца, --цем, --це]
148
+
149
149
  # Порывай
150
150
  - gender: male
151
151
  test: [ай]
@@ -161,9 +161,9 @@ lastname:
161
161
  test: [ой]
162
162
  mods: [-го, -му, -го, --ым, -м]
163
163
 
164
- # *, *
164
+ # *, *, -шток
165
165
  - gender: male
166
- test: [ах, ив]
166
+ test: [ах, ив, шток]
167
167
  mods: [а, у, а, ом, е]
168
168
 
169
169
  # *, *, *, *
@@ -171,8 +171,9 @@ lastname:
171
171
  test: [ший, щий, жий, ний]
172
172
  mods: [--его, --ему, --его, -м, --ем]
173
173
 
174
+ # Безверхий
174
175
  - gender: male
175
- test: [ый, кий]
176
+ test: [ый, кий, хий]
176
177
  mods: [--ого, --ому, --ого, -м, --ом]
177
178
 
178
179
  # Хорунжий
@@ -320,127 +321,3 @@ middlename:
320
321
  - gender: female
321
322
  test: [на]
322
323
  mods: [-ы, -е, -у, -ой, -е]
323
-
324
- # Эвристики для определения пола
325
- gender:
326
- lastname:
327
- # Здесь андрогенные фамилии не выделены в отдельную группу. Если в группе female и male
328
- # не будет найдено совпадений, то фамилия будет считаться андрогенной.
329
- female:
330
- - ова
331
- - ая
332
- - на
333
- - ина
334
- - ева
335
- - ска
336
- male:
337
- - кий
338
- - ов
339
- - ын
340
- - ев
341
- - ин
342
- firstname:
343
- # Исключения - андрогенные имена
344
- androgynous:
345
- - ким
346
- - никита
347
- - саша
348
- - женя
349
- male:
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
- female:
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
- - лин
427
- - линн
428
- - ейн
429
- - нифер
430
- - женни
431
- - еннис
432
- - енн
433
- - инн
434
- - ерин
435
- - ляра
436
- - лярам
437
- middlename:
438
- female:
439
- - на
440
- - кызы
441
- - гызы
442
- male:
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.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kozlov
@@ -9,22 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-07-19 00:00:00.000000000 Z
12
+ date: 2016-07-20 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: commander
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - '='
19
- - !ruby/object:Gem::Version
20
- version: 4.3.5
21
- type: :runtime
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - '='
26
- - !ruby/object:Gem::Version
27
- version: 4.3.5
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: rake
30
16
  requirement: !ruby/object:Gem::Requirement
@@ -53,20 +39,6 @@ dependencies:
53
39
  - - ">="
54
40
  - !ruby/object:Gem::Version
55
41
  version: '0'
56
- - !ruby/object:Gem::Dependency
57
- name: minitest-reporters
58
- requirement: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: '0'
63
- type: :development
64
- prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
42
  description: A morphological library for Russian anthroponyms, such as first names,
71
43
  last names, and middle names.
72
44
  email:
@@ -91,7 +63,9 @@ files:
91
63
  - lib/petrovich/rule_set.rb
92
64
  - lib/petrovich/unicode.rb
93
65
  - lib/petrovich/value.rb
66
+ - lib/petrovich/version.rb
94
67
  - lib/tasks/evaluate.rake
68
+ - rules/gender.yml
95
69
  - rules/rules.yml
96
70
  homepage: https://github.com/petrovich/petrovich-ruby
97
71
  licenses: