wordmonger 0.0.1 → 0.1.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.
- checksums.yaml +4 -4
- data/lib/wordmonger/dictionary.rb +19 -7
- data/lib/wordmonger/phrase.rb +85 -25
- data/lib/wordmonger/version.rb +1 -1
- data/lib/wordmonger/word.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72f788d560b20874e0d2df7b548b38de5693403ee5f2e09836877911c8d44b72
|
4
|
+
data.tar.gz: 7eb1067080d7204d0d627372a407d111796fc5081d42f76eb94a78c2016be8d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea34105defe4bb18c03a87ebda77901517e56f14ea59783dc582d503dad8f09f2f522f83a5e1526b86d7571b7aee6bd5cb089bfdd562a7f4efafb28d8924c94d
|
7
|
+
data.tar.gz: 5ca5f38a082dd243d023b19fde49fd97312784e90c92dc39e1770c33876061dd42d8e8897b6c7e8399d65ef354b91eadc60fe59b75d4cf4dbdc444e276fed396
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module WordMonger
|
2
2
|
class Dictionary
|
3
3
|
attr_reader :name, :phrases, :words
|
4
|
-
attr_accessor :
|
5
|
-
def initialize(name,
|
4
|
+
attr_accessor :preferred_synonyms, :normalized_wordings
|
5
|
+
def initialize(name, preferred_synonyms: {}, normalized_wordings: {}, scanner: nil)
|
6
6
|
@name = name
|
7
7
|
self.scanner = scanner
|
8
8
|
@phrases = {}
|
9
9
|
@words = {}
|
10
|
-
@
|
10
|
+
@preferred_synonyms = preferred_synonyms
|
11
|
+
@normalized_wordings = normalized_wordings
|
11
12
|
WordMonger.add_dictionary(self)
|
12
13
|
end
|
13
14
|
|
@@ -40,12 +41,23 @@ module WordMonger
|
|
40
41
|
@phrases.values.map { |value| value.serialize }
|
41
42
|
end
|
42
43
|
|
43
|
-
def
|
44
|
-
@
|
44
|
+
def add_preferred_synonym(synonym, preferred_synonym)
|
45
|
+
@preferred_synonyms[synonym] = preferred_synonym
|
45
46
|
end
|
46
47
|
|
47
|
-
def
|
48
|
-
@
|
48
|
+
def delete_preferred_synonym(synonym)
|
49
|
+
@preferred_synonyms.delete(synonym)
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_normalized_wording(wording, normalized_wording)
|
53
|
+
synonymized_wording = Phrase.new(wording.downcase, remember: false).synonymize
|
54
|
+
synonymized_normalized_wording = Phrase.new(normalized_wording.downcase, remember: false).synonymize
|
55
|
+
@normalized_wordings[synonymized_wording] = synonymized_normalized_wording
|
56
|
+
end
|
57
|
+
|
58
|
+
def delete_normalized_wording(wording)
|
59
|
+
synonymized_wording = Phrase.new(wording.downcase, remember: false).synonymize
|
60
|
+
@normalized_wordings.delete(synonymized_wording)
|
49
61
|
end
|
50
62
|
|
51
63
|
def add_word(word)
|
data/lib/wordmonger/phrase.rb
CHANGED
@@ -2,10 +2,10 @@ module WordMonger
|
|
2
2
|
class Phrase
|
3
3
|
|
4
4
|
attr_reader :text, :dictionary
|
5
|
-
def initialize(text, dictionary: nil)
|
5
|
+
def initialize(text, dictionary: nil, remember: true)
|
6
6
|
self.text = text
|
7
7
|
@dictionary = dictionary || WordMonger.active_dictionary
|
8
|
-
@dictionary.add(self)
|
8
|
+
@dictionary.add(self) if remember
|
9
9
|
end
|
10
10
|
|
11
11
|
def to_s
|
@@ -23,52 +23,112 @@ module WordMonger
|
|
23
23
|
def text=(text)
|
24
24
|
@text = text
|
25
25
|
@words = nil
|
26
|
-
@
|
26
|
+
@synonymized = nil
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
def get_words_for_text(text)
|
30
|
+
return [] unless text
|
31
|
+
self.scanner.scan(text)
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_words
|
35
|
+
get_words_for_text(@text)
|
33
36
|
end
|
34
37
|
|
35
38
|
def words
|
36
|
-
@words ||= get_words
|
39
|
+
@words ||= self.get_words
|
40
|
+
end
|
41
|
+
|
42
|
+
private def is_downcase?(word)
|
43
|
+
word.downcase == word
|
44
|
+
end
|
45
|
+
|
46
|
+
private def is_upcase?(word)
|
47
|
+
word.upcase == word
|
48
|
+
end
|
49
|
+
|
50
|
+
private def is_capitalized?(word)
|
51
|
+
word.capitalize == word
|
37
52
|
end
|
38
53
|
|
39
54
|
private def case_preserving_sub(text, from, to)
|
40
55
|
match_regexp = Regexp.new(Regexp.escape(from), Regexp::IGNORECASE)
|
41
56
|
from_text = text[match_regexp]
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
to_text =
|
57
|
+
if is_upcase?(from_text)
|
58
|
+
to_text = to.upcase
|
59
|
+
elsif is_capitalized?(from_text)
|
60
|
+
to_text = to.capitalize
|
61
|
+
else # Not sure what it is -- downcase it
|
62
|
+
to_text = to.downcase
|
46
63
|
end
|
47
|
-
text.sub(from_text, to_text)
|
64
|
+
res = text.sub(from_text, to_text)
|
65
|
+
res
|
48
66
|
end
|
49
67
|
|
50
|
-
|
51
|
-
|
52
|
-
|
68
|
+
# Synonymize replaces all synonyms with their preferred synonym
|
69
|
+
def synonymize_text(text)
|
70
|
+
synonymized_text = text
|
71
|
+
get_words_for_text(text).each do |word|
|
53
72
|
lowercase_word = word.text.downcase
|
54
|
-
substitute = dictionary.
|
73
|
+
substitute = dictionary.preferred_synonyms[lowercase_word]
|
55
74
|
if substitute
|
56
|
-
|
75
|
+
synonymized_text = case_preserving_sub(synonymized_text, word.text, substitute)
|
57
76
|
end
|
58
77
|
end
|
59
|
-
|
78
|
+
synonymized_text
|
79
|
+
end
|
80
|
+
|
81
|
+
def synonymize
|
82
|
+
synonymize_text(self.text)
|
83
|
+
end
|
84
|
+
|
85
|
+
def synonymized
|
86
|
+
@synonymized ||= self.class.new(synonymize)
|
87
|
+
end
|
88
|
+
|
89
|
+
def synonymized_name
|
90
|
+
synonymized.phrase
|
91
|
+
end
|
92
|
+
|
93
|
+
def synonymized_words
|
94
|
+
self.synonymized.words
|
95
|
+
end
|
96
|
+
|
97
|
+
# Normalize replaces the phrase with the normalized wording of its synonymized text
|
98
|
+
def normalize_text(text)
|
99
|
+
synonymized_phrase = synonymize_text(text)
|
100
|
+
words = get_words_for_text(synonymized_phrase)
|
101
|
+
text_case = if words.all? { |word| is_upcase?(word.text) }
|
102
|
+
:upcase
|
103
|
+
elsif words.all? { |word| is_capitalized?(word.text) }
|
104
|
+
:capitalize
|
105
|
+
else
|
106
|
+
:downcase
|
107
|
+
end
|
108
|
+
search_phrase = synonymized_phrase.downcase
|
109
|
+
substitute_phrase = dictionary.normalized_wordings[search_phrase]
|
110
|
+
synonymized_phrase = substitute_phrase if substitute_phrase
|
111
|
+
normalized_phrase = synonymized_phrase
|
112
|
+
get_words_for_text(normalized_phrase).each do |word|
|
113
|
+
normalized_phrase.sub!(word.text, word.text.send(text_case))
|
114
|
+
end
|
115
|
+
normalized_phrase
|
116
|
+
end
|
117
|
+
|
118
|
+
def normalize
|
119
|
+
normalize_text(self.text)
|
60
120
|
end
|
61
121
|
|
62
|
-
def
|
63
|
-
@
|
122
|
+
def normalized
|
123
|
+
@normalized ||= self.class.new(normalize)
|
64
124
|
end
|
65
125
|
|
66
|
-
def
|
67
|
-
|
126
|
+
def normalized_name
|
127
|
+
normalized.phrase
|
68
128
|
end
|
69
129
|
|
70
|
-
def
|
71
|
-
self.
|
130
|
+
def normalized_words
|
131
|
+
self.normalized.words
|
72
132
|
end
|
73
133
|
end
|
74
134
|
end
|
data/lib/wordmonger/version.rb
CHANGED
data/lib/wordmonger/word.rb
CHANGED
@@ -47,7 +47,7 @@ module WordMonger
|
|
47
47
|
expanded_name = self.text
|
48
48
|
self.words.each do |word|
|
49
49
|
lowercase_word = word.downcase
|
50
|
-
substitute = dictionary.
|
50
|
+
substitute = dictionary.preferred_synonyms[lowercase_word]
|
51
51
|
if substitute
|
52
52
|
expanded_name = case_preserving_sub(expanded_name, word, substitute)
|
53
53
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wordmonger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard LeBer
|
@@ -54,5 +54,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
54
54
|
requirements: []
|
55
55
|
rubygems_version: 3.6.9
|
56
56
|
specification_version: 4
|
57
|
-
summary: Work with words, synonyms, and
|
57
|
+
summary: Work with words, synonyms, and synonyms
|
58
58
|
test_files: []
|