linguistics 1.0.9 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|