gender_machine 0.0.1
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 +7 -0
- data/.gitignore +14 -0
- data/.ruby-version +1 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +28 -0
- data/README.md +49 -0
- data/Rakefile +5 -0
- data/gender_machine.gemspec +27 -0
- data/lib/gender_machine.rb +11 -0
- data/lib/gender_machine/core.rb +46 -0
- data/lib/gender_machine/nam_dict.txt +48890 -0
- data/lib/gender_machine/name.rb +81 -0
- data/lib/gender_machine/predictor.rb +32 -0
- data/lib/gender_machine/version.rb +3 -0
- metadata +142 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
module GenderMachine
|
2
|
+
class Name
|
3
|
+
include MooseX
|
4
|
+
GENDER_TRANSFORM = ->(value) do
|
5
|
+
# Ordered based roughly on frequency w/ some tweaking
|
6
|
+
# formula: NAME_ROWS.map(&:first).each_with_object({}) { |v, obj| obj[v] ||= 0; obj[v] += 1 }
|
7
|
+
# Following comment is part of datafile & licensed under GPLv1.2 or later
|
8
|
+
# Syntax for "normal" name list (do not change): $
|
9
|
+
# $
|
10
|
+
# M <male first name> $
|
11
|
+
# 1M <male name, if first part of name; $
|
12
|
+
# else: mostly male name> $
|
13
|
+
# ?M <mostly male name (= unisex name, which is mostly male)> $
|
14
|
+
# $
|
15
|
+
# F <female first name> $
|
16
|
+
# 1F <female name, if first part of name; $
|
17
|
+
# else: mostly female name> $
|
18
|
+
# ?F <mostly female name (= unisex name, which is mostly female)> $
|
19
|
+
# $
|
20
|
+
# ? <unisex name (= can be male or female)> $
|
21
|
+
# Author of GenderMachine chose to map those names in order to:
|
22
|
+
# :male
|
23
|
+
# :probably_male
|
24
|
+
# :possibly_male
|
25
|
+
# :female
|
26
|
+
# :probably_female
|
27
|
+
# :possibly_female
|
28
|
+
# :non_gendered
|
29
|
+
case value
|
30
|
+
when "F" then :female
|
31
|
+
when "M" then :male
|
32
|
+
when "?F" then :possibly_female
|
33
|
+
when "?" then :non_gendered
|
34
|
+
when "?M" then :possibly_male
|
35
|
+
when "1F" then :probably_female
|
36
|
+
when "1M" then :probably_male
|
37
|
+
when "=" then nil # special case, names are equivalent
|
38
|
+
else :unknown
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
FREQUENCY_TRANSFORM = ->(value) do
|
43
|
+
begin
|
44
|
+
index = value.index(/[\dA-D]/)
|
45
|
+
# end_index = index + 6
|
46
|
+
# output = value[index..end_index].scan(/../).map do |pair|
|
47
|
+
# pair.hex.chr.to_i
|
48
|
+
# end.inject(:+)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
has gender: {
|
53
|
+
is: :rw,
|
54
|
+
default: -> { :unknown },
|
55
|
+
coerce: GENDER_TRANSFORM,
|
56
|
+
}
|
57
|
+
|
58
|
+
has [:name, :raw], {is: :rw}
|
59
|
+
has frequency_string: {is: :rw, isa: String}
|
60
|
+
|
61
|
+
def frequency
|
62
|
+
# TODO: implement
|
63
|
+
end
|
64
|
+
|
65
|
+
def frequency_index
|
66
|
+
FREQUENCY_TRANSFORM.call(frequency_string)
|
67
|
+
end
|
68
|
+
|
69
|
+
def country
|
70
|
+
COUNTRY_MAP_NUMERIC[frequency_index]
|
71
|
+
end
|
72
|
+
|
73
|
+
def simplistic_gender
|
74
|
+
case gender.to_s
|
75
|
+
when /female/i then :female
|
76
|
+
when /male/i then :male
|
77
|
+
else :non_gendered
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module GenderMachine
|
2
|
+
class Predictor
|
3
|
+
include Anima.new(:name)
|
4
|
+
|
5
|
+
NULL_NAME = OpenStruct.new(gender: "",
|
6
|
+
name: "",
|
7
|
+
frequency_string: "",
|
8
|
+
raw: "")
|
9
|
+
def name_match_block
|
10
|
+
->(obj){ obj.name == name }
|
11
|
+
end
|
12
|
+
|
13
|
+
def ensure_default_response(default)
|
14
|
+
response = yield
|
15
|
+
response || default
|
16
|
+
end
|
17
|
+
|
18
|
+
def find(name = name)
|
19
|
+
Core::NAMES.select(&name_match_block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def first(name = name)
|
23
|
+
ensure_default_response(NULL_NAME) do
|
24
|
+
Core::NAMES.detect(&name_match_block)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def where
|
29
|
+
# TODO:
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gender_machine
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Zander Hill
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: anima
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: moosex
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: require_all
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry-uber
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.7'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.7'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.0'
|
97
|
+
description: Make sweeping, broad stroked predictions about gender based on name.
|
98
|
+
email:
|
99
|
+
- zander@xargs.io
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".ruby-version"
|
106
|
+
- Gemfile
|
107
|
+
- LICENSE.txt
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- gender_machine.gemspec
|
111
|
+
- lib/gender_machine.rb
|
112
|
+
- lib/gender_machine/core.rb
|
113
|
+
- lib/gender_machine/nam_dict.txt
|
114
|
+
- lib/gender_machine/name.rb
|
115
|
+
- lib/gender_machine/predictor.rb
|
116
|
+
- lib/gender_machine/version.rb
|
117
|
+
homepage: https://github.com/zph/gender_machine
|
118
|
+
licenses:
|
119
|
+
- MIT
|
120
|
+
metadata: {}
|
121
|
+
post_install_message:
|
122
|
+
rdoc_options: []
|
123
|
+
require_paths:
|
124
|
+
- lib
|
125
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
requirements: []
|
136
|
+
rubyforge_project:
|
137
|
+
rubygems_version: 2.4.2
|
138
|
+
signing_key:
|
139
|
+
specification_version: 4
|
140
|
+
summary: Make sweeping, broad stroked predictions about gender based on name.
|
141
|
+
test_files: []
|
142
|
+
has_rdoc:
|