wordnet 1.0.0.pre.136 → 1.0.0.pre.139

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
@@ -1,4 +1,4 @@
1
- == v1.0.0 [2012-01-30] Michael Granger <ged@FaerieMUD.org>
1
+ == v1.0.0 [2012-08-22] Michael Granger <ged@FaerieMUD.org>
2
2
 
3
3
  Converted to use Sequel and wnsql.
4
4
 
@@ -4,25 +4,64 @@
4
4
 
5
5
  == Description
6
6
 
7
- This library is a Ruby interface to WordNet®. WordNet® is an online
8
- lexical reference system whose design is inspired by current
9
- psycholinguistic theories of human lexical memory. English nouns, verbs,
10
- adjectives and adverbs are organized into synonym sets, each
7
+ This library is a Ruby interface to WordNet®[http://wordnet.princeton.edu/].
8
+ WordNet® is an online lexical reference system whose design is inspired
9
+ by current psycholinguistic theories of human lexical memory. English
10
+ nouns, verbs, adjectives and adverbs are organized into synonym sets, each
11
11
  representing one underlying lexical concept. Different relations link
12
12
  the synonym sets.
13
13
 
14
- It uses WordNet-SQL, which is a conversion of the lexicon flatfiles into
15
- a relational database format. You can either install the 'wordnet-
16
- defaultdb' gem, which packages up the SQLite3 version of WordNet-SQL, or
17
- install your own and point the lexicon at it by passing a Sequel URL to
18
- the constructor.
14
+ This library uses WordNet-SQL[http://wnsql.sourceforge.net/], which is a
15
+ conversion of the lexicon flatfiles into a relational database format. You
16
+ can either install the 'wordnet-defaultdb' gem, which packages up the
17
+ SQLite3 version of WordNet-SQL, or install your own and point the lexicon
18
+ at it by passing
19
+ {Sequel connection parameters}[http://sequel.rubyforge.org/rdoc/files/doc/opening_databases_rdoc.html]
20
+ to the constructor.
19
21
 
22
+ === Usage
23
+
24
+ There are three major parts to this library:
25
+
26
+ [WordNet::Lexicon] the interface to the dictionary, used to connect to the
27
+ database and look up Words and Synsets.
28
+ [WordNet::Word] the English word entries in the Lexicon that are mapped
29
+ to Synsets via one or more Senses.
30
+ [WordNet::Synset] the main artifact of WordNet: a "synonym set". These
31
+ are connected to one or more Words through a Sense,
32
+ and are connected to each other via SemanticLinks.
33
+
34
+ The other object classes exist mostly as a way of representing relationships
35
+ between the main three:
36
+
37
+ [WordNet::Sense] represents a link between one or more Words and
38
+ one or more Synsets for one meaning of the word.
39
+ [WordNet::SemanticLink] represents a link between Synsets
40
+ [WordNet::LexicalLink] represents a link between Words in Synsets
41
+ [WordNet::Morph] an interface to a lookup table of irregular word
42
+ forms mapped to their base form (lemma)
43
+
44
+ The last class (WordNet::Model) is the abstract superclass for all the others,
45
+ and inherits most of its functionality from Sequel::Model, the ORM layer
46
+ of the Sequel toolkit. It's mostly just a container for the database
47
+ connection, with some convenience methods to allow the database connection
48
+ to be deferred until runtime instead of when the library loads.
49
+
50
+ The library also comes with the beginnings of support for the SUMO-WordNet
51
+ mapping:
52
+
53
+ [WordNet::SumoTerm] {Suggested Upper Merged Ontology}[http://www.ontologyportal.org/]
54
+ terms, with associations back to related Synsets.
55
+
56
+ This is only supported by a subset of the WordNetSQL databases, and there
57
+ is a fair amount of work left to be done before it's really functional. Drop
58
+ me a note if you're interested in working on this.
20
59
 
21
60
 
22
61
  == Requirements
23
62
 
24
- * Ruby >= 1.9.2
25
- * Sequel >= 3.29.0
63
+ * Ruby >= 1.9.3
64
+ * Sequel >= 3.38.0
26
65
 
27
66
 
28
67
  == Authors
data/Rakefile CHANGED
@@ -32,6 +32,7 @@ hoespec = Hoe.spec( 'wordnet' ) do
32
32
  self.dependency 'loggability', '~> 0.5'
33
33
  self.dependency 'sqlite3', '~> 1.3', :developer
34
34
  self.dependency 'rspec', '~> 2.7', :developer
35
+ self.dependency 'simplecov', '~> 0.6', :developer
35
36
 
36
37
  self.spec_extras[:licenses] = ["BSD"]
37
38
  self.spec_extras[:post_install_message] = %{
@@ -74,3 +75,9 @@ end
74
75
  # Rebuild the ChangeLog immediately before release
75
76
  task :prerelease => 'ChangeLog'
76
77
 
78
+ # Simplecov
79
+ desc "Build a coverage report"
80
+ task :coverage do
81
+ ENV["COVERAGE"] = 'yes'
82
+ Rake::Task[:spec].invoke
83
+ end
@@ -21,8 +21,8 @@ module WordNet
21
21
  REVISION = %q$Revision: $
22
22
 
23
23
  # Abort if not >=1.9.2
24
- abort "This version of WordNet requires Ruby 1.9.2 or greater." unless
25
- RUBY_VERSION >= '1.9.2'
24
+ abort "This version of WordNet requires Ruby 1.9.3 or greater." unless
25
+ RUBY_VERSION >= '1.9.3'
26
26
 
27
27
 
28
28
  ### Lexicon exception - something has gone wrong in the internals of the
@@ -10,11 +10,15 @@ class WordNet::LexicalLink < WordNet::Model( :lexlinks )
10
10
 
11
11
  set_primary_key [:word1id, :synset1id, :word2id, :synset2id, :linkid]
12
12
 
13
+ ##
14
+ # The WordNet::Sense the link is pointing *from*.
13
15
  many_to_one :origin,
14
16
  :class => :"WordNet::Sense",
15
17
  :key => :synset1id,
16
18
  :primary_key => :synsetid
17
19
 
20
+ ##
21
+ # The WordNet::Synset the link is pointing *to*.
18
22
  one_to_many :target,
19
23
  :class => :"WordNet::Synset",
20
24
  :key => :synsetid,
@@ -10,8 +10,115 @@ require 'wordnet/synset'
10
10
  require 'wordnet/word'
11
11
 
12
12
 
13
- # WordNet lexicon class - abstracts access to the WordNet lexical
14
- # database, and provides factory methods for looking up words and synsets.
13
+ # WordNet lexicon class - provides access to the WordNet lexical
14
+ # database, and provides factory methods for looking up words[rdoc-ref:WordNet::Word]
15
+ # and synsets[rdoc-ref:WordNet::Synset].
16
+ #
17
+ # == Creating a Lexicon
18
+ #
19
+ # To create a Lexicon, either point it at a database using [Sequel database connection
20
+ # criteria]{http://sequel.rubyforge.org/rdoc/files/doc/opening_databases_rdoc.html}:
21
+ #
22
+ # lex = WordNet::Lexicon.new( 'postgres://localhost/wordnet30' )
23
+ # # => #<WordNet::Lexicon:0x7fd192a76668 postgres://localhost/wordnet30>
24
+ #
25
+ # # Another way of doing the same thing:
26
+ # lex = WordNet::Lexicon.new( adapter: 'postgres', database: 'wordnet30', host: 'localhost' )
27
+ # # => #<WordNet::Lexicon:0x7fd192d374b0 postgres>
28
+ #
29
+ # Alternatively, if you have the 'wordnet-defaultdb' gem (which includes an
30
+ # embedded copy of the SQLite WordNET-SQL database) installed, just call ::new
31
+ # without any arguments:
32
+ #
33
+ # lex = WordNet::Lexicon.new
34
+ # # => #<WordNet::Lexicon:0x7fdbfac1a358 sqlite:[...]/gems/wordnet-defaultdb-1.0.1
35
+ # # /data/wordnet-defaultdb/wordnet30.sqlite>
36
+ #
37
+ # == Looking Up Synsets
38
+ #
39
+ # Once you have a Lexicon created, the main lookup method for Synsets is
40
+ # #[], which will return the first of any Synsets that are found:
41
+ #
42
+ # synset = lex[ :language ]
43
+ # # => #<WordNet::Synset:0x7fdbfaa987a0 {105650820} 'language, speech' (noun):
44
+ # # [noun.cognition] the mental faculty or power of vocal communication>
45
+ #
46
+ # If you want to look up *all* matching Synsets, use the #lookup_synsets
47
+ # method:
48
+ #
49
+ # synsets = lex.lookup_synsets( :language )
50
+ # # => [#<WordNet::Synset:0x7fdbfaac46c0 {105650820} 'language, speech' (noun):
51
+ # # [noun.cognition] the mental faculty or power of vocal
52
+ # # communication>,
53
+ # # #<WordNet::Synset:0x7fdbfaac45a8 {105808557} 'language, linguistic process'
54
+ # # (noun): [noun.cognition] the cognitive processes involved
55
+ # # in producing and understanding linguistic communication>,
56
+ # # #<WordNet::Synset:0x7fdbfaac4490 {106282651} 'language, linguistic
57
+ # # communication' (noun): [noun.communication] a systematic means of
58
+ # # communicating by the use of sounds or conventional symbols>,
59
+ # # #<WordNet::Synset:0x7fdbfaac4378 {106304059} 'language, nomenclature,
60
+ # # terminology' (noun): [noun.communication] a system of words used to
61
+ # # name things in a particular discipline>,
62
+ # # #<WordNet::Synset:0x7fdbfaac4260 {107051975} 'language, lyric, words'
63
+ # # (noun): [noun.communication] the text of a popular song or musical-comedy
64
+ # # number>,
65
+ # # #<WordNet::Synset:0x7fdbfaac4120 {107109196} 'language, oral communication,
66
+ # # speech, speech communication, spoken communication, spoken language,
67
+ # # voice communication' (noun): [noun.communication] (language)
68
+ # # communication by word of mouth>]
69
+ #
70
+ # Sometime, the first Synset isn't necessarily what you want; you want to look up
71
+ # a particular one. Both #[] and #lookup_synsets also provide several
72
+ # ways of filtering or selecting synsets.
73
+ #
74
+ # The first is the ability to select one based on its offset:
75
+ #
76
+ # lex[ :language, 2 ]
77
+ # # => #<WordNet::Synset:0x7ffa78e74d78 {105808557} 'language, linguistic
78
+ # # process' (noun): [noun.cognition] the cognitive processes involved in
79
+ # # producing and understanding linguistic communication>
80
+ #
81
+ # You can also select one with a particular word in its definition:
82
+ #
83
+ # lex[ :language, 'sounds' ]
84
+ # # => #<WordNet::Synset:0x7ffa78ee01b8 {106282651} 'linguistic communication,
85
+ # # language' (noun): [noun.communication] a systematic means of
86
+ # # communicating by the use of sounds or conventional symbols>
87
+ #
88
+ # If you're using a database that supports using regular expressions (e.g.,
89
+ # PostgreSQL), you can use that to select one with a matching definition:
90
+ #
91
+ # lex[ :language, %r:name.*discipline: ]
92
+ # # => #<WordNet::Synset:0x7ffa78f235a8 {106304059} 'language, nomenclature,
93
+ # # terminology' (noun): [noun.communication] a system of words used
94
+ # # to name things in a particular discipline>
95
+ #
96
+ # You can also select certain parts of speech:
97
+ #
98
+ # lex[ :right, :noun ]
99
+ # # => #<WordNet::Synset:0x7ffa78f30b68 {100351000} 'right' (noun):
100
+ # # [noun.act] a turn toward the side of the body that is on the south
101
+ # # when the person is facing east>
102
+ # lex[ :right, :verb ]
103
+ # # => #<WordNet::Synset:0x7ffa78f09590 {200199659} 'correct, right, rectify'
104
+ # # (verb): [verb.change] make right or correct>
105
+ # lex[ :right, :adjective ]
106
+ # # => #<WordNet::Synset:0x7ffa78ea8060 {300631391} 'correct, right'
107
+ # # (adjective): [adj.all] free from error; especially conforming to
108
+ # # fact or truth>
109
+ # lex[ :right, :adverb ]
110
+ # # => #<WordNet::Synset:0x7ffa78e5b2d8 {400032299} 'powerful, mightily,
111
+ # # mighty, right' (adverb): [adv.all] (Southern regional intensive)
112
+ # # very; to a great degree>
113
+ #
114
+ # or by lexical domain, which is a more-specific part of speech (see
115
+ # <tt>WordNet::Synset.lexdomains.keys</tt> for the list of valid ones):
116
+ #
117
+ # lex.lookup_synsets( :right, 'verb.social' )
118
+ # # => [#<WordNet::Synset:0x7ffa78d817e0 {202519991} 'redress, compensate,
119
+ # # correct, right' (verb): [verb.social] make reparations or amends
120
+ # # for>]
121
+ #
15
122
  class WordNet::Lexicon
16
123
  extend Loggability
17
124
  include WordNet::Constants
@@ -19,19 +126,9 @@ class WordNet::Lexicon
19
126
  # Loggability API -- log to the WordNet module's logger
20
127
  log_to :wordnet
21
128
 
22
- # class LogTracer
23
- # def method_missing( sym, msg, &block )
24
- # if msg =~ /does not exist/
25
- # $stderr.puts ">>> DOES NOT EXIST TRACE"
26
- # $stderr.puts( caller(1).grep(/wordnet/i) )
27
- # end
28
- # end
29
- # end
30
-
31
129
 
32
130
  # Add the logger device to the default options after it's been loaded
33
131
  WordNet::DEFAULT_DB_OPTIONS.merge!( :logger => [Loggability[WordNet]] )
34
- # WordNet::DEFAULT_DB_OPTIONS.merge!( :logger => [LogTracer.new] )
35
132
 
36
133
 
37
134
  ### Get the Sequel URI of the default database, if it's installed.
@@ -73,35 +170,53 @@ class WordNet::Lexicon
73
170
  ### Create a new WordNet::Lexicon object that will use the database connection specified by
74
171
  ### the given +dbconfig+.
75
172
  def initialize( *args )
76
- uri = if args.empty?
77
- WordNet::Lexicon.default_db_uri or
78
- raise WordNet::LexiconError,
79
- "No default WordNetSQL database! You can install it via the " +
80
- "wordnet-defaultdb gem, or download a version yourself from " +
81
- "http://sourceforge.net/projects/wnsql/"
82
-
83
- elsif args.first.is_a?( String )
84
- args.shift
85
- else
86
- nil
87
- end
173
+ if args.empty?
174
+ self.initialize_with_defaultdb( args.shift )
175
+ elsif args.first.is_a?( String )
176
+ self.initialize_with_uri( *args )
177
+ else
178
+ self.initialize_with_opthash( args.shift )
179
+ end
180
+
181
+ @db.sql_log_level = :debug
182
+ WordNet::Model.db = @db
183
+ end
184
+
185
+
186
+ ### Connect to the WordNet DB using an optional options hash.
187
+ def initialize_with_defaultdb( options )
188
+ uri = WordNet::Lexicon.default_db_uri or raise WordNet::LexiconError,
189
+ "No default WordNetSQL database! You can install it via the " +
190
+ "wordnet-defaultdb gem, or download a version yourself from " +
191
+ "http://sourceforge.net/projects/wnsql/"
192
+ @db = self.connect( uri, options )
193
+ end
88
194
 
89
- options = WordNet::DEFAULT_DB_OPTIONS.merge( args.shift || {} )
195
+
196
+ ### Connect to the WordNet DB using a URI and an optional options hash.
197
+ def initialize_with_uri( uri, options )
198
+ @db = self.connect( uri, options )
199
+ end
200
+
201
+
202
+ ### Connect to the WordNet DB using a connection options hash.
203
+ def initialize_with_opthash( options )
204
+ @db = self.connect( nil, options )
205
+ end
206
+
207
+
208
+ ### Connect to the WordNet DB and return a Sequel::Database object.
209
+ def connect( uri, options )
210
+ options = WordNet::DEFAULT_DB_OPTIONS.merge( options || {} )
90
211
 
91
212
  if uri
92
213
  self.log.debug "Connecting using uri + options style: uri = %s, options = %p" %
93
214
  [ uri, options ]
94
- @db = Sequel.connect( uri, options )
215
+ return Sequel.connect( uri, options )
95
216
  else
96
217
  self.log.debug "Connecting using hash style connect: options = %p" % [ options ]
97
- @db = Sequel.connect( options )
218
+ return Sequel.connect( options )
98
219
  end
99
-
100
- @uri = @db.uri
101
- self.log.debug " setting model db to: %s" % [ @uri ]
102
-
103
- @db.sql_log_level = :debug
104
- WordNet::Model.db = @db
105
220
  end
106
221
 
107
222
 
@@ -175,7 +290,7 @@ class WordNet::Lexicon
175
290
 
176
291
  when Range
177
292
  self.log.debug " limiting to range of senses: %p" % [ arg ]
178
- dataset = dataset.limit( arg.end - arg.begin, arg.begin - 1 )
293
+ dataset = dataset.limit( arg.entries.length, arg.begin - 1 )
179
294
 
180
295
  when Regexp
181
296
  self.log.debug " filter: definition =~ %p" % [ arg ]
@@ -213,7 +328,11 @@ class WordNet::Lexicon
213
328
  ### Return a human-readable string representation of the Lexicon, suitable for
214
329
  ### debugging.
215
330
  def inspect
216
- return "#<%p:%0#x %s>" % [ self.class, self.object_id * 2, self.db.url ]
331
+ return "#<%p:%0#x %s>" % [
332
+ self.class,
333
+ self.object_id * 2,
334
+ self.db.url || self.db.adapter_scheme
335
+ ]
217
336
  end
218
337
 
219
338
 
@@ -46,7 +46,7 @@ module WordNet
46
46
  end
47
47
 
48
48
  self.descendents.each do |subclass|
49
- self.log.info "Resetting database connection for: %p to: %p" % [ subclass, newdb ]
49
+ self.log.debug "Resetting database connection for: %p to: %p" % [ subclass, newdb ]
50
50
  subclass.db = newdb
51
51
  end
52
52
  end
@@ -7,12 +7,37 @@ require 'wordnet/model'
7
7
  class WordNet::Morph < WordNet::Model( :morphs )
8
8
  include WordNet::Constants
9
9
 
10
+ # Table "public.morphs"
11
+ # Column | Type | Modifiers
12
+ # ---------+-----------------------+--------------------
13
+ # morphid | integer | not null default 0
14
+ # morph | character varying(70) | not null
15
+ # Indexes:
16
+ # "pk_morphs" PRIMARY KEY, btree (morphid)
17
+ # "unq_morphs_morph" UNIQUE, btree (morph)
18
+ # Referenced by:
19
+ # TABLE "morphmaps" CONSTRAINT "fk_morphmaps_morphid" FOREIGN KEY (morphid) REFERENCES morphs(morphid)
20
+ #
21
+
10
22
  set_primary_key :morphid
11
23
 
12
- many_to_one :word,
24
+ # Table "public.morphmaps"
25
+ # Column | Type | Modifiers
26
+ # ---------+--------------+-------------------------------
27
+ # wordid | integer | not null default 0
28
+ # pos | character(1) | not null default NULL::bpchar
29
+ # morphid | integer | not null default 0
30
+ # Indexes:
31
+ # "pk_morphmaps" PRIMARY KEY, btree (morphid, pos, wordid)
32
+ # "k_morphmaps_morphid" btree (morphid)
33
+ # "k_morphmaps_wordid" btree (wordid)
34
+ # Foreign-key constraints:
35
+ # "fk_morphmaps_morphid" FOREIGN KEY (morphid) REFERENCES morphs(morphid)
36
+ # "fk_morphmaps_wordid" FOREIGN KEY (wordid) REFERENCES words(wordid)
37
+ many_to_many :words,
13
38
  :join_table => :morphmaps,
14
- :left_key => :wordid,
15
- :right_key => :morphid
39
+ :right_key => :wordid,
40
+ :left_key => :morphid
16
41
 
17
42
 
18
43
  ### Return the stringified word; alias for #lemma.
@@ -5,17 +5,72 @@ require 'wordnet/model'
5
5
  require 'wordnet/constants'
6
6
 
7
7
 
8
- # SUMO terms
8
+ # Experimental support for the WordNet mapping for the {Suggested Upper Merged
9
+ # Ontology}[http://www.ontologyportal.org/] (SUMO).
10
+ # This is still a work in progress, and isn't supported by all of the WordNet-SQL
11
+ # databases.
9
12
  class WordNet::SumoTerm < WordNet::Model( :sumoterms )
10
13
  include WordNet::Constants
11
14
 
15
+ # Table "public.sumoterms"
16
+ # Column | Type | Modifiers
17
+ # -----------------------+------------------------+--------------------
18
+ # sumoid | integer | not null default 0
19
+ # sumoterm | character varying(128) | not null
20
+ # ischildofattribute | boolean |
21
+ # ischildoffunction | boolean |
22
+ # ischildofpredicate | boolean |
23
+ # ischildofrelation | boolean |
24
+ # iscomparisonop | boolean |
25
+ # isfunction | boolean |
26
+ # isinstance | boolean |
27
+ # islogical | boolean |
28
+ # ismath | boolean |
29
+ # isquantifier | boolean |
30
+ # isrelationop | boolean |
31
+ # issubclass | boolean |
32
+ # issubclassofattribute | boolean |
33
+ # issubclassoffunction | boolean |
34
+ # issubclassofpredicate | boolean |
35
+ # issubclassofrelation | boolean |
36
+ # issubrelation | boolean |
37
+ # issuperclass | boolean |
38
+ # issuperrelation | boolean |
39
+ # Indexes:
40
+ # "pk_sumoterms" PRIMARY KEY, btree (sumoid)
41
+ # "unq_sumoterms_sumoterm" UNIQUE, btree (sumoterm)
42
+ # Referenced by:
43
+ # TABLE "sumomaps" CONSTRAINT "fk_sumomaps_sumoid" FOREIGN KEY (sumoid) REFERENCES sumoterms(sumoid)
44
+ # TABLE "sumoparsemaps" CONSTRAINT "fk_sumoparsemaps_sumoid" FOREIGN KEY (sumoid) REFERENCES sumoterms(sumoid)
12
45
  set_primary_key :sumoid
13
46
 
47
+
48
+ #
49
+ # Associations
50
+ #
51
+
14
52
  # SUMO Term -> [ SUMO Map ] -> [ Synset ]
53
+
54
+ # Table "public.sumomaps"
55
+ # Column | Type | Modifiers
56
+ # -----------+--------------+--------------------
57
+ # synsetid | integer | not null default 0
58
+ # sumoid | integer | not null default 0
59
+ # sumownrel | character(1) | not null
60
+ # Indexes:
61
+ # "pk_sumomaps" PRIMARY KEY, btree (synsetid)
62
+ # "k_sumomaps_sumoid" btree (sumoid)
63
+ # "k_sumomaps_sumownrel" btree (sumownrel)
64
+ # Foreign-key constraints:
65
+ # "fk_sumomaps_sumoid" FOREIGN KEY (sumoid) REFERENCES sumoterms(sumoid)
66
+ # "fk_sumomaps_synsetid" FOREIGN KEY (synsetid) REFERENCES synsets(synsetid)
67
+
68
+ ##
69
+ # WordNet::Synsets that are related to this term
15
70
  many_to_many :synsets,
16
71
  :join_table => :sumomaps,
17
- :left_key => :sumoid,
18
- :right_key => :synsetid
72
+ :left_key => :sumoid,
73
+ :right_key => :synsetid
19
74
 
20
75
  end # class WordNet::SumoTerm
21
76
 
@@ -11,31 +11,53 @@ require 'wordnet/model'
11
11
  # WordNet lexical database. A synonym set is a set of words that are
12
12
  # interchangeable in some context.
13
13
  #
14
- # ss = WordNet::Synset[ 106286395 ]
15
- # # => #<WordNet::Synset @values={:synsetid=>106286395, :pos=>"n",
16
- # :lexdomainid=>10,
17
- # :definition=>"a unit of language that native speakers can identify"}>
14
+ # We can either fetch the synset from a connected Lexicon:
18
15
  #
19
- # ss.words.map( &:lemma )
20
- # # => ["word"]
16
+ # lexicon = WordNet::Lexicon.new( 'postgres://localhost/wordnet30' )
17
+ # ss = lexicon[ :first, 'time' ]
18
+ # # => #<WordNet::Synset:0x7ffbf2643bb0 {115265518} 'commencement, first,
19
+ # # get-go, offset, outset, start, starting time, beginning, kickoff,
20
+ # # showtime' (noun): [noun.time] the time at which something is
21
+ # # supposed to begin>
21
22
  #
22
- # ss.hypernyms
23
- # # => [#<WordNet::Synset @values={:synsetid=>106284225, :pos=>"n",
24
- # :lexdomainid=>10,
25
- # :definition=>"one of the natural units into which [...]"}>]
23
+ # or if you've already created a Lexicon, use its connection indirectly to
24
+ # look up a Synset by its ID:
26
25
  #
27
- # ss.hyponyms
28
- # # => [#<WordNet::Synset @values={:synsetid=>106287620, :pos=>"n",
29
- # :lexdomainid=>10,
30
- # :definition=>"a word or phrase spelled by rearranging [...]"}>,
31
- # #<WordNet::Synset @values={:synsetid=>106287859, :pos=>"n",
32
- # :lexdomainid=>10,
33
- # :definition=>"a word (such as a pronoun) used to avoid [...]"}>,
34
- # #<WordNet::Synset @values={:synsetid=>106288024, :pos=>"n",
35
- # :lexdomainid=>10,
36
- # :definition=>"a word that expresses a meaning opposed [...]"}>,
37
- # ...
38
- # ]
26
+ # ss = WordNet::Synset[ 115265518 ]
27
+ # # => #<WordNet::Synset:0x7ffbf257e928 {115265518} 'commencement, first,
28
+ # # get-go, offset, outset, start, starting time, beginning, kickoff,
29
+ # # showtime' (noun): [noun.time] the time at which something is
30
+ # # supposed to begin>
31
+ #
32
+ # You can fetch a list of the lemmas (base forms) of the words included in the
33
+ # synset:
34
+ #
35
+ # ss.words.map( &:lemma )
36
+ # # => ["commencement", "first", "get-go", "offset", "outset", "start",
37
+ # # "starting time", "beginning", "kickoff", "showtime"]
38
+ #
39
+ # But the primary reason for a synset is its lexical and semantic links to
40
+ # other words and synsets. For instance, its *hypernym* is the equivalent
41
+ # of its superclass: it's the class of things of which the receiving
42
+ # synset is a member.
43
+ #
44
+ # ss.hypernyms
45
+ # # => [#<WordNet::Synset:0x7ffbf25c76c8 {115180528} 'point, point in
46
+ # # time' (noun): [noun.time] an instant of time>]
47
+ #
48
+ # The synset's *hypernyms*, on the other hand, are kind of like its
49
+ # subclasses:
50
+ #
51
+ # ss.hyponyms
52
+ # # => [#<WordNet::Synset:0x7ffbf25d83b0 {115142167} 'birth' (noun):
53
+ # # [noun.time] the time when something begins (especially life)>,
54
+ # # #<WordNet::Synset:0x7ffbf25d8298 {115268993} 'threshold' (noun):
55
+ # # [noun.time] the starting point for a new state or experience>,
56
+ # # #<WordNet::Synset:0x7ffbf25d8180 {115143012} 'incipiency,
57
+ # # incipience' (noun): [noun.time] beginning to exist or to be
58
+ # # apparent>,
59
+ # # #<WordNet::Synset:0x7ffbf25d8068 {115266164} 'starting point,
60
+ # # terminus a quo' (noun): [noun.time] earliest limiting point>]
39
61
  #
40
62
  class WordNet::Synset < WordNet::Model( :synsets )
41
63
  include WordNet::Constants
@@ -313,12 +335,12 @@ class WordNet::Synset < WordNet::Model( :synsets )
313
335
 
314
336
 
315
337
  ### Return any sample sentences.
316
- def samples
317
- return self.db[:samples].
338
+ def samples
339
+ return self.db[:samples].
318
340
  filter( synsetid: self.synsetid ).
319
341
  order( :sampleid ).
320
- map( :sample ).all
321
- end
342
+ map( :sample )
343
+ end
322
344
 
323
345
 
324
346
  #
@@ -58,6 +58,10 @@ class WordNet::Word < WordNet::Model( :words )
58
58
 
59
59
  set_primary_key :wordid
60
60
 
61
+ #
62
+ # Associations
63
+ #
64
+
61
65
  ##
62
66
  # The WordNet::Sense objects that relate the word with its Synsets
63
67
  one_to_many :senses,
@@ -79,6 +83,19 @@ class WordNet::Word < WordNet::Model( :words )
79
83
  :right_key => :morphid
80
84
 
81
85
 
86
+ #
87
+ # Dataset methods
88
+ #
89
+
90
+ ##
91
+ # Return a dataset for words matching the given +lemma+.
92
+ def_dataset_method( :by_lemma ) {|lemma| filter( lemma: lemma ) }
93
+
94
+
95
+ #
96
+ # Other methods
97
+ #
98
+
82
99
  ### Return the stringified word; alias for #lemma.
83
100
  def to_s
84
101
  return self.lemma
@@ -11,6 +11,18 @@ BEGIN {
11
11
  $LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
12
12
  }
13
13
 
14
+ # SimpleCov test coverage reporting; enable this using the :coverage rake task
15
+ if ENV['COVERAGE']
16
+ $stderr.puts "\n\n>>> Enabling coverage report.\n\n"
17
+ require 'simplecov'
18
+ SimpleCov.start do
19
+ add_filter 'spec'
20
+ add_group "Needing tests" do |file|
21
+ file.covered_percent < 90
22
+ end
23
+ end
24
+ end
25
+
14
26
  require 'rspec'
15
27
  require 'loggability/spechelpers'
16
28
  require 'wordnet'
@@ -33,6 +33,7 @@ describe WordNet::Lexicon do
33
33
  reset_logging()
34
34
  end
35
35
 
36
+
36
37
  context "the default_db_uri method" do
37
38
 
38
39
  it "uses the wordnet-defaultdb database gem (if available)" do
@@ -80,77 +81,126 @@ describe WordNet::Lexicon do
80
81
 
81
82
  context "with the default database", :requires_database => true do
82
83
 
83
- before( :all ) do
84
- @lexicon = WordNet::Lexicon.new
85
- end
84
+ let( :lexicon ) { WordNet::Lexicon.new }
86
85
 
87
86
  context "via its index operator" do
88
87
 
89
88
  it "can look up a Synset by ID" do
90
- rval = @lexicon[ 101219722 ]
89
+ rval = lexicon[ 101219722 ]
91
90
  rval.should be_a( WordNet::Synset )
92
91
  rval.words.map( &:to_s ).should include( 'carrot' )
93
92
  end
94
93
 
95
94
  it "can look up a Word by ID" do
96
- rval = @lexicon[ 21338 ]
95
+ rval = lexicon[ 21338 ]
97
96
  rval.should be_a( WordNet::Word )
98
97
  rval.lemma.should == 'carrot'
99
98
  end
100
99
 
101
100
  it "can look up the synset for a word and a sense" do
102
- ss = @lexicon[ :boot, 3 ]
101
+ ss = lexicon[ :boot, 3 ]
103
102
  ss.should be_a( WordNet::Synset )
104
103
  ss.definition.should == 'footwear that covers the whole foot and lower leg'
105
104
  end
106
105
 
106
+ it "can look up all synsets for a particular word" do
107
+ sss = lexicon.lookup_synsets( :tree )
108
+ sss.should have( 7 ).members
109
+ sss.all? {|ss| ss.should be_a(WordNet::Synset) }
110
+ end
111
+
112
+ it "can constrain fetched synsets to a certain range of results" do
113
+ sss = lexicon.lookup_synsets( :tree, 1..4 )
114
+ sss.should have( 4 ).members
115
+ end
116
+
117
+ it "can constrain fetched synsets to a certain (exclusive) range of results" do
118
+ sss = lexicon.lookup_synsets( :tree, 1...4 )
119
+ sss.should have( 3 ).members
120
+ end
121
+
107
122
  end
108
123
 
109
124
  end
110
125
 
111
126
  context "with a PostgreSQL database", :requires_pg do
112
127
 
113
- before( :all ) do
114
- @lexicon = WordNet::Lexicon.new( 'postgres://localhost/wordnet30' )
115
- end
128
+ let( :lexicon ) { WordNet::Lexicon.new(adapter: 'postgres', host: 'localhost', database: 'wordnet30') }
116
129
 
117
130
  context "via its index operator" do
118
131
 
119
132
  it "can look up a Synset by ID" do
120
- rval = @lexicon[ 101219722 ]
133
+ rval = lexicon[ 101219722 ]
121
134
  rval.should be_a( WordNet::Synset )
122
135
  rval.words.map( &:to_s ).should include( 'carrot' )
123
136
  end
124
137
 
125
138
  it "can look up a Word by ID" do
126
- rval = @lexicon[ 21338 ]
139
+ rval = lexicon[ 21338 ]
127
140
  rval.should be_a( WordNet::Word )
128
141
  rval.lemma.should == 'carrot'
129
142
  end
130
143
 
131
144
  it "can look up the synset for a word and a sense" do
132
- ss = @lexicon[ :boot, 3 ]
145
+ ss = lexicon[ :boot, 3 ]
133
146
  ss.should be_a( WordNet::Synset )
134
147
  ss.definition.should == 'footwear that covers the whole foot and lower leg'
135
148
  end
136
149
 
137
150
  it "can look up a synset for a word and a substring of its definition" do
138
- ss = @lexicon[ :boot, 'kick' ]
151
+ ss = lexicon[ :boot, 'kick' ]
139
152
  ss.should be_a( WordNet::Synset )
140
153
  ss.definition.should =~ /kick/i
141
154
  end
142
155
 
143
156
  it "can look up a synset for a word and a part of speech" do
144
- ss = @lexicon[ :boot, :verb ]
157
+ ss = lexicon[ :boot, :verb ]
145
158
  ss.should be_a( WordNet::Synset )
146
159
  ss.definition.should =~ /cause to load/i
147
160
  end
148
161
 
149
162
  it "can look up a synset for a word and an abbreviated part of speech" do
150
- ss = @lexicon[ :boot, :n ]
163
+ ss = lexicon[ :boot, :n ]
151
164
  ss.should be_a( WordNet::Synset )
152
165
  ss.definition.should =~ /act of delivering/i
153
166
  end
167
+
168
+ it "can constrain fetched synsets with a Regexp match against its definition" do
169
+ sss = lexicon.lookup_synsets( :tree, /plant/ )
170
+ sss.should have( 2 ).members
171
+ end
172
+
173
+ it "can constrain fetched synsets via lexical domain" do
174
+ sss = lexicon.lookup_synsets( :tree, 'noun.shape' )
175
+ sss.should have( 1 ).member
176
+ sss.first.should == WordNet::Synset[ 113912260 ]
177
+ end
178
+
179
+ it "can constrain fetched synsets via part of speech as a single-letter Symbol" do
180
+ sss = lexicon.lookup_synsets( :tree, :n )
181
+ sss.should have( 3 ).members
182
+ sss.should include(
183
+ WordNet::Synset[ 113912260 ],
184
+ WordNet::Synset[ 111348160 ],
185
+ WordNet::Synset[ 113104059 ]
186
+ )
187
+ end
188
+
189
+ it "can constrain fetched synsets via part of speech as a Symbol word" do
190
+ sss = lexicon.lookup_synsets( :tree, :verb )
191
+ sss.should have( 4 ).members
192
+ sss.should include(
193
+ WordNet::Synset[ 200319111 ],
194
+ WordNet::Synset[ 201145163 ],
195
+ WordNet::Synset[ 201616293 ],
196
+ WordNet::Synset[ 201934205 ]
197
+ )
198
+ end
199
+
200
+ it "includes the database adapter name in its inspect output" do
201
+ lexicon.inspect.should include( "postgres" )
202
+ end
203
+
154
204
  end
155
205
  end
156
206
 
@@ -3,7 +3,7 @@
3
3
  BEGIN {
4
4
  require 'pathname'
5
5
 
6
- basedir = Pathname.new( __FILE__ ).dirname.parent
6
+ basedir = Pathname.new( __FILE__ ).dirname.parent.parent
7
7
  libdir = basedir + 'lib'
8
8
 
9
9
  $LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
@@ -24,12 +24,6 @@ describe WordNet::SemanticLink, :requires_database => true do
24
24
 
25
25
  before( :all ) do
26
26
  setup_logging( :fatal )
27
- @lexicon = WordNet::Lexicon.new
28
- end
29
-
30
- before( :each ) do
31
- @word = @lexicon[ :parody ]
32
- @synset = @word.synsets.first
33
27
  end
34
28
 
35
29
  after( :all ) do
@@ -37,6 +31,26 @@ describe WordNet::SemanticLink, :requires_database => true do
37
31
  end
38
32
 
39
33
 
34
+ let( :lexicon ) { WordNet::Lexicon.new }
35
+ let( :word ) { lexicon[96814] } # 'parody'
36
+ let( :synset ) { word.synsets.first }
37
+ let( :semlink ) { synset.semlinks.first }
38
+
39
+
40
+ it "links two synsets together" do
41
+ semlink.origin.should be_a( WordNet::Synset )
42
+ semlink.target.should be_a( WordNet::Synset )
43
+ end
44
+
45
+ it "has a Symbolic type" do
46
+ semlink.type.should == :hypernym
47
+ end
48
+
49
+ it "has a human-readable type name" do
50
+ semlink.typename.should == 'hypernym'
51
+ end
52
+
53
+
40
54
  end
41
55
 
42
56
 
@@ -55,31 +55,29 @@ describe WordNet::Synset, :requires_database => true do
55
55
 
56
56
  context "for 'floor, level, storey, story (noun)' [103365991]" do
57
57
 
58
- before( :each ) do
59
- # floor, level, storey, story (noun): [noun.artifact] a structure
60
- # consisting of a room or set of rooms at a single position along a
61
- # vertical scale (hypernym: 1, hyponym: 5, part meronym: 1)
62
- @synset = WordNet::Synset[ 103365991 ]
63
- end
58
+ # floor, level, storey, story (noun): [noun.artifact] a structure
59
+ # consisting of a room or set of rooms at a single position along a
60
+ # vertical scale (hypernym: 1, hyponym: 5, part meronym: 1)
61
+ let( :synset ) { WordNet::Synset[103365991] }
64
62
 
65
63
 
66
64
  it "knows what lexical domain it's from" do
67
- @synset.lexical_domain.should == 'noun.artifact'
65
+ synset.lexical_domain.should == 'noun.artifact'
68
66
  end
69
67
 
70
68
  it "can make a Sequel dataset for any of its semantic link relationships" do
71
- ds = @synset.semanticlink_dataset( :member_meronyms )
69
+ ds = synset.semanticlink_dataset( :member_meronyms )
72
70
  ds.should be_a( Sequel::Dataset )
73
71
  ds.first_source_table.should == :synsets
74
72
  end
75
73
 
76
74
  it "can make an Enumerator for any of its semantic link relationships" do
77
- enum = @synset.semanticlink_enum( :member_meronyms )
75
+ enum = synset.semanticlink_enum( :member_meronyms )
78
76
  enum.should be_a( Enumerator )
79
77
  end
80
78
 
81
79
  it "can recursively traverse its semantic links" do
82
- res = @synset.traverse( :hypernyms ).to_a
80
+ res = synset.traverse( :hypernyms ).to_a
83
81
  res.should have( 6 ).members
84
82
  res.should == [
85
83
  WordNet::Synset[ 104341686 ],
@@ -92,7 +90,7 @@ describe WordNet::Synset, :requires_database => true do
92
90
  end
93
91
 
94
92
  it "can return an Enumerator for recursively traversing its semantic links" do
95
- enum = @synset.traverse( :hypernyms )
93
+ enum = synset.traverse( :hypernyms )
96
94
 
97
95
  enum.next.should == WordNet::Synset[ 104341686 ]
98
96
  enum.next.should == WordNet::Synset[ 100021939 ]
@@ -104,24 +102,45 @@ describe WordNet::Synset, :requires_database => true do
104
102
  enum.next
105
103
  }.to raise_error( StopIteration )
106
104
  end
105
+ end
107
106
 
108
107
 
109
- end
110
-
111
108
  context "for 'knight (noun)' [110238375]" do
112
109
 
113
- before( :each ) do
114
- @synset = @lexicon[ :knight, "noble" ]
115
- end
110
+ let( :synset ) { @lexicon[:knight, "noble"] }
116
111
 
117
112
  it "can find the hypernym that it and another synset share in common through the intersection operator" do
118
- res = @synset | @lexicon[ :squire ]
113
+ res = synset | @lexicon[ :squire ]
119
114
  res.should == @lexicon[:person]
120
115
  end
121
116
 
117
+ it "knows what part of speech it's for" do
118
+ synset.part_of_speech.should == 'noun'
119
+ end
120
+
121
+ it "stringifies as a readable definition" do
122
+ synset.to_s.should == "knight (noun): [noun.person] originally a person of noble birth trained to " +
123
+ "arms and chivalry; today in Great Britain a person honored by the sovereign for personal " +
124
+ "merit (hypernym: 1, hyponym: 6, instance hyponym: 1)"
125
+ end
126
+
122
127
  end
123
128
 
124
129
 
130
+ context "for 'congener (noun)' [100003993]" do
131
+
132
+ let( :synset ) { @lexicon[:congener] }
133
+
134
+ it "can look up its sample sentences" do
135
+ synset.samples.should have( 2 ).members
136
+ synset.samples.should include(
137
+ "lard was also used, though its congener, butter, was more frequently employed",
138
+ "the American shopkeeper differs from his European congener"
139
+ )
140
+ end
141
+
142
+ end
143
+
125
144
 
126
145
  end
127
146
 
@@ -25,12 +25,6 @@ describe WordNet::Word, :requires_database => true do
25
25
 
26
26
  before( :all ) do
27
27
  setup_logging( :fatal )
28
- @lexicon = WordNet::Lexicon.new
29
- end
30
-
31
- before( :each ) do
32
- # 'run'
33
- @word = @lexicon[ 113377 ]
34
28
  end
35
29
 
36
30
  after( :all ) do
@@ -38,19 +32,100 @@ describe WordNet::Word, :requires_database => true do
38
32
  end
39
33
 
40
34
 
41
- it "knows what senses it has" do
42
- senses = @word.senses
43
- senses.should be_an( Array )
44
- senses.should have( 57 ).members
45
- senses.first.should be_a( WordNet::Sense )
35
+ let( :lexicon ) { WordNet::Lexicon.new }
36
+
37
+
38
+ context "the Word for 'run'" do
39
+
40
+ let( :word ) { lexicon[113377] }
41
+
42
+ it "knows what senses it has" do
43
+ senses = word.senses
44
+ senses.should be_an( Array )
45
+ senses.should have( 57 ).members
46
+ senses.first.should be_a( WordNet::Sense )
47
+ end
48
+
49
+ it "knows what synsets it has" do
50
+ synsets = word.synsets
51
+
52
+ # Should have one synset per sense
53
+ synsets.should have( word.senses.length ).members
54
+ synsets.first.senses.should include( word.senses.first )
55
+ end
56
+
57
+ it "has a dataset for selecting noun synsets" do
58
+ word.nouns.should be_a( Sequel::Dataset )
59
+ word.nouns.should have( 16 ).members
60
+ ss = word.nouns.all
61
+ ss.should include(
62
+ lexicon[ :run, 'sequence' ],
63
+ lexicon[ :run, 'baseball' ],
64
+ lexicon[ :run, 'act of running' ],
65
+ lexicon[ :run, 'testing' ]
66
+ )
67
+ end
68
+
69
+ it "has a dataset for selecting verb synsets" do
70
+ word.verbs.should be_a( Sequel::Dataset )
71
+ word.verbs.should have( 41 ).members
72
+ ss = word.verbs.all
73
+ ss.should include(
74
+ lexicon[ :run, 'compete' ],
75
+ lexicon[ :run, 'be diffused' ],
76
+ lexicon[ :run, 'liquid' ],
77
+ lexicon[ :run, 'move fast' ]
78
+ )
79
+ end
80
+
81
+ end
82
+
83
+
84
+ context "the Word for 'light'" do
85
+
86
+ let( :word ) { lexicon[77458] }
87
+
88
+ it "has a dataset for selecting adjective synsets" do
89
+ word.adjectives.should be_a( Sequel::Dataset )
90
+ word.adjectives.should have( 8 ).members
91
+ ss = word.adjectives.all
92
+ ss.should include(
93
+ lexicon[ :light, 'weight' ],
94
+ lexicon[ :light, 'emit', :adjective ],
95
+ lexicon[ :light, 'color' ]
96
+ )
97
+ end
98
+
99
+ it "has a dataset for selecting adjective-satellite synsets" do
100
+ word.adjective_satellites.should be_a( Sequel::Dataset )
101
+ word.adjective_satellites.should have( 17 ).members
102
+ ss = word.adjective_satellites.all
103
+ ss.should include(
104
+ lexicon[ :light, 'soil' ],
105
+ lexicon[ :light, 'calories' ],
106
+ lexicon[ :light, 'entertainment' ]
107
+ )
108
+ end
109
+
46
110
  end
47
111
 
48
- it "knows what synsets it has" do
49
- senses = @word.senses
50
- synsets = @word.synsets
51
112
 
52
- synsets.should have( senses.length ).members
53
- synsets.first.senses.should include( senses.first )
113
+ context "the Word for 'lightly'" do
114
+
115
+ let( :word ) { lexicon[77549] }
116
+
117
+ it "has a dataset for selecting adverb synsets" do
118
+ word.adverbs.should be_a( Sequel::Dataset )
119
+ word.adverbs.should have( 7 ).members
120
+ ss = word.adverbs.all
121
+ ss.should include(
122
+ lexicon[ :lightly, 'indifference' ],
123
+ lexicon[ :lightly, 'indulging' ],
124
+ lexicon[ :lightly, 'little weight' ],
125
+ lexicon[ :lightly, 'quantity' ]
126
+ )
127
+ end
128
+
54
129
  end
55
130
 
56
131
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wordnet
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.136
4
+ version: 1.0.0.pre.139
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -36,7 +36,7 @@ cert_chain:
36
36
  YUhDS0xaZFNLai9SSHVUT3QrZ2JsUmV4OEZBaDhOZUEKY21saFhlNDZwWk5K
37
37
  Z1dLYnhaYWg4NWpJang5NWhSOHZPSStOQU01aUg5a09xSzEzRHJ4YWNUS1Bo
38
38
  cWo1UGp3RgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
39
- date: 2012-08-15 00:00:00.000000000 Z
39
+ date: 2012-09-05 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sequel
@@ -150,6 +150,22 @@ dependencies:
150
150
  - - ~>
151
151
  - !ruby/object:Gem::Version
152
152
  version: '2.7'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ~>
159
+ - !ruby/object:Gem::Version
160
+ version: '0.6'
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ~>
167
+ - !ruby/object:Gem::Version
168
+ version: '0.6'
153
169
  - !ruby/object:Gem::Dependency
154
170
  name: hoe
155
171
  requirement: !ruby/object:Gem::Requirement
@@ -166,28 +182,16 @@ dependencies:
166
182
  - - ~>
167
183
  - !ruby/object:Gem::Version
168
184
  version: '3.0'
169
- description: ! 'This library is a Ruby interface to WordNet®. WordNet® is an online
170
-
171
- lexical reference system whose design is inspired by current
172
-
173
- psycholinguistic theories of human lexical memory. English nouns, verbs,
174
-
175
- adjectives and adverbs are organized into synonym sets, each
176
-
177
- representing one underlying lexical concept. Different relations link
178
-
179
- the synonym sets.
180
-
181
-
182
- It uses WordNet-SQL, which is a conversion of the lexicon flatfiles into
183
-
184
- a relational database format. You can either install the ''wordnet-
185
-
186
- defaultdb'' gem, which packages up the SQLite3 version of WordNet-SQL, or
187
-
188
- install your own and point the lexicon at it by passing a Sequel URL to
189
-
190
- the constructor.'
185
+ description: ! "This library is a Ruby interface to WordNet®[http://wordnet.princeton.edu/].\nWordNet®
186
+ is an online lexical reference system whose design is inspired\nby current psycholinguistic
187
+ theories of human lexical memory. English\nnouns, verbs, adjectives and adverbs
188
+ are organized into synonym sets, each\nrepresenting one underlying lexical concept.
189
+ Different relations link\nthe synonym sets.\n\nThis library uses WordNet-SQL[http://wnsql.sourceforge.net/],
190
+ which is a\nconversion of the lexicon flatfiles into a relational database format.
191
+ You\ncan either install the 'wordnet-defaultdb' gem, which packages up the\nSQLite3
192
+ version of WordNet-SQL, or install your own and point the lexicon\nat it by passing
193
+ \n{Sequel connection parameters}[http://sequel.rubyforge.org/rdoc/files/doc/opening_databases_rdoc.html]\nto
194
+ the constructor."
191
195
  email:
192
196
  - ged@FaerieMUD.org
193
197
  executables: []
@@ -268,5 +272,5 @@ rubyforge_project: wordnet
268
272
  rubygems_version: 1.8.24
269
273
  signing_key:
270
274
  specification_version: 3
271
- summary: This library is a Ruby interface to WordNet®
275
+ summary: This library is a Ruby interface to WordNet®[http://wordnet.princeton.edu/]
272
276
  test_files: []
metadata.gz.sig CHANGED
Binary file