Class: TextMood

Inherits:
Object
  • Object
show all
Defined in:
lib/textmood.rb

Instance Method Summary collapse

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(options = {})
  options[:max_threshold] ||=  0.5
  options[:min_threshold] ||= -0.5
  options[:start_ngram]   ||=  1
  options[:end_ngram]     ||=  1
  @options = options
  if options[:language]
    if options[:alias_file]
      aliases = load_alias_file(options[:alias_file])
      if aliases
        file = aliases[options[: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/#{options[:language]}.txt"
    end
    @sentiment_values = load_sentiment_file(file)
    unless options[: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 options[:files].empty?
      raise ArgumentError, "No language or files provided"
    else
      @sentiment_values = {}
      options[: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