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