treat 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/LICENSE +1 -1
  2. data/lib/treat/config/core/acronyms.rb +2 -1
  3. data/lib/treat/config/libraries/punkt.rb +1 -0
  4. data/lib/treat/config/libraries/reuters.rb +1 -0
  5. data/lib/treat/core/data_set.rb +125 -66
  6. data/lib/treat/core/export.rb +59 -0
  7. data/lib/treat/core/problem.rb +101 -18
  8. data/lib/treat/core/question.rb +23 -7
  9. data/lib/treat/entities/abilities/iterable.rb +7 -3
  10. data/lib/treat/entities/abilities/stringable.rb +5 -5
  11. data/lib/treat/entities/collection.rb +10 -6
  12. data/lib/treat/entities/entity.rb +1 -1
  13. data/lib/treat/helpers/objtohash.rb +8 -0
  14. data/lib/treat/loaders/stanford.rb +10 -8
  15. data/lib/treat/version.rb +1 -1
  16. data/lib/treat/workers/formatters/serializers/mongo.rb +2 -2
  17. data/lib/treat/workers/formatters/serializers/xml.rb +7 -7
  18. data/lib/treat/workers/formatters/unserializers/mongo.rb +16 -8
  19. data/lib/treat/workers/formatters/unserializers/xml.rb +5 -5
  20. data/lib/treat/workers/formatters/visualizers/dot.rb +7 -7
  21. data/lib/treat/workers/learners/classifiers/id3.rb +4 -3
  22. data/lib/treat/workers/learners/classifiers/linear.rb +53 -0
  23. data/lib/treat/workers/learners/classifiers/mlp.rb +5 -5
  24. data/lib/treat/workers/learners/classifiers/svm.rb +31 -0
  25. data/lib/treat/workers/lexicalizers/taggers/stanford.rb +4 -2
  26. data/lib/treat/workers/processors/parsers/enju.rb +17 -17
  27. data/lib/treat/workers/processors/segmenters/punkt.rb +3 -1
  28. data/spec/collection.rb +3 -3
  29. data/spec/core.rb +430 -21
  30. data/spec/document.rb +1 -1
  31. data/spec/entity.rb +2 -8
  32. data/spec/helper.rb +34 -0
  33. data/spec/phrase.rb +1 -1
  34. data/spec/sandbox.rb +31 -8
  35. data/spec/token.rb +1 -1
  36. data/spec/treat.rb +1 -1
  37. data/spec/word.rb +1 -1
  38. data/spec/zone.rb +1 -1
  39. metadata +9 -8
  40. data/files/3_2_release_notes.html +0 -766
  41. data/files/bc-monty-robinson-sentencing.html +0 -1569
  42. data/files/syria-aleppo-clashes.html +0 -1376
  43. data/lib/treat/core/feature.rb +0 -42
  44. data/lib/treat/core/node.rb +0 -251
  45. data/spec/node.rb +0 -117
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Treat - Text Retrieval, Extraction and Annotation Toolkit, v. 1.1.1
1
+ Treat - Text Retrieval, Extraction and Annotation Toolkit, v. 1.1.2
2
2
 
3
3
  This program is free software: you can redistribute it and/or modify
4
4
  it under the terms of the GNU General Public License as published by
@@ -1,4 +1,5 @@
1
1
  ['xml', 'html', 'txt', 'odt',
2
2
  'abw', 'doc', 'yaml', 'uea',
3
3
  'lda', 'pdf', 'ptb', 'dot',
4
- 'ai', 'id3', 'svo', 'mlp' ]
4
+ 'ai', 'id3', 'svo', 'mlp',
5
+ 'svm']
@@ -0,0 +1 @@
1
+ {model_path: nil}
@@ -0,0 +1 @@
1
+ {model_path: nil}
@@ -3,11 +3,6 @@
3
3
  # have already been classified, complete with
4
4
  # references to these entities.
5
5
  class Treat::Core::DataSet
6
-
7
- # Used to serialize Procs.
8
- silence_warnings do
9
- require 'sourcify'
10
- end
11
6
 
12
7
  # The classification problem this
13
8
  # data set holds data for.
@@ -15,68 +10,143 @@ class Treat::Core::DataSet
15
10
  # Items that have been already
16
11
  # classified (training data).
17
12
  attr_accessor :items
18
- # References to the IDs of the
19
- # original entities contained
20
- # in the data set.
21
- attr_accessor :entities
22
13
 
23
- # Initialize the DataSet. Can be
24
- # done with a Problem entity
25
- # (thereby creating an empty set)
26
- # or with a filename (representing
27
- # a serialized data set which will
28
- # then be deserialized and loaded).
29
- def initialize(prob_or_file)
30
- if prob_or_file.is_a?(String)
31
- ds = self.class.
32
- unserialize(prob_or_file)
33
- @problem = ds.problem
34
- @items = ds.items
35
- @entities = ds.entities
36
- else
37
- @problem = prob_or_file
38
- @items, @entities = [], []
14
+ # Initialize the DataSet.
15
+ def initialize(problem)
16
+ unless problem.is_a?(Treat::Core::Problem)
17
+ raise Treat::Exception, "The first argument " +
18
+ "to initialize should be an instance of " +
19
+ "Treat::Core::Problem."
20
+ end
21
+ @problem, @items = problem, []
22
+ end
23
+
24
+ def self.build(from)
25
+ if from.is_a?(Hash)
26
+ Treat::Core::DataSet.unserialize(
27
+ Treat.databases.default.adapter, from)
28
+ elsif from.is_a?(String)
29
+ unless File.readable?(from)
30
+ raise Treat::Exception,
31
+ "Attempting to initialize data set from "
32
+ "file #{from}, but it is not readable."
33
+ end
34
+ Treat::Core::DataSet.unserialize(
35
+ extension, file: from)
39
36
  end
40
37
  end
41
38
 
42
- # Add an entity to the data set.
43
- # The entity's relevant features
44
- # are calculated based on the
45
- # classification problem, and a
46
- # line with the results of the
47
- # calculation is added to the
48
- # data set, along with the ID
49
- # of the entity.
39
+ # Add an entity to the data set. The
40
+ # entity's relevant features are
41
+ # calculated based on the classification
42
+ # problem, and a line with the results
43
+ # of the calculation is added to the
44
+ # data set, along with the ID of the entity.
50
45
  def <<(entity)
51
- @items << @problem.
52
- export_item(entity)
53
- @entities << entity.id
46
+ @items << {
47
+ tags: (!@problem.tags.empty? ?
48
+ @problem.export_tags(entity) : []),
49
+ features: @problem.
50
+ export_features(entity),
51
+ id: entity.id }
52
+ end
53
+
54
+ # Serialize the data set to a file,
55
+ # or store it inside the database.
56
+ def serialize(handler, options = {})
57
+ send("to_#{handler}", options)
54
58
  end
55
59
 
56
- # Marshal the data set to the supplied
57
- # file name. Marshal is used for speed;
58
- # other serialization options may be
59
- # provided in later versions. This
60
- # method relies on the sourcify gem
61
- # to transform Feature procs to strings,
62
- # since procs/lambdas can't be serialized.
63
- def serialize(file)
60
+ # Unserialize a data set file created
61
+ # by using the #serialize method.
62
+ def self.unserialize(handler, options)
63
+ self.send("from_#{handler}", options)
64
+ end
65
+
66
+ # Serialize the data set using Marshal.
67
+ def to_marshal(options)
68
+ file = options[:file]
64
69
  problem = @problem.dup
65
70
  problem.features.each do |feature|
66
- next unless feature.proc
67
- feature.proc = feature.proc.to_source
71
+ feature.proc = nil
72
+ end
73
+ problem.tags.each do |tag|
74
+ tag.proc = nil
68
75
  end
69
- data = [problem, @items, @entities]
76
+ data = [problem, @items]
70
77
  File.open(file, 'w') do |f|
71
78
  f.write(Marshal.dump(data))
72
79
  end
80
+ end
81
+
82
+ # Unserialize the data using Marshal.
83
+ def self.from_marshal(options)
84
+ file = options[:file]
85
+ data = Marshal.load(File.binread(file))
86
+ problem, items = *data
73
87
  problem.features.each do |feature|
74
- next unless feature.proc
75
- source = feature.proc[5..-1]
76
- feature.proc = eval("Proc.new #{source}")
88
+ next unless feature.proc_string
89
+ feature.proc = eval(feature.proc_string)
90
+ end
91
+ problem.tags.each do |tag|
92
+ next unless tag.proc_string
93
+ tag.proc = eval(tag.proc_string)
94
+ end
95
+ data_set = Treat::Core::DataSet.new(problem)
96
+ data_set.items = items
97
+ data_set
98
+ end
99
+
100
+ # Serialize the data set to a MongoDB record.
101
+ def to_mongo(options)
102
+ require 'mongo'
103
+ host = options[:host] || Treat.databases.mongo.host
104
+ db = options[:db] || Treat.databases.mongo.db
105
+ # UNLESS HOST, UNLESS DB
106
+ database = Mongo::Connection.new(host).db(db)
107
+ database.collection('problems').update(
108
+ {id: @problem.id}, @problem.to_hash, {upsert: true})
109
+ feature_labels = @problem.feature_labels
110
+ feature_labels << @problem.question.name
111
+ tag_labels = @problem.tag_labels
112
+ tags = @problem.tags.map { |t| t.name }
113
+ data = database.collection('data')
114
+ pid = @problem.id
115
+ @items.each do |item|
116
+ item[:features] = Hash[feature_labels.zip(item[:features])]
117
+ item[:tags] = Hash[tag_labels.zip(item[:tags])]
118
+ item[:problem] = pid
119
+ data.insert(item)
77
120
  end
78
121
  end
79
122
 
123
+ def self.from_mongo(options)
124
+ require 'mongo'
125
+ host = options.delete(:host) || Treat.databases.mongo.host
126
+ db = options.delete(:db) || Treat.databases.mongo.db
127
+ database = Mongo::Connection.new(host).db(db)
128
+ p_record = database.collection('problems').
129
+ find_one(id: options[:problem])
130
+ unless p_record
131
+ raise Treat::Exception,
132
+ "Couldn't retrieve problem ID #{options[:problem]}."
133
+ end
134
+ problem = Treat::Core::Problem.from_hash(p_record)
135
+ data = database.collection('data').find(options).to_a
136
+ items = []
137
+ data.each do |datum|
138
+ datum.delete("_id"); datum.delete('problem')
139
+ item = {}
140
+ item[:features] = datum['features'].values
141
+ item[:tags] = datum['tags'].values
142
+ item[:id] = datum['id']
143
+ items << item
144
+ end
145
+ data_set = Treat::Core::DataSet.new(problem)
146
+ data_set.items = items
147
+ data_set
148
+ end
149
+
80
150
  # Merge another data set into this one.
81
151
  def merge(data_set)
82
152
  if data_set.problem != @problem
@@ -84,25 +154,14 @@ class Treat::Core::DataSet
84
154
  "Cannot merge two data sets that " +
85
155
  "don't reference the same problem."
86
156
  else
87
- @items << data_set.items
88
- @entities << data_set.entities
157
+ @items += data_set.items
89
158
  end
90
159
  end
91
160
 
92
- # Unserialize a data set file created
93
- # by using the #serialize method.
94
- def self.unserialize(file)
95
- data = Marshal.load(File.binread(file))
96
- problem, items, entities = *data
97
- problem.features.each do |feature|
98
- next unless feature.proc
99
- source = feature.proc[5..-1]
100
- feature.proc = eval("Proc.new #{source}")
101
- end
102
- data_set = Treat::Core::DataSet.new(problem)
103
- data_set.items = items
104
- data_set.entities = entities
105
- data_set
161
+ # Compare with other data set.
162
+ def ==(data_set)
163
+ @problem == data_set.problem &&
164
+ @items == data_set.items
106
165
  end
107
166
 
108
167
  end
@@ -0,0 +1,59 @@
1
+ # Represents a feature to be used
2
+ # in a classification task.
3
+ class Treat::Core::Export
4
+
5
+ # The name of the feature. If no
6
+ # proc is supplied, this assumes
7
+ # that the target of your classification
8
+ # problem responds to the method
9
+ # corresponding to this name.
10
+ attr_reader :name
11
+ # The feature's default value, if nil.
12
+ attr_reader :default
13
+ # A proc that can be used to perform
14
+ # calculations before storing a feature.
15
+ attr_accessor :proc
16
+ # The proc as a string value.
17
+ attr_accessor :proc_string
18
+
19
+ # Initialize a feature for a classification problem.
20
+ def initialize(name, default = nil, proc_string = nil)
21
+ unless name.is_a?(Symbol)
22
+ raise Treat::Exception,
23
+ "The first argument to initialize should "+
24
+ "be a symbol representing the name of the export."
25
+ end
26
+ if proc_string && !proc_string.is_a?(String)
27
+ raise Treat::Exception,
28
+ "The third argument to initialize, " +
29
+ "if supplied, should be a string that " +
30
+ "can be evaluated to yield a Proc."
31
+ end
32
+ @name, @default, @proc_string =
33
+ name, default, proc_string
34
+ begin
35
+ @proc = proc_string ?
36
+ eval(proc_string) : nil
37
+ rescue Exception => e
38
+ raise Treat::Exception,
39
+ "The third argument to initialize " +
40
+ "did not evaluate without errors " +
41
+ "(#{e.message})."
42
+ end
43
+ if @proc && !@proc.is_a?(Proc)
44
+ raise Treat::Exception,
45
+ "The third argument did not evaluate to a Proc."
46
+ end
47
+ end
48
+
49
+ # Custom comparison operator for features.
50
+ def ==(feature)
51
+ @name == feature.name &&
52
+ @default == feature.default &&
53
+ @proc_string == feature.proc_string
54
+ end
55
+
56
+ end
57
+
58
+ class Treat::Core::Feature < Treat::Core::Export; end
59
+ class Treat::Core::Tag < Treat::Core::Export; end
@@ -4,27 +4,56 @@
4
4
  # to attempt to answer that question?
5
5
  class Treat::Core::Problem
6
6
 
7
+ # A unique identifier for the problem.
8
+ attr_accessor :id
7
9
  # The question we are trying to answer.
8
10
  attr_reader :question
9
11
  # An array of features that will be
10
12
  # looked at in trying to answer the
11
13
  # problem's question.
12
14
  attr_reader :features
15
+ attr_reader :tags
13
16
  # Just the labels from the features.
14
- attr_reader :labels
17
+ attr_reader :feature_labels
18
+ attr_reader :tag_labels
15
19
 
16
20
  # Initialize the problem with a question
17
- # and an arbitrary number of features.
18
- def initialize(question, *features)
19
- @question = question
20
- @features = features
21
- @labels = @features.map { |f| f.name }
21
+ # and an arbitrary number of features. # FIXME: init with id!?
22
+ def initialize(question, *exports)
23
+ unless question.is_a?(Treat::Core::Question)
24
+ raise Treat::Exception,
25
+ "The first argument to initialize " +
26
+ "should be an instance of " +
27
+ "Treat::Core::Question."
28
+ end
29
+ if exports.any? { |f| !f.is_a?(Treat::Core::Export) }
30
+ raise Treat::Exception,
31
+ "The second argument and all subsequent ones " +
32
+ "to initialize should be instances of subclasses " +
33
+ "of Treat::Core::Export."
34
+ end
35
+ @question, @id = question, object_id
36
+ @features = exports.select do |exp|
37
+ exp.is_a?(Treat::Core::Feature)
38
+ end
39
+ if @features.size == 0
40
+ raise Treat::Exception,
41
+ "Problem should be supplied with at least "+
42
+ "one feature to work with."
43
+ end
44
+ @tags = exports.select do |exp|
45
+ exp.is_a?(Treat::Core::Tag)
46
+ end
47
+ @feature_labels = @features.map { |f| f.name }
48
+ @tag_labels = @tags.map { |t| t.name }
22
49
  end
23
50
 
24
51
  # Custom comparison for problems.
52
+ # Should we check for ID here ? FIXME
25
53
  def ==(problem)
26
54
  @question == problem.question &&
27
- @features == problem.features
55
+ @features == problem.features &&
56
+ @tags == problem.tags
28
57
  end
29
58
 
30
59
  # Return an array of all the entity's
@@ -32,18 +61,72 @@ class Treat::Core::Problem
32
61
  # If include_answer is set to true, will
33
62
  # append the answer to the problem after
34
63
  # all of the features.
35
- def export_item(e, include_answer = true)
36
- line = []
37
- @features.each do |feature|
38
- r = feature.proc ?
39
- feature.proc.call(e) :
40
- e.send(feature.name)
41
- line << (r || feature.default)
42
- end
43
- return line unless include_answer
44
- line << (e.has?(@question.name) ?
64
+ def export_features(e, include_answer = true)
65
+ features = export(e, @features)
66
+ return features unless include_answer
67
+ features << (e.has?(@question.name) ?
45
68
  e.get(@question.name) : @question.default)
46
- line
69
+ features
70
+ end
71
+
72
+ def export_tags(entity)
73
+ if @tags.empty?
74
+ raise Treat::Exception,
75
+ "Cannot export the tags, because " +
76
+ "this problem doesn't have any."
77
+ end
78
+ export(entity, @tags)
79
+ end
80
+
81
+ def export(entity, exports)
82
+ unless @question.target == entity.type
83
+ raise Treat::Exception,
84
+ "This classification problem targets #{@question.target}s, " +
85
+ "but a(n) #{entity.type} was passed to export instead."
86
+ end
87
+ ret = []
88
+ exports.each do |export|
89
+ r = export.proc ?
90
+ export.proc.call(entity) :
91
+ entity.send(export.name)
92
+ ret << (r || export.default)
93
+ end
94
+ ret
95
+ end
96
+
97
+ def to_hash
98
+ {'question' => object_to_hash(@question),
99
+ 'features' => @features.map { |f|
100
+ object_to_hash(f.tap { |f| f.proc = nil }) },
101
+ 'tags' => @tags.map { |t|
102
+ object_to_hash(t.tap { |t| t.proc = nil }) },
103
+ 'id' => @id }
104
+ end
105
+
106
+ def self.from_hash(hash)
107
+ question = Treat::Core::Question.new(
108
+ hash['question']['name'],
109
+ hash['question']['target'],
110
+ hash['question']['type'],
111
+ hash['question']['default'],
112
+ hash['question']['labels']
113
+ )
114
+ features = []
115
+ hash['features'].each do |feature|
116
+ features << Treat::Core::Feature.new(
117
+ feature['name'], feature['default'],
118
+ feature['proc_string'])
119
+ end
120
+ tags = []
121
+ hash['tags'].each do |tag|
122
+ tags << Treat::Core::Tag.new(
123
+ tag['name'], tag['default'],
124
+ tag['proc_string'])
125
+ end
126
+ features_and_tags = features + tags
127
+ p = Treat::Core::Problem.new(question, *features_and_tags)
128
+ p.id = hash['id']
129
+ p
47
130
  end
48
131
 
49
132
  end
@@ -8,20 +8,35 @@ class Treat::Core::Question
8
8
  # also be used as the annotation name
9
9
  # for the answer to the question.
10
10
  attr_reader :name
11
- # Can be :continuous or :discrete,
12
- # depending on the features used.
13
- attr_reader :type
14
11
  # Defines the target of the question
15
12
  # (e.g. :sentence, :paragraph, etc.)
16
13
  attr_reader :target
14
+ # Can be :continuous or :discrete,
15
+ # depending on the features used.
16
+ attr_reader :type
17
17
  # Default for the answer to the question.
18
18
  attr_reader :default
19
+ # A list of possible answers to the question.
20
+ attr_reader :labels
19
21
 
20
22
  # Initialize the question.
21
23
  def initialize(name, target,
22
- type = :continuous, default = nil)
23
- @name, @target = name, target
24
- @type, @default = type, default
24
+ type = :continuous, default = nil, labels = [])
25
+ unless name.is_a?(Symbol)
26
+ raise Treat::Exception,
27
+ "Question name should be a symbol."
28
+ end
29
+ unless Treat.core.entities.list.include?(target)
30
+ raise Treat::Exception, "Target type should be " +
31
+ "a symbol and should be one of the following: " +
32
+ Treat.core.entities.list.inspect
33
+ end
34
+ unless [:continuous, :discrete].include?(type)
35
+ raise Treat::Exception, "Type should be " +
36
+ "continuous or discrete."
37
+ end
38
+ @name, @target, @type, @default, @labels =
39
+ name, target, type, default, labels
25
40
  end
26
41
 
27
42
  # Custom comparison operator for questions.
@@ -29,7 +44,8 @@ class Treat::Core::Question
29
44
  @name == question.name &&
30
45
  @type == question.type &&
31
46
  @target == question.target &&
32
- @default == question.default
47
+ @default == question.default &&
48
+ @labels = question.labels
33
49
  end
34
50
 
35
51
  end
@@ -94,10 +94,14 @@ module Treat::Entities::Abilities::Iterable
94
94
  end
95
95
 
96
96
  # Number of children that have a given feature.
97
- def num_children_with_feature(feature)
97
+ # Second variable to allow for passing value to check for.
98
+ def num_children_with_feature(feature, value = nil, recursive = true)
98
99
  i = 0
99
- each do |c|
100
- i += 1 if c.has?(feature)
100
+ m = method(recursive ? :each_entity : :each)
101
+ m.call do |c|
102
+ next unless c.has?(feature)
103
+ i += (value == nil ? 1 :
104
+ (c.get(feature) == value ? 1 : 0))
101
105
  end
102
106
  i
103
107
  end
@@ -42,14 +42,14 @@ module Treat::Entities::Abilities::Stringable
42
42
  if caller_method(2) == :inspect
43
43
  @id.to_s
44
44
  else
45
- dependencies = []
46
- @dependencies.each do |dependency|
47
- dependencies <<
48
- "#{dependency.target}#{dependency.type}"
45
+ edges = []
46
+ @edges.each do |edge|
47
+ edges <<
48
+ "#{edge.target}#{edge.type}"
49
49
  end
50
50
  s += " --- #{short_value.inspect}" +
51
51
  " --- #{@features.inspect} " +
52
- " --- #{dependencies.inspect} "
52
+ " --- #{edges.inspect} "
53
53
  end
54
54
  s
55
55
  end
@@ -6,12 +6,16 @@ module Treat::Entities
6
6
  # containing the texts of the collection.
7
7
  def initialize(folder = nil, id = nil)
8
8
  super('', id)
9
- if folder && !FileTest.directory?(folder)
10
- FileUtils.mkdir(folder)
9
+ if folder
10
+ if !FileTest.directory?(folder)
11
+ FileUtils.mkdir(folder)
12
+ end
13
+ set :folder, folder if folder
14
+ i = folder + '/.index'
15
+ if FileTest.directory?(i)
16
+ set :index, i
17
+ end
11
18
  end
12
- set :folder, folder if folder
13
- i = folder + '/.index'
14
- set :index, i if FileTest.directory?(i)
15
19
  end
16
20
 
17
21
  # Works like the default <<, but if the
@@ -19,7 +23,7 @@ module Treat::Entities
19
23
  # document, then copy that collection or
20
24
  # document into this collection's folder.
21
25
  def <<(entities, copy = true)
22
- unless entities.is_a? Array
26
+ unless entities.is_a?(Array)
23
27
  entities = [entities]
24
28
  end
25
29
  entities.each do |entity|
@@ -9,7 +9,7 @@ module Treat::Entities
9
9
 
10
10
  require 'birch'
11
11
 
12
- class Entity < Treat::Core::Node
12
+ class Entity < ::Birch::Tree
13
13
 
14
14
  # A Symbol representing the lowercase
15
15
  # version of the class name.
@@ -0,0 +1,8 @@
1
+ def object_to_hash(obj)
2
+ hash = {}
3
+ obj.instance_variables.each do |var|
4
+ val = obj.instance_variable_get(var)
5
+ hash[var.to_s.delete("@")] = val
6
+ end
7
+ hash
8
+ end
@@ -9,18 +9,20 @@ class Treat::Loaders::Stanford
9
9
  def self.load(language = nil)
10
10
  return if @@loaded
11
11
  language ||= Treat.core.language.default
12
- jar_path = Treat.libraries.
13
- stanford.jar_path || Treat.paths.bin
14
- models_path = Treat.libraries.
15
- stanford.model_path || Treat.paths.models
16
- StanfordCoreNLP.jar_path =
17
- "#{jar_path}stanford/"
18
- StanfordCoreNLP.model_path =
19
- "#{models_path}stanford/"
12
+
13
+ StanfordCoreNLP.jar_path =
14
+ Treat.libraries.stanford.jar_path ||
15
+ Treat.paths.bin + 'stanford/'
16
+
17
+ StanfordCoreNLP.model_path =
18
+ Treat.libraries.stanford.model_path ||
19
+ Treat.paths.models + 'stanford/'
20
+
20
21
  StanfordCoreNLP.use(language)
21
22
  if Treat.core.verbosity.silence
22
23
  StanfordCoreNLP.log_file = NULL_DEVICE
23
24
  end
25
+
24
26
  StanfordCoreNLP.bind
25
27
  @@loaded = true
26
28
  end
data/lib/treat/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Treat
2
- VERSION = "1.1.2"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -25,7 +25,7 @@ class Treat::Workers::Formatters::Serializers::Mongo
25
25
 
26
26
  @@database ||= Mongo::Connection.
27
27
  new(Treat.databases.mongo.host).
28
- db(Treat.databases.mongo.db || options[:db])
28
+ db(options[:db] || Treat.databases.mongo.db)
29
29
 
30
30
  supertype = cl(Treat::Entities.const_get(
31
31
  entity.type.to_s.capitalize.intern).superclass).downcase
@@ -35,7 +35,7 @@ class Treat::Workers::Formatters::Serializers::Mongo
35
35
  coll = @@database.collection(supertypes)
36
36
 
37
37
  if entity.type == :collection
38
- docs = @@database.collection('documents')
38
+ docs = @@database.collection('documents') # Take a design decision here.
39
39
  coll.update(
40
40
  {id: entity.id}, self.do_serialize(entity,
41
41
  options.merge({:stop_at => Treat::Entities::Document})),