petrovich 1.0.0 → 1.0.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: 8e6066940e4b5258379235c3252ff522958d539b
4
- data.tar.gz: 5ecd85e3a147030e003819d3866061a927eb1552
3
+ metadata.gz: 949de8e61c2087dace03572893fe90b5cbb4be2c
4
+ data.tar.gz: 85b19751be033e064283de4cfa875d2b4f299ae6
5
5
  SHA512:
6
- metadata.gz: 95f3fd34b305b733f233df19c9bb31a71e712c7a8d298104f0a2764baa2f56deeb07876cd6f2fbb62915c8d64ff060229505cc0d484014044a5140728c55484f
7
- data.tar.gz: da1eac52ca78014e3ecf10fcda4ecee604d35a7d05dff8a78d3d24a3ae39c0f4af150ae74b13d23f1951c331ccba9163956dc7ac2b51d4a910126e4b828ea6ec
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
- [![Build Status](https://travis-ci.org/petrovich/petrovich-ruby.svg?branch=dev-1.0)](https://travis-ci.org/petrovich/petrovich-ruby)
8
+ [![Build Status](https://travis-ci.org/petrovich/petrovich-ruby.svg)](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
- # Пол должен быть указан в виде строки или символа, возможные значения: male, female.
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
@@ -15,4 +15,9 @@ task :petrovich do
15
15
  require 'petrovich'
16
16
  end
17
17
 
18
+ Rake::TestTask.new(:bench) do |test|
19
+ test.libs << 'test'
20
+ test.test_files = Dir['test/**/bench_*.rb']
21
+ end
22
+
18
23
  Dir.glob('lib/tasks/*.rake').each { |r| import r }
@@ -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
- return false if gender == :male && match_gender == :female
26
- return false if gender == :female && match_gender != :female
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
- tests.detect { |test| test.match?(name) }
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 = Unicode.downcase(suffix)
9
+ @suffix = /#{suffix}$/i
10
10
  end
11
11
 
12
12
  def match?(name)
13
- name = Unicode.downcase(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 = Unicode.downcase(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
@@ -17,13 +17,17 @@ module Petrovich
17
17
  end
18
18
 
19
19
  def gender
20
- if !@gender.nil? && [:male, :female, :androgynous].include?(@gender.to_sym)
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
- find = proc { |x| @rule_set.find_all_case_rules(name.send(x), gender, x) }
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)
@@ -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('-').map { |part| find_case_rule(part, gender, as) }
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)
@@ -3,7 +3,8 @@
3
3
  require 'csv'
4
4
 
5
5
  def check!(errors, correct, total, lemma, gender, gcase, expected)
6
- actual = Petrovich::Unicode.upcase(Petrovich(lastname: lemma).public_send(gcase).lastname)
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('../../../test/data/surnames.tsv', __FILE__)
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: [га, ка, ха, ча, ща, жа, ша, a]
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.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-03-16 00:00:00.000000000 Z
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 to inflect Russian anthroponyms such as first names, last names,
71
- and middle names. Also it has gender detection functionality.
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@eveel.ru
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.4.2
116
+ rubygems_version: 2.5.1
117
117
  signing_key:
118
118
  specification_version: 4
119
- summary: Automatic inflection of Russian anthroponyms
119
+ summary: Petrovich, an inflector for Russian anthroponyms.
120
120
  test_files: []