rhymes 0.1.0 → 1.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/README.rdoc +7 -18
- data/data/cmudict_LICENSE +33 -0
- data/data/rhymes.dat +0 -0
- data/lib/rhymes.rb +25 -82
- data/lib/rhymes/version.rb +2 -2
- data/rhymes.gemspec +0 -2
- data/spec/rhymes_spec.rb +8 -32
- metadata +5 -3
data/README.rdoc
CHANGED
|
@@ -1,34 +1,23 @@
|
|
|
1
|
+
{<img src="https://codeclimate.com/github/kalenkov/rhymes.png" />}[https://codeclimate.com/github/kalenkov/rhymes]
|
|
1
2
|
= Rhymes
|
|
2
|
-
Rhymes looks up perfect and identical rhymes using the Carnegie Mellon
|
|
3
|
-
Pronouncing Dictionary
|
|
4
|
-
compatible format.
|
|
5
|
-
|
|
6
|
-
Dictionary can be downloaded from https://cmusphinx.svn.sourceforge.net/svnroot/cmusphinx/trunk/cmudict/
|
|
7
|
-
(latest version - https://cmusphinx.svn.sourceforge.net/svnroot/cmusphinx/trunk/cmudict/cmudict.0.7a)
|
|
3
|
+
Rhymes looks up perfect and identical rhymes using precompiled version of the Carnegie Mellon
|
|
4
|
+
Pronouncing Dictionary.
|
|
8
5
|
|
|
9
6
|
== Installation
|
|
10
7
|
|
|
11
8
|
gem install rhymes
|
|
12
9
|
|
|
13
10
|
== Usage
|
|
14
|
-
Before first usage download and store the dictionary. Example below assumes
|
|
15
|
-
dictionary stored by default at /tmp/cmudict.0.7a. Precompiled version will be stored
|
|
16
|
-
as /tmp/rhymes.dat
|
|
17
11
|
|
|
18
12
|
ruby > require 'rhymes'
|
|
19
13
|
=> true
|
|
20
14
|
ruby > Rhymes.rhyme('ruby')
|
|
21
15
|
=> ["BOOBY", "DUBHI", "DUBY", "HRUBY", "KUBY", "LOOBY", "LUBY", "NEWBY", "RUBEY", "RUBI", "RUBIE", "SCOOBY", "TRUBEY", "TRUBY"]
|
|
22
16
|
|
|
23
|
-
|
|
17
|
+
Class method will load dictionary on each call. Use instance method to front-load the expense
|
|
24
18
|
|
|
25
19
|
ruby > require 'rhymes'
|
|
26
20
|
=> true
|
|
27
|
-
ruby > Rhymes.
|
|
28
|
-
=>
|
|
29
|
-
|
|
30
|
-
=> {:raw_dict=>"/tmp/cmudict.0.7a", :compiled=>"/new/location/file"}
|
|
31
|
-
ruby > Rhymes.setup{|c| c.raw_dict = '/new/raw/dict'}
|
|
32
|
-
=> {:raw_dict=>"/new/raw/dict", :compiled=>"/new/location/file"}
|
|
33
|
-
|
|
34
|
-
Note that after the first successful call to Rhymes.rhyme all data is in memory and setup does not affect anything
|
|
21
|
+
ruby > rhymes = Rhymes.new; rhymes.rhyme('ruby')
|
|
22
|
+
=> ["BOOBY", "DUBHI", "DUBY", "HRUBY", "KUBY", "LOOBY", "LUBY", "NEWBY", "RUBEY", "RUBI", "RUBIE", "SCOOBY", "TRUBEY", "TRUBY"]
|
|
23
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
Copyright (C) 1993-2008 Carnegie Mellon University. All rights reserved.
|
|
2
|
+
|
|
3
|
+
Redistribution and use in source and binary forms, with or without
|
|
4
|
+
modification, are permitted provided that the following conditions
|
|
5
|
+
are met:
|
|
6
|
+
|
|
7
|
+
1. Redistributions of source code must retain the above copyright
|
|
8
|
+
notice, this list of conditions and the following disclaimer.
|
|
9
|
+
The contents of this file are deemed to be source code.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
12
|
+
notice, this list of conditions and the following disclaimer in
|
|
13
|
+
the documentation and/or other materials provided with the
|
|
14
|
+
distribution.
|
|
15
|
+
|
|
16
|
+
This work was supported in part by funding from the Defense Advanced
|
|
17
|
+
Research Projects Agency, the Office of Naval Research and the National
|
|
18
|
+
Science Foundation of the United States of America, and by member
|
|
19
|
+
companies of the Carnegie Mellon Sphinx Speech Consortium. We acknowledge
|
|
20
|
+
the contributions of many volunteers to the expansion and improvement of
|
|
21
|
+
this dictionary.
|
|
22
|
+
|
|
23
|
+
THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND
|
|
24
|
+
ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
25
|
+
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
26
|
+
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY
|
|
27
|
+
NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
28
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
29
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
30
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
31
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
32
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
33
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/data/rhymes.dat
ADDED
|
Binary file
|
data/lib/rhymes.rb
CHANGED
|
@@ -1,88 +1,31 @@
|
|
|
1
1
|
require 'rhymes/version'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
# generic error
|
|
5
|
-
class RhymesError < RuntimeError; end
|
|
3
|
+
class Rhymes
|
|
6
4
|
# word does not exist in the dictionary
|
|
7
|
-
class UnknownWord <
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
##
|
|
24
|
-
# Return the list of perfect and identical rhymes to provided word (in upper case)
|
|
25
|
-
# raises
|
|
26
|
-
# Rhymes::UnknownWord - word does not exist in the dictionary
|
|
27
|
-
# Rhymes::DictionaryMissing - dictionary file cannot be found at expected location
|
|
28
|
-
def rhyme(word)
|
|
29
|
-
wup = word.upcase
|
|
30
|
-
key = words[wup]
|
|
31
|
-
raise UnknownWord unless key
|
|
32
|
-
rhymes[key] - [wup]
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
private
|
|
36
|
-
def options
|
|
37
|
-
@options ||= Struct.new(:raw_dict, :compiled).new('/tmp/cmudict.0.7a', '/tmp/rhymes.dat')
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def words
|
|
41
|
-
init unless @words
|
|
42
|
-
@words
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def rhymes
|
|
46
|
-
init unless @rhymes
|
|
47
|
-
@rhymes
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def perfect_key(pron)
|
|
52
|
-
first = pron.rindex{|snd| snd =~ /1$/} || 0
|
|
53
|
-
pron[first..-1]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def init
|
|
57
|
-
return if load_compiled
|
|
58
|
-
unless File.exists?(options.raw_dict)
|
|
59
|
-
msg = %W[File #{options.raw_dict} does not exist. You can download the latest dictionary
|
|
60
|
-
from https://cmusphinx.svn.sourceforge.net/svnroot/cmusphinx/trunk/cmudict and provide
|
|
61
|
-
file location with Rhymes.setup(:raw_dict => file_full_path) (/tmp/cmudict.0.7a by default)] * ' '
|
|
62
|
-
raise DictionaryMissing.new(msg)
|
|
63
|
-
end
|
|
64
|
-
load_dictionary
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def load_dictionary
|
|
68
|
-
@words, @rhymes = {}, {}
|
|
69
|
-
File.open(options[:raw_dict]) do |f|
|
|
70
|
-
while l = f.gets do
|
|
71
|
-
next if l =~ /^[^A-Z]/
|
|
72
|
-
word, *pron = l.strip.split(' ')
|
|
73
|
-
next if word.empty? || word =~ /\d/
|
|
74
|
-
pron.map!{|snd| snd.sub(/2/, '1')}
|
|
75
|
-
key = perfect_key(pron)
|
|
76
|
-
@words[word] = key
|
|
77
|
-
(@rhymes[key] ||= []) << word
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
File.open(options.compiled, 'wb'){|f| f.write(Marshal.dump([@words, @rhymes]))} rescue nil
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def load_compiled
|
|
84
|
-
@words, @rhymes = Marshal.load(File.open(options.compiled, 'rb'){|f| f.read }) if File.exists?(options.compiled)
|
|
85
|
-
end
|
|
5
|
+
class UnknownWord < RuntimeError; end
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
# Class method (slow, reads data on each call)
|
|
9
|
+
# Returns the list of perfect and identical rhymes to provided word (in upper case)
|
|
10
|
+
# raises
|
|
11
|
+
# Rhymes::UnknownWord - word does not exist in the dictionary
|
|
12
|
+
def self.rhyme(word)
|
|
13
|
+
Rhymes.new.rhyme(word)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def initialize
|
|
17
|
+
@words, @rhymes = Marshal.load(File.open(File.expand_path('../data/rhymes.dat', File.dirname(__FILE__)), 'rb'){|f| f.read })
|
|
18
|
+
end
|
|
86
19
|
|
|
20
|
+
##
|
|
21
|
+
# Instance method. Use to front-load the expense of reading data file
|
|
22
|
+
# Returns the list of perfect and identical rhymes to provided word (in upper case)
|
|
23
|
+
# raises
|
|
24
|
+
# Rhymes::UnknownWord - word does not exist in the dictionary
|
|
25
|
+
def rhyme(word)
|
|
26
|
+
wup = word.upcase
|
|
27
|
+
key = @words[wup]
|
|
28
|
+
raise UnknownWord unless key
|
|
29
|
+
@rhymes[key] - [wup]
|
|
87
30
|
end
|
|
88
31
|
end
|
data/lib/rhymes/version.rb
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
VERSION = "
|
|
1
|
+
class Rhymes
|
|
2
|
+
VERSION = "1.0.0"
|
|
3
3
|
end
|
data/rhymes.gemspec
CHANGED
|
@@ -11,8 +11,6 @@ Gem::Specification.new do |s|
|
|
|
11
11
|
s.summary = %q{Lookup perfect and identical rhymes}
|
|
12
12
|
s.description = %q{Lookup perfect and identical rhymes}
|
|
13
13
|
|
|
14
|
-
s.rubyforge_project = "rhymes"
|
|
15
|
-
|
|
16
14
|
s.files = `git ls-files`.split("\n")
|
|
17
15
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
18
16
|
s.require_paths = ["lib"]
|
data/spec/rhymes_spec.rb
CHANGED
|
@@ -1,41 +1,17 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Rhymes do
|
|
4
|
-
before do
|
|
5
|
-
@sample = File.join(File.dirname(__FILE__), 'sample_raw.txt')
|
|
6
|
-
Rhymes.setup(:raw_dict => @sample, :compiled => '')
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
it 'should save provided option' do
|
|
10
|
-
Rhymes.setup(:compiled => '/tmp/sample').should == {:raw_dict => @sample, :compiled => '/tmp/sample'}
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it 'should save block config' do
|
|
14
|
-
Rhymes.setup do |config|
|
|
15
|
-
config.raw_dict = 'foo'
|
|
16
|
-
config.compiled = 'bar'
|
|
17
|
-
end.should == {:raw_dict => 'foo', :compiled => 'bar'}
|
|
18
|
-
end
|
|
19
|
-
|
|
20
4
|
it 'should rhyme ruby with newby and scooby' do
|
|
21
|
-
Rhymes.rhyme('ruby').should
|
|
22
|
-
Rhymes.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
it 'should rhyme rube and cube' do
|
|
27
|
-
Rhymes.rhyme('RubE').should == ['CUBE']
|
|
28
|
-
Rhymes.rhyme('cUbE').should == ['RUBE']
|
|
5
|
+
Rhymes.rhyme('ruby').should include('NEWBY', 'SCOOBY')
|
|
6
|
+
rhymes = Rhymes.new
|
|
7
|
+
rhymes.rhyme('Scooby').should include('NEWBY', 'RUBY')
|
|
8
|
+
rhymes.rhyme('newby').should include('RUBY', 'SCOOBY')
|
|
29
9
|
end
|
|
30
10
|
|
|
31
|
-
it 'should rhyme
|
|
32
|
-
Rhymes.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
it 'should rhyme monterrey and usa' do
|
|
37
|
-
Rhymes.rhyme('MONTERREY').should == ['USA']
|
|
38
|
-
Rhymes.rhyme('USA').should == ['MONTERREY']
|
|
11
|
+
it 'should rhyme case-insensitive' do
|
|
12
|
+
rhymes = Rhymes.new
|
|
13
|
+
rhymes.rhyme('RubE').should include('CUBE')
|
|
14
|
+
rhymes.rhyme('cUbE').should include('RUBE')
|
|
39
15
|
end
|
|
40
16
|
|
|
41
17
|
it 'should raise with unknown word' do
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rhymes
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-
|
|
12
|
+
date: 2013-05-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rspec
|
|
@@ -39,6 +39,8 @@ files:
|
|
|
39
39
|
- LICENSE
|
|
40
40
|
- README.rdoc
|
|
41
41
|
- Rakefile
|
|
42
|
+
- data/cmudict_LICENSE
|
|
43
|
+
- data/rhymes.dat
|
|
42
44
|
- lib/rhymes.rb
|
|
43
45
|
- lib/rhymes/version.rb
|
|
44
46
|
- rhymes.gemspec
|
|
@@ -64,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
64
66
|
- !ruby/object:Gem::Version
|
|
65
67
|
version: '0'
|
|
66
68
|
requirements: []
|
|
67
|
-
rubyforge_project:
|
|
69
|
+
rubyforge_project:
|
|
68
70
|
rubygems_version: 1.8.24
|
|
69
71
|
signing_key:
|
|
70
72
|
specification_version: 3
|