nlg 0.0.1
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/.gitignore +5 -0
- data/Gemfile +4 -0
- data/README +0 -0
- data/Rakefile +10 -0
- data/lib/nlg.rb +12 -0
- data/lib/nlg/nlg_exception.rb +2 -0
- data/lib/nlg/paragraph.rb +125 -0
- data/lib/nlg/sentence.rb +52 -0
- data/lib/nlg/sentence_object.rb +15 -0
- data/lib/nlg/version.rb +3 -0
- data/nlg.gemspec +25 -0
- data/test/json.txt +84 -0
- data/test/json_place.txt +65 -0
- data/test/json_thing.txt +57 -0
- data/test/sentence_test.rb +31 -0
- data/test/sentence_test_json.txt +28 -0
- data/test/test2.rb +13 -0
- data/test/test_helper.rb +7 -0
- metadata +97 -0
data/Gemfile
ADDED
data/README
ADDED
File without changes
|
data/Rakefile
ADDED
data/lib/nlg.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
module Nlg
|
2
|
+
class Paragraph
|
3
|
+
|
4
|
+
attr_accessor :defaults, :dataset, :sentences
|
5
|
+
# The parameters, dataset and defaults are both hashes.
|
6
|
+
# For example:
|
7
|
+
#
|
8
|
+
# defaults = { "tense" => "present",
|
9
|
+
# "verb" => "have",
|
10
|
+
# "pronoun" => "it",
|
11
|
+
# "voice" => "active",
|
12
|
+
# "aspect" => "habitual",
|
13
|
+
# "preposition" => "of" }
|
14
|
+
#
|
15
|
+
# dataset = {"subject"=>"Pune",
|
16
|
+
# "objects"=>
|
17
|
+
# { "population"=>
|
18
|
+
# {"value"=>"57841284790",
|
19
|
+
# "specifications"=>{}},
|
20
|
+
# "rainfall"=>
|
21
|
+
# {"value"=>"198",
|
22
|
+
# "specifications"=>{"complement"=>"mm"}},
|
23
|
+
# "high temperature"=>
|
24
|
+
# {"value"=>"45",
|
25
|
+
# "specifications"=>{"complement"=>"°C"},
|
26
|
+
# "conjugated_with"=>["low temperature"]},
|
27
|
+
# "low temperature"=>
|
28
|
+
# {"value"=>"20",
|
29
|
+
# "specifications"=>{"complement"=>"°C"},
|
30
|
+
# "conjugated_with"=>["high temperature", "low temperature", "rainfall"]},
|
31
|
+
# "forts"=>
|
32
|
+
# {"value"=>["sinhgad", "lohgad"],
|
33
|
+
# "specifications"=>{"preposition"=>"named"},
|
34
|
+
# "conjugated_with"=>["high temperature", "low temperature", "rainfall"]}
|
35
|
+
# }
|
36
|
+
# }
|
37
|
+
#
|
38
|
+
# method to set defaults, build_conjugations and initialize other attributes
|
39
|
+
def initialize(dataset, defaults)
|
40
|
+
@subject = dataset['subject']
|
41
|
+
@objects = {}
|
42
|
+
@conjugations = {}
|
43
|
+
@defaults = defaults
|
44
|
+
@sentences = []
|
45
|
+
|
46
|
+
# Iterating through all the objects and building conjugations.
|
47
|
+
dataset['objects'].each do |object_type, object_details|
|
48
|
+
# A check to allow objects to be created with "conjugated" => false only if not already
|
49
|
+
# present. build_conjugations method called which recursively builds the conjugations.
|
50
|
+
unless @objects.has_key?(object_type)
|
51
|
+
sentence_object = SentenceObject.new(object_type, object_details, "conjugated" => false)
|
52
|
+
@objects[object_type] = sentence_object
|
53
|
+
build_conjugations(object_type, dataset['objects'])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
def build
|
60
|
+
puts @conjugations.inspect, @objects.inspect
|
61
|
+
# Paragraph generation by generating individual sentences.
|
62
|
+
@objects.each do |object_type, sentence_object|
|
63
|
+
sentence = Sentence.new(:subject => @subject, :specifications => @defaults.merge(sentence_object.specifications))
|
64
|
+
@sentences << sentence.build(object_type, sentence_object)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Method called internally in initialize to build conjugations among sentences of a paragraph.
|
69
|
+
# The example dataset will give the conjugations,
|
70
|
+
#
|
71
|
+
# @conjugations ={"population"=>[], "forts"=>["low temperature", "rainfall", "high temperature"]}
|
72
|
+
def build_conjugations(object_type, objects, parent_object = nil)
|
73
|
+
object_details = objects[object_type]
|
74
|
+
|
75
|
+
# Condition for setting the parent_object to be passed recursively
|
76
|
+
parent_object = object_type unless parent_object
|
77
|
+
|
78
|
+
# Creating the @conjugations[parent_object] array recursively to finally
|
79
|
+
# build the conjugations.
|
80
|
+
conjugated_with = object_details['conjugated_with']
|
81
|
+
|
82
|
+
unless conjugated_with.nil? or conjugated_with.empty?
|
83
|
+
conjugated_with.each do |conjugated_object|
|
84
|
+
if objects.has_key?(conjugated_object)
|
85
|
+
|
86
|
+
# Creating object with "conjugated" => true if its present in "conjugated_with" array.
|
87
|
+
unless @objects.has_key?(conjugated_object)
|
88
|
+
sentence_object = SentenceObject.new(conjugated_object, objects[conjugated_object], "conjugated" => true)
|
89
|
+
@objects[conjugated_object] = sentence_object
|
90
|
+
end
|
91
|
+
|
92
|
+
# Creating array if does not already exist.
|
93
|
+
@conjugations[parent_object] ||= []
|
94
|
+
|
95
|
+
# Checking if currently iterating object included in the array already/is the parent_object itself.
|
96
|
+
unless @conjugations[parent_object].include?(conjugated_object) or conjugated_object == parent_object
|
97
|
+
|
98
|
+
# If an already parsed object with "conjugated" = false comes as a conjugation
|
99
|
+
# to the object being parsed.
|
100
|
+
if @objects[conjugated_object].conjugated == false
|
101
|
+
@objects[conjugated_object].conjugated = true
|
102
|
+
@conjugations[parent_object] = @conjugations[parent_object].concat(@conjugations[conjugated_object]).uniq
|
103
|
+
@conjugations.delete(conjugated_object)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Appending to the conjugations array for the parent_object.
|
107
|
+
@conjugations[parent_object] << conjugated_object
|
108
|
+
|
109
|
+
# recursive call for building conjugations for a parent_object
|
110
|
+
build_conjugations(conjugated_object, objects, parent_object)
|
111
|
+
end
|
112
|
+
else
|
113
|
+
raise NlgException.new "No object named #{conjugation_object}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
else
|
117
|
+
|
118
|
+
# adding independent sentences which have no conjugations
|
119
|
+
@conjugations[object_type] = [] if @objects[object_type].conjugated == false
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
data/lib/nlg/sentence.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Nlg
|
2
|
+
class Sentence
|
3
|
+
|
4
|
+
attr_accessor :verb, :tense, :pronoun, :voice, :subject, :value, :object
|
5
|
+
attr_accessor :complement, :coordination_phrase, :preposition, :aspect
|
6
|
+
|
7
|
+
def initialize(args = {})
|
8
|
+
specifications = args[:specifications]
|
9
|
+
@verb = specifications["verb"] || (raise NlgException.new "Verb is nil")
|
10
|
+
@tense = specifications["tense"] || (raise NlgException.new "tense is nil")
|
11
|
+
@pronoun = specifications["pronoun"] || (raise NlgException.new "pronoun is nil")
|
12
|
+
@complement = specifications["complement"]
|
13
|
+
@coordination_phrase = specifications["coordination_phrase"]
|
14
|
+
@voice = specifications["voice"]
|
15
|
+
@aspect = specifications["aspect"] || (raise NlgException.new "aspect is nil")
|
16
|
+
@preposition = specifications["preposition"]
|
17
|
+
@subject = args[:subject] || true
|
18
|
+
end
|
19
|
+
|
20
|
+
#method to build a sentence. Returns the formed sentece to build_paragraph
|
21
|
+
def build(object_type, object_details)
|
22
|
+
self.value = object_details.value
|
23
|
+
self.value = value.join(',') if value.is_a?(Array)
|
24
|
+
self.object = object_type
|
25
|
+
formed_sentence = self.form
|
26
|
+
return formed_sentence
|
27
|
+
end
|
28
|
+
|
29
|
+
#method to form the sentence using the given specifications
|
30
|
+
def form
|
31
|
+
set_tense
|
32
|
+
predicate = set_predicate
|
33
|
+
formed_sentence = "#{verb} #{predicate}".verb.conjugate :subject => subject, :tense => tense.to_sym, :aspect => aspect.to_sym
|
34
|
+
return "#{formed_sentence} #{complement}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_tense
|
38
|
+
if tense == "past" and aspect == "habitual"
|
39
|
+
self.aspect = "perfective"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def set_predicate
|
44
|
+
predicate = "#{preposition} #{value}"
|
45
|
+
if verb == "have"
|
46
|
+
predicate = "#{object} #{preposition} #{value}"
|
47
|
+
end
|
48
|
+
return predicate
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Nlg
|
2
|
+
class SentenceObject
|
3
|
+
attr_accessor :specifications, :value, :object_type, :conjugated
|
4
|
+
|
5
|
+
def initialize(object_type, object_details, options={})
|
6
|
+
puts object_details
|
7
|
+
@specifications = object_details['specifications'] if object_details['specifications']
|
8
|
+
@value = object_details['value']
|
9
|
+
@object_type = object_type
|
10
|
+
@conjugated = options["conjugated"]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
data/lib/nlg/version.rb
ADDED
data/nlg.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "nlg/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "nlg"
|
7
|
+
s.version = Nlg::VERSION
|
8
|
+
s.authors = ["Sricharan Sunder", "Jiren Patel", "Gautam Rege"]
|
9
|
+
s.email = ["sricharan@joshsoftware.com", "jiren@joshsoftware.com", "gautam@joshsoftware.com"]
|
10
|
+
s.homepage = "http://github.com/joshsoftware/nlg"
|
11
|
+
s.summary = %q{Natural Language Generation in Ruby}
|
12
|
+
s.description = %q{Build articles and paragraphs from structured data. Instead of a standard tempate, we can use this to build articles that are grammatically correct and creative.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "nlg"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.add_dependency "verbs"
|
21
|
+
s.add_dependency "active_support"
|
22
|
+
# specify any dependencies here; for example:
|
23
|
+
# s.add_development_dependency "rspec"
|
24
|
+
# s.add_runtime_dependency "rest-client"
|
25
|
+
end
|
data/test/json.txt
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
{ "defaults":
|
2
|
+
{ "tense": "present",
|
3
|
+
"verb": "be",
|
4
|
+
"pronoun": "he",
|
5
|
+
"voice": "active",
|
6
|
+
"aspect": "habitual"
|
7
|
+
},
|
8
|
+
|
9
|
+
"subjects":
|
10
|
+
{
|
11
|
+
"subject": "Sricharan",
|
12
|
+
"objects": [
|
13
|
+
{ "object" : "location",
|
14
|
+
"value": "aundh",
|
15
|
+
"specifications":
|
16
|
+
{
|
17
|
+
"verb": "live",
|
18
|
+
"preposition": "in",
|
19
|
+
"tense": "past",
|
20
|
+
"coordinated": true,
|
21
|
+
"coordination_phrase": "and"}
|
22
|
+
},
|
23
|
+
|
24
|
+
|
25
|
+
{ "object": "age",
|
26
|
+
"value": "19",
|
27
|
+
"specifications":
|
28
|
+
{"complement": "years old"
|
29
|
+
}
|
30
|
+
},
|
31
|
+
|
32
|
+
|
33
|
+
{ "object": "workplace",
|
34
|
+
"value": "Josh Software",
|
35
|
+
"specifications":
|
36
|
+
{
|
37
|
+
"verb": "work",
|
38
|
+
"preposition": "in",
|
39
|
+
"coordinated": true,
|
40
|
+
"coordination_phrase": "and"}
|
41
|
+
},
|
42
|
+
|
43
|
+
|
44
|
+
{ "object": "interest",
|
45
|
+
"value": ["music", "football", "movies"],
|
46
|
+
"specifications":
|
47
|
+
{
|
48
|
+
"verb": "like",
|
49
|
+
"coordinated": true,
|
50
|
+
"coordination_phrase": "and" }
|
51
|
+
},
|
52
|
+
|
53
|
+
|
54
|
+
{ "object": "achievement",
|
55
|
+
"value": "xyz",
|
56
|
+
"specifications":
|
57
|
+
{
|
58
|
+
"verb": "achieve",
|
59
|
+
"aspect": "perfect",
|
60
|
+
"coordinated": true,
|
61
|
+
"coordination_phrase": "and"}
|
62
|
+
},
|
63
|
+
|
64
|
+
|
65
|
+
{ "object": "height",
|
66
|
+
"value": "185",
|
67
|
+
"specifications":
|
68
|
+
{
|
69
|
+
"complement": "cm tall"}
|
70
|
+
},
|
71
|
+
|
72
|
+
|
73
|
+
{ "object": "weight",
|
74
|
+
"value": "70",
|
75
|
+
"specifications":
|
76
|
+
{
|
77
|
+
"verb": "weigh",
|
78
|
+
"complement": "kg"}
|
79
|
+
}
|
80
|
+
]
|
81
|
+
}
|
82
|
+
|
83
|
+
}
|
84
|
+
|
data/test/json_place.txt
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
{ "defaults":
|
2
|
+
{ "tense": "present",
|
3
|
+
"verb": "have",
|
4
|
+
"pronoun": "it",
|
5
|
+
"voice": "active",
|
6
|
+
"aspect": "habitual",
|
7
|
+
"preposition": "of"
|
8
|
+
},
|
9
|
+
|
10
|
+
"subjects":
|
11
|
+
{
|
12
|
+
"subject": "Pune",
|
13
|
+
"objects": {
|
14
|
+
"population":{
|
15
|
+
"value": "57841284790",
|
16
|
+
"specifications":
|
17
|
+
{
|
18
|
+
|
19
|
+
}
|
20
|
+
},
|
21
|
+
|
22
|
+
|
23
|
+
"rainfall": {
|
24
|
+
"value": "198",
|
25
|
+
"specifications":
|
26
|
+
{
|
27
|
+
"complement": "mm"}
|
28
|
+
|
29
|
+
},
|
30
|
+
|
31
|
+
|
32
|
+
"high temperature": {
|
33
|
+
"value": "45",
|
34
|
+
"specifications": {
|
35
|
+
"complement": "°C"
|
36
|
+
},
|
37
|
+
"conjugated_with": ["low temperature"]
|
38
|
+
},
|
39
|
+
|
40
|
+
|
41
|
+
"low temperature": {
|
42
|
+
"value": "20",
|
43
|
+
"specifications":
|
44
|
+
{
|
45
|
+
"complement": "°C" },
|
46
|
+
"conjugated_with": ["high temperature", "low temperature", "rainfall"]
|
47
|
+
},
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
"forts": {
|
52
|
+
"value": ["sinhgad", "lohgad"],
|
53
|
+
"specifications":
|
54
|
+
{
|
55
|
+
"preposition": "named"
|
56
|
+
},
|
57
|
+
"conjugated_with": ["high temperature", "low temperature", "rainfall"]
|
58
|
+
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
}
|
65
|
+
|
data/test/json_thing.txt
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
{ "defaults":
|
2
|
+
{ "tense": "present",
|
3
|
+
"verb": "be",
|
4
|
+
"pronoun": "it",
|
5
|
+
"voice": "active",
|
6
|
+
"aspect": "habitual"
|
7
|
+
},
|
8
|
+
|
9
|
+
"subjects":
|
10
|
+
{
|
11
|
+
"subject": "ABCD",
|
12
|
+
"objects": [
|
13
|
+
{ "object" : "type",
|
14
|
+
"value": "bottle",
|
15
|
+
"specifications":
|
16
|
+
{"preposition": "a"
|
17
|
+
}
|
18
|
+
},
|
19
|
+
|
20
|
+
|
21
|
+
{ "object": "height",
|
22
|
+
"value": "123",
|
23
|
+
"specifications":
|
24
|
+
{
|
25
|
+
"complement": "mm high."}
|
26
|
+
},
|
27
|
+
|
28
|
+
|
29
|
+
{ "object": "dimension",
|
30
|
+
"value": "12*2*3",
|
31
|
+
"specifications":
|
32
|
+
{"verb": "have"
|
33
|
+
}
|
34
|
+
},
|
35
|
+
|
36
|
+
|
37
|
+
{ "object": "weight",
|
38
|
+
"value": "20",
|
39
|
+
"specifications":
|
40
|
+
{"verb": "weigh",
|
41
|
+
"complement": "gm" }
|
42
|
+
},
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
{ "object": "cost",
|
47
|
+
"value": "123",
|
48
|
+
"specifications":
|
49
|
+
{"verb": "cost",
|
50
|
+
"complement": "rupees."
|
51
|
+
}
|
52
|
+
}
|
53
|
+
]
|
54
|
+
}
|
55
|
+
|
56
|
+
}
|
57
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class SentenceTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
dataset_json = File.read("test/sentence_test_json.txt")
|
7
|
+
dataset = JSON.parse(dataset_json)
|
8
|
+
@defaults = dataset['defaults']
|
9
|
+
@subject = dataset['subjects']['subject']
|
10
|
+
@objects = dataset['subjects']['objects']
|
11
|
+
@objects.each do |object_type, object_details|
|
12
|
+
@sentence_hash= {object_type => object_details}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
test "should init sentence" do
|
21
|
+
sentence = Nlg::Sentence.new(:subject => @subject, :specifications => @defaults.merge(@sentence_hash[@sentence_hash.keys.first]["specifications"]))
|
22
|
+
assert_equal @subject, sentence.subject
|
23
|
+
end
|
24
|
+
|
25
|
+
test "" do
|
26
|
+
@subject = nil
|
27
|
+
assert_raise NlgException
|
28
|
+
Sentence.new()
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
{ "defaults":
|
2
|
+
{ "tense": "present",
|
3
|
+
"verb": "have",
|
4
|
+
"pronoun": "it",
|
5
|
+
"voice": "active",
|
6
|
+
"aspect": "habitual",
|
7
|
+
"preposition": "of"
|
8
|
+
},
|
9
|
+
|
10
|
+
"subjects":
|
11
|
+
{
|
12
|
+
"subject": "Pune",
|
13
|
+
"objects": {
|
14
|
+
"population":{
|
15
|
+
"value": "57841284790",
|
16
|
+
"specifications":
|
17
|
+
{
|
18
|
+
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
|
27
|
+
}
|
28
|
+
|
data/test/test2.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require "nlg"
|
4
|
+
|
5
|
+
dataset_json = File.read("json_place.txt")
|
6
|
+
dataset = JSON.parse(dataset_json)
|
7
|
+
paragraph = Nlg::Paragraph.new(dataset["subjects"], dataset["defaults"])
|
8
|
+
paragraph.build
|
9
|
+
paragraph.sentences.each do |sentence|
|
10
|
+
puts sentence
|
11
|
+
end
|
12
|
+
|
13
|
+
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nlg
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sricharan Sunder
|
9
|
+
- Jiren Patel
|
10
|
+
- Gautam Rege
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2012-01-11 00:00:00.000000000Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: verbs
|
18
|
+
requirement: &10469010 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *10469010
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: active_support
|
29
|
+
requirement: &10468800 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ! '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *10468800
|
38
|
+
description: Build articles and paragraphs from structured data. Instead of a standard
|
39
|
+
tempate, we can use this to build articles that are grammatically correct and creative.
|
40
|
+
email:
|
41
|
+
- sricharan@joshsoftware.com
|
42
|
+
- jiren@joshsoftware.com
|
43
|
+
- gautam@joshsoftware.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- README
|
51
|
+
- Rakefile
|
52
|
+
- lib/nlg.rb
|
53
|
+
- lib/nlg/nlg_exception.rb
|
54
|
+
- lib/nlg/paragraph.rb
|
55
|
+
- lib/nlg/sentence.rb
|
56
|
+
- lib/nlg/sentence_object.rb
|
57
|
+
- lib/nlg/version.rb
|
58
|
+
- nlg.gemspec
|
59
|
+
- test/json.txt
|
60
|
+
- test/json_place.txt
|
61
|
+
- test/json_thing.txt
|
62
|
+
- test/sentence_test.rb
|
63
|
+
- test/sentence_test_json.txt
|
64
|
+
- test/test2.rb
|
65
|
+
- test/test_helper.rb
|
66
|
+
homepage: http://github.com/joshsoftware/nlg
|
67
|
+
licenses: []
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
requirements: []
|
85
|
+
rubyforge_project: nlg
|
86
|
+
rubygems_version: 1.8.10
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Natural Language Generation in Ruby
|
90
|
+
test_files:
|
91
|
+
- test/json.txt
|
92
|
+
- test/json_place.txt
|
93
|
+
- test/json_thing.txt
|
94
|
+
- test/sentence_test.rb
|
95
|
+
- test/sentence_test_json.txt
|
96
|
+
- test/test2.rb
|
97
|
+
- test/test_helper.rb
|