linguistics 1.0.9 → 2.0.0
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.tar.gz.sig +0 -0
- data/.gemtest +0 -0
- data/ChangeLog +849 -342
- data/History.rdoc +11 -0
- data/LICENSE +9 -9
- data/Manifest.txt +44 -0
- data/README.rdoc +226 -0
- data/Rakefile +32 -349
- data/examples/endocs.rb +272 -0
- data/examples/generalize_sentence.rb +2 -1
- data/examples/klingon.rb +22 -0
- data/lib/linguistics.rb +130 -292
- data/lib/linguistics/en.rb +337 -1628
- data/lib/linguistics/en/articles.rb +138 -0
- data/lib/linguistics/en/conjugation.rb +2245 -0
- data/lib/linguistics/en/conjunctions.rb +202 -0
- data/lib/linguistics/en/{infinitive.rb → infinitives.rb} +41 -55
- data/lib/linguistics/en/linkparser.rb +41 -49
- data/lib/linguistics/en/numbers.rb +483 -0
- data/lib/linguistics/en/participles.rb +33 -0
- data/lib/linguistics/en/pluralization.rb +810 -0
- data/lib/linguistics/en/stemmer.rb +75 -0
- data/lib/linguistics/en/titlecase.rb +121 -0
- data/lib/linguistics/en/wordnet.rb +63 -97
- data/lib/linguistics/inflector.rb +89 -0
- data/lib/linguistics/iso639.rb +534 -448
- data/lib/linguistics/languagebehavior.rb +36 -0
- data/lib/linguistics/monkeypatches.rb +42 -0
- data/spec/lib/constants.rb +15 -0
- data/spec/lib/helpers.rb +38 -0
- data/spec/linguistics/en/articles_spec.rb +797 -0
- data/spec/linguistics/en/conjugation_spec.rb +2083 -0
- data/spec/linguistics/en/conjunctions_spec.rb +154 -0
- data/spec/linguistics/en/infinitives_spec.rb +518 -0
- data/spec/linguistics/en/linkparser_spec.rb +66 -0
- data/spec/linguistics/en/numbers_spec.rb +1295 -0
- data/spec/linguistics/en/participles_spec.rb +55 -0
- data/spec/linguistics/en/pluralization_spec.rb +4636 -0
- data/spec/linguistics/en/stemmer_spec.rb +72 -0
- data/spec/linguistics/en/titlecase_spec.rb +841 -0
- data/spec/linguistics/en/wordnet_spec.rb +85 -0
- data/spec/linguistics/en_spec.rb +45 -167
- data/spec/linguistics/inflector_spec.rb +40 -0
- data/spec/linguistics/iso639_spec.rb +49 -53
- data/spec/linguistics/monkeypatches_spec.rb +40 -0
- data/spec/linguistics_spec.rb +46 -76
- metadata +241 -113
- metadata.gz.sig +0 -0
- data/README +0 -166
- data/README.english +0 -245
- data/rake/191_compat.rb +0 -26
- data/rake/dependencies.rb +0 -76
- data/rake/documentation.rb +0 -123
- data/rake/helpers.rb +0 -502
- data/rake/hg.rb +0 -318
- data/rake/manual.rb +0 -787
- data/rake/packaging.rb +0 -129
- data/rake/publishing.rb +0 -341
- data/rake/style.rb +0 -62
- data/rake/svn.rb +0 -668
- data/rake/testing.rb +0 -152
- data/rake/verifytask.rb +0 -64
- data/tests/en/infinitive.tests.rb +0 -207
- data/tests/en/inflect.tests.rb +0 -1389
- data/tests/en/lafcadio.tests.rb +0 -77
- data/tests/en/linkparser.tests.rb +0 -42
- data/tests/en/lprintf.tests.rb +0 -77
- data/tests/en/titlecase.tests.rb +0 -73
- data/tests/en/wordnet.tests.rb +0 -95
@@ -0,0 +1,202 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'linguistics/en' unless defined?( Linguistics::EN )
|
4
|
+
|
5
|
+
# Conjunction methods for the English-language Linguistics module.
|
6
|
+
module Linguistics::EN::Conjunctions
|
7
|
+
|
8
|
+
# Register this module to the list of modules to include
|
9
|
+
Linguistics::EN.register_extension( self )
|
10
|
+
|
11
|
+
# :stopdoc:
|
12
|
+
|
13
|
+
# Default configuration arguments for the #conjunction (junction, what's
|
14
|
+
# your) function.
|
15
|
+
CONJUNCTION_DEFAULTS = {
|
16
|
+
:separator => ', ',
|
17
|
+
:altsep => '; ',
|
18
|
+
:penultimate => true,
|
19
|
+
:conjunctive => 'and',
|
20
|
+
:combine => true,
|
21
|
+
:casefold => true,
|
22
|
+
:generalize => false,
|
23
|
+
:quantsort => true,
|
24
|
+
}
|
25
|
+
|
26
|
+
|
27
|
+
# :TODO: Needs refactoring
|
28
|
+
|
29
|
+
### Return the specified +obj+ (which must support the <tt>#collect</tt>
|
30
|
+
### method) as a conjunction. Each item is converted to a String if it is
|
31
|
+
### not already (using #to_s) unless a block is given, in which case it is
|
32
|
+
### called once for each object in the array, and the stringified return
|
33
|
+
### value from the block is used instead. Returning +nil+ causes that
|
34
|
+
### particular element to be omitted from the resulting conjunction. The
|
35
|
+
### following options can be used to control the makeup of the returned
|
36
|
+
### conjunction String:
|
37
|
+
###
|
38
|
+
### [<b>:separator</b>]
|
39
|
+
### Specify one or more characters to separate items in the resulting
|
40
|
+
### list. Defaults to <tt>', '</tt>.
|
41
|
+
### [<b>:altsep</b>]
|
42
|
+
### An alternate separator to use if any of the resulting conjunction's
|
43
|
+
### clauses contain the <tt>:separator</tt> character/s. Defaults to <tt>'; '</tt>.
|
44
|
+
### [<b>:penultimate</b>]
|
45
|
+
### Flag that indicates whether or not to join the last clause onto the
|
46
|
+
### rest of the conjunction using a penultimate <tt>:separator</tt>. E.g.,
|
47
|
+
### %w{duck, cow, dog}.en.conjunction
|
48
|
+
### # => "a duck, a cow, and a dog"
|
49
|
+
### %w{duck cow dog}.en.conjunction( :penultimate => false )
|
50
|
+
### "a duck, a cow and a dog"
|
51
|
+
### Default to <tt>true</tt>.
|
52
|
+
### [<b>:conjunctive</b>]
|
53
|
+
### Sets the word used as the conjunctive (separating word) of the
|
54
|
+
### resulting string. Default to <tt>'and'</tt>.
|
55
|
+
### [<b>:combine</b>]
|
56
|
+
### If set to <tt>true</tt> (the default), items which are indentical (after
|
57
|
+
### surrounding spaces are stripped) will be combined in the resulting
|
58
|
+
### conjunction. E.g.,
|
59
|
+
### %w{goose cow goose dog}.en.conjunction
|
60
|
+
### # => "two geese, a cow, and a dog"
|
61
|
+
### %w{goose cow goose dog}.en.conjunction( :combine => false )
|
62
|
+
### # => "a goose, a cow, a goose, and a dog"
|
63
|
+
### [<b>:casefold</b>]
|
64
|
+
### If set to <tt>true</tt> (the default), then items are compared
|
65
|
+
### case-insensitively when combining them. This has no effect if
|
66
|
+
### <tt>:combine</tt> is <tt>false</tt>.
|
67
|
+
### [<b>:generalize</b>]
|
68
|
+
### If set to <tt>true</tt>, then quantities of combined items are turned into
|
69
|
+
### general descriptions instead of exact amounts.
|
70
|
+
### ary = %w{goose pig dog horse goose reindeer goose dog horse}
|
71
|
+
### ary.en.conjunction
|
72
|
+
### # => "three geese, two dogs, two horses, a pig, and a reindeer"
|
73
|
+
### ary.en.conjunction( :generalize => true )
|
74
|
+
### # => "several geese, several dogs, several horses, a pig, and a reindeer"
|
75
|
+
### See the #quantify method for specifics on how quantities are
|
76
|
+
### generalized. Generalization defaults to <tt>false</tt>, and has no effect if
|
77
|
+
### :combine is <tt>false</tt>.
|
78
|
+
### [<b>:quantsort</b>]
|
79
|
+
### If set to <tt>true</tt> (the default), items which are combined in the
|
80
|
+
### resulting conjunction will be listed in order of amount, with greater
|
81
|
+
### quantities sorted first. If <tt>:quantsort</tt> is <tt>false</tt>, combined items
|
82
|
+
### will appear where the first instance of them occurred in the
|
83
|
+
### list. This sort is also the fallback for indentical quantities (ie.,
|
84
|
+
### items of the same quantity will be listed in the order they appeared
|
85
|
+
### in the source list).
|
86
|
+
###
|
87
|
+
def conjunction( args={} )
|
88
|
+
config = CONJUNCTION_DEFAULTS.merge( args )
|
89
|
+
|
90
|
+
# Transform items in the obj to phrases
|
91
|
+
phrases = if block_given?
|
92
|
+
self.log.debug " collecting with a block"
|
93
|
+
self.collect {|item| yield(item) }.compact
|
94
|
+
else
|
95
|
+
self.log.debug " collecting without a block"
|
96
|
+
rval = self.collect( &:to_s )
|
97
|
+
self.log.debug " collected: %p" % [ rval ]
|
98
|
+
rval
|
99
|
+
end
|
100
|
+
|
101
|
+
self.log.debug " phrases is: %p" % [ phrases ]
|
102
|
+
|
103
|
+
# No need for a conjunction if there's only one thing
|
104
|
+
return phrases[0].en.a if phrases.length < 2
|
105
|
+
|
106
|
+
# Set up a Proc to derive a collector key from a phrase depending on the
|
107
|
+
# configuration
|
108
|
+
keyfunc =
|
109
|
+
if config[:casefold]
|
110
|
+
proc {|key| key.downcase.strip}
|
111
|
+
else
|
112
|
+
proc {|key| key.strip}
|
113
|
+
end
|
114
|
+
|
115
|
+
# Count and delete phrases that hash the same when the keyfunc munges
|
116
|
+
# them into the same thing if we're combining (:combine => true).
|
117
|
+
collector = {}
|
118
|
+
if config[:combine]
|
119
|
+
|
120
|
+
phrases.each_index do |i|
|
121
|
+
# Stop when reaching the end of a truncated list
|
122
|
+
break if phrases[i].nil?
|
123
|
+
|
124
|
+
# Make the key using the configured key function
|
125
|
+
phrase = keyfunc[ phrases[i] ]
|
126
|
+
|
127
|
+
# If the collector already has this key, increment its count,
|
128
|
+
# eliminate the duplicate from the phrase list, and redo the loop.
|
129
|
+
if collector.key?( phrase )
|
130
|
+
collector[ phrase ] += 1
|
131
|
+
phrases.delete_at( i )
|
132
|
+
redo
|
133
|
+
end
|
134
|
+
|
135
|
+
collector[ phrase ] = 1
|
136
|
+
end
|
137
|
+
else
|
138
|
+
# If we're not combining, just make everything have a count of 1.
|
139
|
+
phrases.uniq.each {|key| collector[ keyfunc[key] ] = 1}
|
140
|
+
end
|
141
|
+
|
142
|
+
# If sort-by-quantity is turned on, sort the phrases first by how many
|
143
|
+
# there are (most-first), and then by the order they were specified in.
|
144
|
+
if config[:quantsort] && config[:combine]
|
145
|
+
origorder = {}
|
146
|
+
phrases.each_with_index {|phrase,i| origorder[ keyfunc[phrase] ] ||= i }
|
147
|
+
phrases.sort! {|a,b|
|
148
|
+
(collector[ keyfunc[b] ] <=> collector[ keyfunc[a] ]).nonzero? ||
|
149
|
+
(origorder[ keyfunc[a] ] <=> origorder[ keyfunc[b] ])
|
150
|
+
}
|
151
|
+
end
|
152
|
+
|
153
|
+
# Set up a filtering function that adds either an indefinite article, an
|
154
|
+
# indefinite quantifier, or a definite quantifier to each phrase
|
155
|
+
# depending on the configuration and the count of phrases in the
|
156
|
+
# collector.
|
157
|
+
filter =
|
158
|
+
if config[:generalize]
|
159
|
+
proc {|phrase, count| phrase.en.quantify(count) }
|
160
|
+
else
|
161
|
+
proc do |phrase, count|
|
162
|
+
if count > 1
|
163
|
+
"%s %s" % [
|
164
|
+
# :TODO: Make this threshold settable
|
165
|
+
count < 10 ? count.en.numwords : count.to_s,
|
166
|
+
phrase.en.plural( count )
|
167
|
+
]
|
168
|
+
else
|
169
|
+
phrase.en.a
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
# Now use the configured filter to turn each phrase into its final
|
175
|
+
# form. Hmmm... square-bracket Lisp?
|
176
|
+
phrases.collect! {|phrase| filter[phrase, collector[ keyfunc[phrase] ]] }
|
177
|
+
|
178
|
+
# Prepend the conjunctive to the last element unless it's empty or
|
179
|
+
# there's only one element
|
180
|
+
phrases[-1].insert( 0, config[:conjunctive] + " " ) unless
|
181
|
+
config[:conjunctive].strip.empty? or
|
182
|
+
phrases.length < 2
|
183
|
+
|
184
|
+
# Concatenate the last two elements if there's no penultimate separator,
|
185
|
+
# and pick a separator based on how many phrases there are and whether
|
186
|
+
# or not there's already an instance of it in the phrases.
|
187
|
+
phrase_count = phrases.length
|
188
|
+
phrases[-2] << " " << phrases.pop unless config[:penultimate]
|
189
|
+
sep = config[:separator]
|
190
|
+
if phrase_count <= 2
|
191
|
+
sep = ' '
|
192
|
+
elsif phrases.find {|str| str.include?(config[:separator]) }
|
193
|
+
sep = config[:altsep]
|
194
|
+
end
|
195
|
+
|
196
|
+
return phrases.join( sep )
|
197
|
+
end
|
198
|
+
Linguistics::EN.register_lprintf_formatter :CONJUNCT, :conjunction
|
199
|
+
|
200
|
+
|
201
|
+
end # module Linguistics::EN::Conjunctions
|
202
|
+
|
@@ -1,38 +1,18 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
#
|
6
|
-
#
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
|
11
|
-
# == Acknowledgments
|
12
|
-
#
|
13
|
-
# This code was ported from the excellent 'Lingua::EN::Infinitive' Perl module
|
14
|
-
# by Ron Savage, which is distributed under the following license:
|
15
|
-
#
|
16
|
-
# Australian copyright (c) 1999-2002 Ron Savage.
|
17
|
-
#
|
18
|
-
# All Programs of mine are 'OSI Certified Open Source Software';
|
19
|
-
# you can redistribute them and/or modify them under the terms of
|
20
|
-
# The Artistic License, a copy of which is available at:
|
21
|
-
# http://www.opensource.org/licenses/index.html
|
22
|
-
#
|
23
|
-
#
|
24
|
-
# :include: LICENSE
|
25
|
-
#
|
26
|
-
#--
|
27
|
-
#
|
28
|
-
# Please see the file LICENSE in the base directory for licensing details.
|
29
|
-
#
|
30
|
-
module Linguistics::EN
|
2
|
+
|
3
|
+
require 'linguistics/en' unless defined?( Linguistics::EN )
|
4
|
+
|
5
|
+
# Methods for deriving the infinitive forms of conjugated words for
|
6
|
+
# the English-language Linguistics module.
|
7
|
+
module Linguistics::EN::Infinitives
|
8
|
+
|
9
|
+
# Register this module to the list of modules to include
|
10
|
+
Linguistics::EN.register_extension( self )
|
31
11
|
|
32
12
|
# :stopdoc:
|
33
13
|
|
34
14
|
# Irregular words => infinitive forms
|
35
|
-
|
15
|
+
IRREGULAR_INFINITIVES = {
|
36
16
|
'abided' => 'abide',
|
37
17
|
'abode' => 'abide',
|
38
18
|
'am' => 'be',
|
@@ -543,7 +523,7 @@ module Linguistics::EN
|
|
543
523
|
}
|
544
524
|
|
545
525
|
# Mapping of word suffixes to infinitive rules.
|
546
|
-
|
526
|
+
INF_SUFFIX_RULES = {
|
547
527
|
# '<suffix>' => {
|
548
528
|
# :order => <sort order>,
|
549
529
|
# :rule => <rule number>,
|
@@ -1008,7 +988,7 @@ module Linguistics::EN
|
|
1008
988
|
:suffix2 => '',
|
1009
989
|
},
|
1010
990
|
}
|
1011
|
-
|
991
|
+
INF_SUFFIX_RULE_ORDER = INF_SUFFIX_RULES.keys.sort_by {|rule| INF_SUFFIX_RULES[rule][:order]}
|
1012
992
|
|
1013
993
|
# :startdoc:
|
1014
994
|
|
@@ -1037,20 +1017,26 @@ module Linguistics::EN
|
|
1037
1017
|
|
1038
1018
|
# The rule used
|
1039
1019
|
attr_reader :rule
|
1020
|
+
|
1021
|
+
### Equality operator: returns +true+ if +other+ is == to either of the receiver's words.
|
1022
|
+
def ==( other )
|
1023
|
+
return super(other) || @word2 == other
|
1024
|
+
end
|
1025
|
+
|
1040
1026
|
end
|
1041
1027
|
|
1042
1028
|
|
1043
|
-
|
1044
|
-
|
1045
|
-
|
1029
|
+
######
|
1030
|
+
public
|
1031
|
+
######
|
1046
1032
|
|
1047
1033
|
### Return the infinitive form of the given word
|
1048
|
-
def infinitive
|
1049
|
-
word =
|
1034
|
+
def infinitive
|
1035
|
+
word = self.to_s
|
1050
1036
|
word1 = word2 = suffix = rule = newword = ''
|
1051
1037
|
|
1052
|
-
if
|
1053
|
-
word1 =
|
1038
|
+
if IRREGULAR_INFINITIVES.key?( word )
|
1039
|
+
word1 = IRREGULAR_INFINITIVES[ word ]
|
1054
1040
|
rule = 'irregular'
|
1055
1041
|
else
|
1056
1042
|
# Build up $prefix{$suffix} as an array of prefixes, from longest to shortest.
|
@@ -1068,49 +1054,49 @@ module Linguistics::EN
|
|
1068
1054
|
}
|
1069
1055
|
}
|
1070
1056
|
|
1071
|
-
|
1057
|
+
self.log.debug "prefixes: %p" % [ prefixes ]
|
1072
1058
|
|
1073
1059
|
# Now check for rules covering the prefixes for this word, picking
|
1074
1060
|
# the first one if one was found.
|
1075
|
-
if (( suffix = ((
|
1076
|
-
rule =
|
1077
|
-
shortestPrefix =
|
1078
|
-
|
1061
|
+
if (( suffix = ((INF_SUFFIX_RULE_ORDER & prefixes.keys).first) ))
|
1062
|
+
rule = INF_SUFFIX_RULES[ suffix ][:rule]
|
1063
|
+
shortestPrefix = INF_SUFFIX_RULES[ suffix ][:word1]
|
1064
|
+
self.log.debug "Using rule %p (%p) for suffix %p" %
|
1079
1065
|
[ rule, shortestPrefix, suffix ] if $DEBUG
|
1080
1066
|
|
1081
1067
|
case shortestPrefix
|
1082
1068
|
when 0
|
1083
1069
|
word1 = prefixes[ suffix ][ 0 ]
|
1084
1070
|
word2 = prefixes[ suffix ][ 1 ]
|
1085
|
-
|
1071
|
+
self.log.debug "For sp = 0: word1: %p, word2: %p" %
|
1086
1072
|
[ word1, word2 ] if $DEBUG
|
1087
1073
|
|
1088
1074
|
when -1
|
1089
1075
|
word1 = prefixes[ suffix ].last +
|
1090
|
-
|
1076
|
+
INF_SUFFIX_RULES[ suffix ][:suffix1]
|
1091
1077
|
word2 = ''
|
1092
|
-
|
1078
|
+
self.log.debug "For sp = -1: word1: %p, word2: %p" %
|
1093
1079
|
[ word1, word2 ] if $DEBUG
|
1094
1080
|
|
1095
1081
|
when -2
|
1096
1082
|
word1 = prefixes[ suffix ].last +
|
1097
|
-
|
1083
|
+
INF_SUFFIX_RULES[ suffix ][:suffix1]
|
1098
1084
|
word2 = prefixes[ suffix ].last
|
1099
|
-
|
1085
|
+
self.log.debug "For sp = -2: word1: %p, word2: %p" %
|
1100
1086
|
[ word1, word2 ] if $DEBUG
|
1101
1087
|
|
1102
1088
|
when -3
|
1103
1089
|
word1 = prefixes[ suffix ].last +
|
1104
|
-
|
1090
|
+
INF_SUFFIX_RULES[ suffix ][:suffix1]
|
1105
1091
|
word2 = prefixes[ suffix ].last +
|
1106
|
-
|
1107
|
-
|
1092
|
+
INF_SUFFIX_RULES[ suffix ][:suffix2]
|
1093
|
+
self.log.debug "For sp = -3: word1: %p, word2: %p" %
|
1108
1094
|
[ word1, word2 ] if $DEBUG
|
1109
1095
|
|
1110
1096
|
when -4
|
1111
1097
|
word1 = word
|
1112
1098
|
word2 = ''
|
1113
|
-
|
1099
|
+
self.log.debug "For sp = -4: word1: %p, word2: %p" %
|
1114
1100
|
[ word1, word2 ] if $DEBUG
|
1115
1101
|
|
1116
1102
|
else
|
@@ -1128,7 +1114,7 @@ module Linguistics::EN
|
|
1128
1114
|
# Eg: tipped => tipp?
|
1129
1115
|
# Then return tip and tipp.
|
1130
1116
|
# Eg: swimming => swimm?
|
1131
|
-
# Then return
|
1117
|
+
# Then return swim and swimm.
|
1132
1118
|
|
1133
1119
|
if /^([^aeiou]*[aeiou]+)([^wx])\2$/ =~ word2
|
1134
1120
|
word1 = $1 + $2
|
@@ -1138,7 +1124,7 @@ module Linguistics::EN
|
|
1138
1124
|
end
|
1139
1125
|
end
|
1140
1126
|
|
1141
|
-
return Infinitive
|
1127
|
+
return Infinitive.new( word1, word2, suffix, rule )
|
1142
1128
|
end
|
1143
1129
|
|
1144
1130
|
end # module EN::Linguistics
|
@@ -1,20 +1,16 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
|
-
require 'linguistics/en'
|
3
|
+
require 'linguistics/en' unless defined?( Linguistics::EN )
|
4
4
|
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# support for the Ruby LinkParser module. LinkParser enables grammatic queries
|
8
|
-
# of English language sentences.
|
9
|
-
#
|
10
|
-
# == Synopsis
|
5
|
+
# LinkParser support for the English-language Linguistics module.
|
6
|
+
# LinkParser enables grammatic queries of English language sentences.
|
11
7
|
#
|
12
8
|
# # Test to see whether or not the link parser is loaded.
|
13
9
|
# Linguistics::EN.has_link_parser?
|
14
10
|
# # => true
|
15
11
|
#
|
16
12
|
# # Diagram the first linkage for a test sentence
|
17
|
-
# puts "he is a big dog".sentence.linkages.first.to_s
|
13
|
+
# puts "he is a big dog".en.sentence.linkages.first.to_s
|
18
14
|
# +---O*---+
|
19
15
|
# | +--Ds--+
|
20
16
|
# +Ss+ | +-A-+
|
@@ -41,54 +37,51 @@ require 'linguistics/en'
|
|
41
37
|
# has been domesticated by man since prehistoric times; occurs in many breeds;
|
42
38
|
# \"the dog barked all night\""
|
43
39
|
#
|
44
|
-
|
45
|
-
#
|
46
|
-
# * Martin Chase <stillflame@FaerieMUD.org>
|
47
|
-
# * Michael Granger <ged@FaerieMUD.org>
|
48
|
-
#
|
49
|
-
# :include: LICENSE
|
50
|
-
#
|
51
|
-
#--
|
52
|
-
#
|
53
|
-
# Please see the file LICENSE in the base directory for licensing details.
|
54
|
-
#
|
55
|
-
module Linguistics::EN
|
40
|
+
module Linguistics::EN::LinkParser
|
56
41
|
|
57
|
-
@
|
58
|
-
@lp_dict
|
59
|
-
@lp_error
|
42
|
+
@has_linkparser = false
|
43
|
+
@lp_dict = nil
|
44
|
+
@lp_error = nil
|
60
45
|
|
61
46
|
begin
|
62
47
|
require "linkparser"
|
63
|
-
@
|
48
|
+
@has_linkparser = true
|
64
49
|
rescue LoadError => err
|
65
50
|
@lp_error = err
|
66
51
|
end
|
67
52
|
|
68
53
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
54
|
+
# Container for methods intended to extend the EN module as singleton methods.
|
55
|
+
module SingletonMethods
|
56
|
+
|
57
|
+
### Returns +true+ if WordNet was loaded okay
|
58
|
+
def has_linkparser? ; @has_linkparser; end
|
59
|
+
|
60
|
+
### If #has_linkparser? returns +false+, this can be called to fetch the
|
61
|
+
### exception which was raised when WordNet was loaded.
|
62
|
+
def linkparser_error ; @lp_error; end
|
63
|
+
|
64
|
+
end # module SingletonMethods
|
65
|
+
extend SingletonMethods
|
73
66
|
|
74
|
-
### Returns +true+ if LinkParser was loaded okay
|
75
|
-
def has_link_parser? ; @has_link_parser ; end
|
76
67
|
|
77
|
-
|
78
|
-
|
79
|
-
def lp_error ; @lp_error ; end
|
68
|
+
# Register this module to the list of modules to include
|
69
|
+
Linguistics::EN.register_extension( self )
|
80
70
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
if @lp_error
|
85
|
-
raise NotImplementedError,
|
86
|
-
"LinkParser functions are not loaded: %s" %
|
87
|
-
@lp_error.message
|
88
|
-
end
|
71
|
+
#################################################################
|
72
|
+
### M O D U L E M E T H O D S
|
73
|
+
#################################################################
|
89
74
|
|
90
|
-
|
75
|
+
### The instance of LinkParser used for all Linguistics LinkParser
|
76
|
+
### functions.
|
77
|
+
def self::lp_dict
|
78
|
+
if !self.has_linkparser?
|
79
|
+
raise NotImplementedError,
|
80
|
+
"LinkParser functions are not loaded: %s" %
|
81
|
+
self.lp_error.message
|
91
82
|
end
|
83
|
+
|
84
|
+
return @lp_dict ||= LinkParser::Dictionary.new( :verbosity => 0 )
|
92
85
|
end
|
93
86
|
|
94
87
|
|
@@ -96,14 +89,13 @@ module Linguistics::EN
|
|
96
89
|
### L I N K P A R S E R I N T E R F A C E
|
97
90
|
#################################################################
|
98
91
|
|
99
|
-
|
100
|
-
|
101
|
-
|
92
|
+
######
|
93
|
+
public
|
94
|
+
######
|
102
95
|
|
103
96
|
### Return a LinkParser::Sentence for the stringified +obj+.
|
104
|
-
def sentence
|
105
|
-
return Linguistics::EN::lp_dict.parse(
|
97
|
+
def sentence
|
98
|
+
return Linguistics::EN::LinkParser.lp_dict.parse( self.to_s )
|
106
99
|
end
|
107
|
-
module_function :sentence
|
108
100
|
|
109
|
-
end
|
101
|
+
end # class Linguistics::EN::LinkParser
|