petrovich 1.0.1 → 1.1.0

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: 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: