chime 0.1.0 → 0.2.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.
data/lib/chime/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Chime
2
- VERSION = "0.0.1"
2
+ VERSION = "1.0.0"
3
3
  end
data/lib/chime.rb CHANGED
@@ -2,6 +2,9 @@ require_relative "./chime/version"
2
2
  require_relative './chime/emotions/emotion_bank.rb'
3
3
  require_relative './chime/emotions/term_polarities.rb'
4
4
  require_relative './chime/emotions/stopwords.rb'
5
+ require_relative './chime/emotions/term_categories.rb'
6
+ require_relative './chime/emotions/emotion_bank_phrases.rb'
7
+
5
8
  require 'lingua/stemmer'
6
9
 
7
10
  module Chime
@@ -12,6 +15,12 @@ module Chime
12
15
  Chime.get_emotion_score(message, EmotionBank.get_term_emotions, build_term_frequencies(message))
13
16
  end
14
17
 
18
+ # this method returns the best-fit emotion for the status message
19
+ def self.category(message)
20
+ # get the emotion for which the emotion score value is highest
21
+ Chime.get_category_score(message, TermCategories.get_term_categories, build_term_frequencies(message))
22
+ end
23
+
15
24
  # this method returns the polarity value for the status message
16
25
  # (normalized by the number of 'polar' words that the status
17
26
  # message contains)
@@ -20,6 +29,30 @@ module Chime
20
29
  Chime.get_polarity_score(message, TermPolarities.get_term_polarities, Chime.build_term_frequencies(message))
21
30
  end
22
31
 
32
+ #TODO: Utilize stems and stop words within the next two methods.
33
+
34
+ #This method works off of phrases instead of just words
35
+ def self.category_phrases(array)
36
+ array.map{|e| TermCategories.get_term_categories.find(proc{[nil,"Undefined"]}){|k,v| e.downcase.include? k}.last}
37
+ end
38
+
39
+
40
+ #This method works off of phrases instead of just words
41
+ def self.emotion_phrases(array)
42
+ array.map{|e| EmotionBankPhrases.get_term_emotion_phrases.find(proc{[nil,"Ambiguous"]}){|k,v| e.downcase.include? k}.last}
43
+ end
44
+
45
+ #Pull EmotionBankPhrases into strictly positive hash
46
+ def self.emotion_phrases_positive_array
47
+ EmotionBankPhrases.get_term_emotion_phrases.select { |key, value| value.to_s.match("Positive") }
48
+ end
49
+
50
+ #Pull EmotionBankPhrases into strictly negative hash
51
+ def self.emotion_phrases_negative_array
52
+ EmotionBankPhrases.get_term_emotion_phrases.select { |key, value| value.to_s.match("Negative") }
53
+ end
54
+
55
+
23
56
 
24
57
  private
25
58
 
@@ -67,11 +100,24 @@ module Chime
67
100
  check_emoticon_for_emotion(emotion_score, message)
68
101
  end
69
102
 
103
+ # this method takes an emotion-words hash and a hash containing word
104
+ # frequencies for the status message, calculates a numerical score
105
+ # for each possble emotion, and returns the emotion with the highest
106
+ # "score"
107
+ def self.get_category_score(message, categories, term_frequencies, category_score = {})
108
+ term_frequencies.each do |key,value|
109
+ set_categories(categories, category_score, key, value)
110
+ end
111
+ # return an emotion_score_hash to be processed by emotion
112
+ # get clue from any emoticons present
113
+ check_emoticon_for_category(category_score, message)
114
+ end
115
+
70
116
  # this method gives the status method a normalized polarity
71
117
  # value based on the words it contains
72
118
  def self.get_polarity_score (message, polarity_hash, term_frequencies, polarity_scores = [])
73
119
  term_frequencies.each do |key, value|
74
- set_polarities(key, value, polarity_hash, polarity_scores)
120
+ set_polarities(key, value, polarity_hash, polarity_scores)
75
121
  end
76
122
 
77
123
  # return an polarity_score_hash to be processed by polarity method
@@ -103,6 +149,12 @@ module Chime
103
149
  end
104
150
  end
105
151
 
152
+ def self.set_categories(categories, category_score, term, frequency)
153
+ categories.keys.each do |k|
154
+ store_categories(categories, category_score, k, term, frequency)
155
+ end
156
+ end
157
+
106
158
  def self.set_polarities(term, frequency, polarity_hash, polarity_scores)
107
159
  polarity_hash.keys.each do |k|
108
160
  store_polarities(term, k, polarity_hash, polarity_scores)
@@ -116,6 +168,13 @@ module Chime
116
168
  end
117
169
  end
118
170
 
171
+ def self.store_categories(categories, category_score, category, term, frequency)
172
+ if categories[category].include?(term)
173
+ category_score[category] ||= 0
174
+ category_score[category] += frequency
175
+ end
176
+ end
177
+
119
178
  def self.store_polarities(term, word, polarity_hash, polarity_scores)
120
179
  if term == word
121
180
  polarity_scores << (polarity_hash[word].to_f)
@@ -134,6 +193,18 @@ module Chime
134
193
  end
135
194
  end
136
195
 
196
+ def self.check_emoticon_for_category(category_score, message)
197
+ if (happy_emoticon(message) && sad_emoticon(message))
198
+ "ambiguous-cat"
199
+ elsif happy_emoticon(message)
200
+ "joy-cat"
201
+ elsif sad_emoticon(message)
202
+ "sadness-cat"
203
+ else
204
+ return_category_score(category_score)
205
+ end
206
+ end
207
+
137
208
  def self.return_emotion_score(emotion_score)
138
209
  ## 0 if unable to detect emotion
139
210
  if emotion_score == {}
@@ -143,6 +214,15 @@ module Chime
143
214
  end
144
215
  end
145
216
 
217
+ def self.return_category_score(category_score)
218
+ ## 0 if unable to detect emotion
219
+ if category_score == {}
220
+ "ambiguous-cat"
221
+ else
222
+ category_score.max_by{|k, v| v}[0]
223
+ end
224
+ end
225
+
146
226
  def self.check_emoticon_for_polarity(polarity_scores, message)
147
227
  if (happy_emoticon(message) && sad_emoticon(message))
148
228
  score = 5
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - jonathanamccann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-15 00:00:00.000000000 Z
11
+ date: 2013-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shoulda
@@ -100,9 +100,11 @@ files:
100
100
  - chime.gemspec
101
101
  - lib/chime.rb
102
102
  - lib/chime/emotions/emotion_bank.rb
103
+ - lib/chime/emotions/emotion_bank_phrases.rb
103
104
  - lib/chime/emotions/emotions.csv
104
105
  - lib/chime/emotions/stopwords.rb
105
106
  - lib/chime/emotions/subjectivity.csv
107
+ - lib/chime/emotions/term_categories.rb
106
108
  - lib/chime/emotions/term_polarities.rb
107
109
  - lib/chime/version.rb
108
110
  - test/helper.rb