Class: TextMood
- Inherits:
-
Object
- Object
- TextMood
- Defined in:
- lib/textmood.rb
Instance Method Summary collapse
-
#analyze(text) ⇒ Object
(also: #analyse)
analyzes the sentiment of the provided text.
-
#initialize(options = {}) ⇒ TextMood
constructor
A new instance of TextMood.
Constructor Details
#initialize(options = {}) ⇒ TextMood
Returns a new instance of TextMood.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/textmood.rb', line 16 def initialize( = {}) [:max_threshold] ||= 0.5 [:min_threshold] ||= -0.5 [:start_ngram] ||= 1 [:end_ngram] ||= 1 @options = if [:language] if [:alias_file] aliases = load_alias_file([:alias_file]) if aliases file = aliases[[:language]] unless file raise ArgumentError, "Language tag not found in alias file" end else raise ArgumentError, "Alias file not found" end else file = File.dirname(__FILE__) + "/../lang/#{[:language]}.txt" end @sentiment_values = load_sentiment_file(file) unless [:include_symbols] == false # load the symbols file (emoticons and other symbols) @sentiment_values.merge!(load_sentiment_file(File.dirname(__FILE__) + "/../lang/symbols.txt")) end else if [:files].empty? raise ArgumentError, "No language or files provided" else @sentiment_values = {} [:files].each do |file| @sentiment_values.merge!(load_sentiment_file(file)) end end end end |
Instance Method Details
#analyze(text) ⇒ Object Also known as: analyse
analyzes the sentiment of the provided text.
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 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 121 122 123 |
# File 'lib/textmood.rb', line 55 def analyze(text) sentiment_total = 0.0 negative_total = 0.0 positive_total = 0.0 neutral_total = 0.0 scores_added = 0 negative_added = 0 positive_added = 0 neutral_added = 0 not_found = 0 (@options[:start_ngram]..@options[:end_ngram]).each do |i| ngrams(i, text.to_s).each do |token| score = score_token(token) if score.nil? not_found += 1 else sentiment_total += score if score > 0 positive_total += score positive_added += 1 elsif score < 0 negative_total += score negative_added += 1 else neutral_total += score neutral_added += 1 end scores_added += 1 end end end if @options[:normalize_score] actual_score = normalize_score(sentiment_total, scores_added) else actual_score = sentiment_total end if @options[:verbose] puts "" if @options[:debug] combined_avg = (scores_added > 0) ? ", #{(sentiment_total.to_f / scores_added.to_f)} avg." : "" combined_text = "Combined score: #{sentiment_total} (#{scores_added} tokens#{combined_avg})" puts combined_text negative_avg = (negative_added > 0) ? ", #{(negative_total.to_f / negative_added.to_f)} avg." : "" negative_text = "Negative score: #{negative_total} (#{negative_added} tokens#{negative_avg})" puts negative_text positive_avg = (positive_added > 0) ? ", #{(positive_total.to_f / positive_added.to_f)} avg." : "" positive_text = "Positive score: #{positive_total} (#{positive_added} tokens#{positive_avg})" puts positive_text neutral_avg = (neutral_added > 0) ? ", #{(neutral_total.to_f / neutral_added.to_f)} avg." : "" neutral_text = "Neutral score: #{neutral_total} (#{neutral_added} tokens#{neutral_avg})" puts neutral_text puts "Not found: #{not_found} tokens" end if @options[:ternary_output] if actual_score > @options[:max_threshold] 1 elsif actual_score < @options[:min_threshold] -1 else 0 end else actual_score end end |