rsamer 1.0.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 +7 -0
- data/lib/data/users.yml +37 -0
- data/lib/rsamer/data_provider.rb +15 -0
- data/lib/rsamer/engine.rb +66 -0
- data/lib/rsamer/user.rb +11 -0
- data/lib/rsamer.rb +20 -0
- metadata +50 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 1de85a3f4d06872d699e9b3c41c6db5bc29fbca4
|
|
4
|
+
data.tar.gz: 7d56e7f6c9e2be7d0dfdcb15af6d95da74833c24
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 7283a190b04f9dd450227d93f92631d22c557f2feaeae456bc2a9a3d61eea4891d59e9fd0f9f49b8d9066cb79df9b94eb5dca4a2bf930888bb7bda4013ce5ed0
|
|
7
|
+
data.tar.gz: 84a0167c4a2735398db2f4625c5472200052579308fa9b88582c9a2eaf618b78d18ca2e9a2bf36dd25597ee17845b97cd5b8ae9483f645b6372779bfe7be5b76
|
data/lib/data/users.yml
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
john:
|
|
2
|
+
'trance' : 5
|
|
3
|
+
'ambient' : 4
|
|
4
|
+
'chillout' : 4
|
|
5
|
+
'rock' : 3
|
|
6
|
+
'pop' : 1
|
|
7
|
+
'heavy-metal' : 1
|
|
8
|
+
|
|
9
|
+
jane:
|
|
10
|
+
'trance' : 1
|
|
11
|
+
'ambient' : 2
|
|
12
|
+
'chillout' : 3
|
|
13
|
+
'pop' : 5
|
|
14
|
+
'ballad' : 4
|
|
15
|
+
|
|
16
|
+
jake:
|
|
17
|
+
'trance' : 1
|
|
18
|
+
'pop' : 1
|
|
19
|
+
'ballad' : 2
|
|
20
|
+
'rock' : 5
|
|
21
|
+
'heavy-metal' : 4
|
|
22
|
+
|
|
23
|
+
jasmine:
|
|
24
|
+
'trance' : 1
|
|
25
|
+
'pop' : 5
|
|
26
|
+
'ballad' : 4
|
|
27
|
+
'rock' : 2
|
|
28
|
+
'heavy-metal' : 1
|
|
29
|
+
'ambient' : 2
|
|
30
|
+
|
|
31
|
+
johanna:
|
|
32
|
+
'pop' : 2
|
|
33
|
+
'ballad' : 3
|
|
34
|
+
'rock' : 2
|
|
35
|
+
'chillout' : 4
|
|
36
|
+
'heavy-metal' : 0
|
|
37
|
+
'ambient' : 5
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require_relative 'user'
|
|
2
|
+
module Rsamer
|
|
3
|
+
class DataProvider
|
|
4
|
+
|
|
5
|
+
DATA_PATH = File.expand_path '../../data/users.yml', __FILE__
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
@data = YAML.load_file DATA_PATH
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def prepare
|
|
12
|
+
@data.keys.map!{ |name| User.new name, @data[name] }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
module Rsamer
|
|
2
|
+
class Engine
|
|
3
|
+
|
|
4
|
+
attr_reader :users
|
|
5
|
+
|
|
6
|
+
def initialize users
|
|
7
|
+
@users = users
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def find_for name
|
|
11
|
+
@name = name
|
|
12
|
+
@similars = {}
|
|
13
|
+
return "User #{@name} in mot present in example. See in the lib/data/users.yml" unless current_user
|
|
14
|
+
|
|
15
|
+
@users.each do |user|
|
|
16
|
+
next if user.name == current_user.name
|
|
17
|
+
@similars[user.name] = distance(current_user, user)
|
|
18
|
+
end
|
|
19
|
+
similar
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def recommend name
|
|
23
|
+
find_for name
|
|
24
|
+
recommendations = []
|
|
25
|
+
similar_user.genres.each do |genre|
|
|
26
|
+
recommendations.push genre[0] unless genre[1] < 3 || current_user_have?(genre[0])
|
|
27
|
+
end
|
|
28
|
+
if recommendations.any?
|
|
29
|
+
"We advise you to listen #{recommendations.join}"
|
|
30
|
+
else
|
|
31
|
+
"Sorry, but we can not advise you anything"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def current_user_have? genre
|
|
38
|
+
current_user.genres.keys.find{ |user_genre| user_genre == genre }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def distance current_user, user
|
|
42
|
+
distances = []
|
|
43
|
+
|
|
44
|
+
current_user.genres.keys.each do |genre|
|
|
45
|
+
next unless user.genres[genre]
|
|
46
|
+
distances.push (current_user.genres[genre] - user.genres[genre])**2
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
1.fdiv 1 + Math.sqrt(distances.inject(0){ |sum, score| sum + score })
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def current_user
|
|
53
|
+
@current_user ||= @users.find{ |user| user.name == @name }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def similar_user
|
|
57
|
+
@similar_user ||= @users.find{ |user| user.name == similar.first }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def similar
|
|
61
|
+
@similars.max_by{ |_, score| score }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
data/lib/rsamer/user.rb
ADDED
data/lib/rsamer.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
require 'active_support/all'
|
|
3
|
+
require_relative 'rsamer/data_provider'
|
|
4
|
+
require_relative 'rsamer/engine'
|
|
5
|
+
|
|
6
|
+
module Rsamer
|
|
7
|
+
|
|
8
|
+
def self.find_for name
|
|
9
|
+
engine.find_for name
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.recommend name
|
|
13
|
+
engine.recommend name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
def self.engine
|
|
18
|
+
@engine ||= Engine.new(DataProvider.new.prepare)
|
|
19
|
+
end
|
|
20
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: rsamer
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Alexey Spiridonov
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-02-14 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: Use Rsamer.find "...", Rsamer.recommend "..."
|
|
14
|
+
email: alex9spiridonov@gmail.com
|
|
15
|
+
executables: []
|
|
16
|
+
extensions: []
|
|
17
|
+
extra_rdoc_files: []
|
|
18
|
+
files:
|
|
19
|
+
- lib/data/users.yml
|
|
20
|
+
- lib/rsamer.rb
|
|
21
|
+
- lib/rsamer/data_provider.rb
|
|
22
|
+
- lib/rsamer/engine.rb
|
|
23
|
+
- lib/rsamer/user.rb
|
|
24
|
+
homepage: http://rubygems.org/gems/rsamer
|
|
25
|
+
licenses:
|
|
26
|
+
- MIT
|
|
27
|
+
metadata: {}
|
|
28
|
+
post_install_message:
|
|
29
|
+
rdoc_options: []
|
|
30
|
+
require_paths:
|
|
31
|
+
- lib
|
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
33
|
+
requirements:
|
|
34
|
+
- - ">="
|
|
35
|
+
- !ruby/object:Gem::Version
|
|
36
|
+
version: '0'
|
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
38
|
+
requirements:
|
|
39
|
+
- - ">="
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '0'
|
|
42
|
+
requirements:
|
|
43
|
+
- Internet connection,
|
|
44
|
+
- A good mood
|
|
45
|
+
rubyforge_project:
|
|
46
|
+
rubygems_version: 2.4.6
|
|
47
|
+
signing_key:
|
|
48
|
+
specification_version: 4
|
|
49
|
+
summary: Find similar users
|
|
50
|
+
test_files: []
|