russian_metaphone 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ vendor/gems
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in russian_metaphone.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Pavlo V. Lysov
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # RussianMetaphone
2
+
3
+ This gem provides an implementation of 'Metaphone' phonetic algorithm adapted for Russian language. Check [this Wikipedia article](http://rubydoc.info/gems/carrierwave/frames) for Metaphone intro.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'russian_metaphone'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install russian_metaphone
18
+
19
+ ## Usage
20
+
21
+ Going to switch to Russian at this point... Drop me a line if you'd like me to translate the Usage section to English...
22
+
23
+ Алгоритм русского "Метафон" был предложен Петром Каньковски более 10 лет назад. Именно он и лег в основу этой реализации. Оригинал статьи, за давностью лет, не сохранился, но его можно посмотреть в [архиве](http://web.archive.org/web/20071107145942/http://kankowski.narod.ru/dev/metaphoneru.htm).
24
+
25
+ Реализация RussianMetaphone не претендует на высокую производительность. Основной упор сделан на модульность реализации - позволяет легко менять, настраивать, тестировать и подстраивать его под нужды конкретного проекта. Думаю оптимизация хорошо настроенного алгоритма не будет сложной задачей, гораздо сложнее "оттюнить" сам алгоритм.
26
+
27
+ ### Как пользоваться
28
+
29
+ ```ruby
30
+ puts RussianMetaphone::process("Ахматова") # => ахмат%5
31
+ puts RussianMetaphone::process("Бродский") # => працк%9
32
+ puts RussianMetaphone::process("Мальденштам") # => малдинштам
33
+ ```
34
+
35
+ ### Как это работает
36
+
37
+ Входные данные проходят через набор фильтров и каждый фильтр по-своему модифицирует строку. Та строка, которую вернет последний в цепочке фильтр и будет конечным результатом.
38
+
39
+ ### Фильтры
40
+
41
+ Фильтр - это руби модуль или экземпляр класса, который реализует метод *filter*:
42
+
43
+ ```ruby
44
+ def filter(string, options = {})
45
+ ```
46
+
47
+ результатом выполнения фильтра должна быть строка.
48
+
49
+ RussianMetaphone имеет готовый набор фильтров для работы с именами и фамилиями, эти фильтры перечислены ниже. Вы можете добавить свои фильтры в цепочку если алгоритм не совсем четко справляется с Вашей задачей. Про добавление "кастомных" фильтров в цепочку смотрите ниже.
50
+
51
+ #### RussianMetaphone::Filter::Normalization
52
+
53
+ Нормализует строку - убирает из нее все не кириллическое, а так-же символы твердого и мягкого знаков ('Ъ' и 'Ь')
54
+
55
+ #### RussianMetaphone::Filter::DuplicatesRemoval
56
+
57
+ Исключает повторяющиеся символы - (Метревели многие напишут как Метревелли)
58
+
59
+ #### RussianMetaphone::Filter::LastnameEnding
60
+
61
+ При работе с фамилиями бывает полезным заменить часто употребимые окончания фамилий на что-то более короткое. Этот фильтр заменяет окончание *овский* на *%1*, *евский* на *%2* и т.д. Остальные замены см. в исходниках.
62
+
63
+ #### RussianMetaphone::Filter::Replacement
64
+
65
+ Заменяет символы следующим образом:
66
+
67
+ * ТС, ДС - заменяются на Ц
68
+ * ЙО, ИО, ЙЕ, ИЕ - заменяются на И
69
+ * О, Ы, А, Я - заменяются на А
70
+ * Ю, У - заменяются на У
71
+ * Е, Ё, Э - заменяются на И
72
+
73
+ #### RussianMetaphone::Filter::BreathConsonants
74
+
75
+ Производит оглушение согласных в слабой позиции. См. исходник - там описаны детали.
76
+
77
+
78
+ ## Contributing
79
+
80
+ 1. Fork it
81
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
82
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
83
+ 4. Push to the branch (`git push origin my-new-feature`)
84
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,46 @@
1
+ # encoding: UTF-8
2
+ module RussianMetaphone
3
+ module Filter
4
+ # Оглушение согласных в слабой позиции
5
+ module BreathConsonants
6
+
7
+ REZONANTS = %w(л м н р) # Сонорные согласные (те звонкие, у которых нет глухой пары?)
8
+ VOICED_VS_VOICELESS = { 'б' => 'п', 'в' => 'ф', 'г' => 'к', 'д' => 'т', 'ж' => 'ж', 'з' => 'с' }
9
+ VOICED = VOICED_VS_VOICELESS.keys
10
+ VOICELESS = VOICED_VS_VOICELESS.values
11
+
12
+ def filter(string, options = {})
13
+ options[:skip_if_before_rezonant] = false if !options.has_key?(:skip_if_before_rezonant)
14
+ previous_char = nil
15
+
16
+ string.each_char.each_with_index do |current_char, ind|
17
+ if VOICED.include?(previous_char) &&
18
+ (
19
+ VOICELESS.include?(current_char) ||
20
+ (!options[:skip_if_before_rezonant] && REZONANTS.include?(current_char))
21
+ )
22
+ string[ind-1] = VOICED_VS_VOICELESS[previous_char]
23
+ end
24
+ previous_char = current_char
25
+ end
26
+
27
+ # Звонкие согласные превращаются в глухие в конце слова
28
+ string[string.length-1] = VOICED_VS_VOICELESS[previous_char] if VOICED.include?(previous_char)
29
+
30
+ string
31
+ end
32
+ module_function :filter
33
+
34
+ end
35
+
36
+ end
37
+ end
38
+
39
+ # Слабой считается такая позиция (место в слове) звука,
40
+ # при которой он слышится неясно, неотчётливо.
41
+ #
42
+ # Такими позициями для согласных звуков являются
43
+ # 1) расположение согласного звука в конце слова: дуб [дуп], верблюд [вирблют];
44
+ # 2) расположение согласного звука перед другим согласным (кроме сонорных) -
45
+ # при так называемом стечении согласных, когда их несколько в слове:
46
+ # пробка [пропка], скобка [скопка];
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+ module RussianMetaphone
3
+ module Filter
4
+ # Исключение повторяющихся символов
5
+ module DuplicatesRemoval
6
+
7
+ def filter(string, options = {})
8
+ previous_char = nil
9
+
10
+ string.each_char.each_with_index do |current_char, ind|
11
+ string.slice!(ind-1) if previous_char == current_char
12
+ previous_char = current_char
13
+ end
14
+
15
+ string
16
+ end
17
+ module_function :filter
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: UTF-8
2
+ module RussianMetaphone
3
+ module Filter
4
+ module LastnameEnding
5
+
6
+ REPLACEMENTS = {
7
+ /овский$/ => '%1',
8
+ /евский$/ => '%2',
9
+ /овская$/ => '%3',
10
+ /евская$/ => '%4',
11
+ /иева$|еева$|ова$|ева$/ => '%5',
12
+ /иев$|еев$|ов$|ев$/ => '%6',
13
+ /нко$/ => '%7',
14
+ /ая$/ => '%8',
15
+ /ий$|ый$/ => '%9',
16
+ /ых$|их$/ => '%10',
17
+ /ин$/ => '%11',
18
+ /ик$|ек$/ => '%12',
19
+ /ук$|юк$/ => '%13'
20
+ }
21
+
22
+ def filter(string, options = {})
23
+ REPLACEMENTS.each_pair do |regexp, substitution|
24
+ string.gsub!(regexp, substitution)
25
+ end
26
+ string
27
+ end
28
+
29
+ module_function :filter
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ # encoding: UTF-8
2
+ module RussianMetaphone
3
+ module Filter
4
+ module Normalization
5
+
6
+ STRIP_REGEXP = /[ъь]/
7
+
8
+ def filter(string, options = {})
9
+ string = Unicode.downcase(string.gsub(/\P{Cyrillic}+/, ''))
10
+ string.gsub(STRIP_REGEXP, '')
11
+ end
12
+
13
+ module_function :filter
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: UTF-8
2
+
3
+ # Исходные символы | Конечный символ
4
+ # |
5
+ # О, Ы, А, Я | А
6
+ # Ю, У | У
7
+ # Е, Ё, Э, И | И
8
+ #
9
+ # ЙО, ИО, ЙЕ, ИЕ заменяются на И
10
+ # ТС, ДС заменяются на Ц
11
+ #
12
+ module RussianMetaphone
13
+ module Filter
14
+ module Replacement
15
+
16
+ REPLACEMENTS = {
17
+ /тс|дс/ => 'ц' ,
18
+ /йо|ио|йе|ие/ => 'и',
19
+ /[оыя]/ => 'а',
20
+ /[ю]/ => 'y',
21
+ /[еёэ]/ => 'и'
22
+ }
23
+
24
+ def filter(string, options = {})
25
+ result = String.new(string)
26
+ REPLACEMENTS.each_pair do |reg, char|
27
+ result.gsub!(reg, char)
28
+ end
29
+ result
30
+ end
31
+ module_function :filter
32
+
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,6 @@
1
+ # encoding: UTF-8
2
+ require 'russian_metaphone/filter/normalization'
3
+ require 'russian_metaphone/filter/replacement'
4
+ require 'russian_metaphone/filter/breath_consonants'
5
+ require 'russian_metaphone/filter/duplicates_removal'
6
+ require 'russian_metaphone/filter/lastname_ending'
@@ -0,0 +1,4 @@
1
+ # encoding: UTF-8
2
+ module RussianMetaphone
3
+ VERSION = "0.0.1"
4
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+ require "unicode"
3
+ require "russian_metaphone/version"
4
+ require "russian_metaphone/filter"
5
+
6
+ module RussianMetaphone
7
+ def process(source)
8
+ filters = [
9
+ RussianMetaphone::Filter::Normalization,
10
+ RussianMetaphone::Filter::DuplicatesRemoval,
11
+ RussianMetaphone::Filter::LastnameEnding,
12
+ RussianMetaphone::Filter::Replacement,
13
+ RussianMetaphone::Filter::BreathConsonants,
14
+ RussianMetaphone::Filter::DuplicatesRemoval
15
+ ]
16
+ result = String.new(source)
17
+ filters.each { |f| result = f.send(:filter, result) }
18
+ result
19
+ end
20
+ module_function :process
21
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'russian_metaphone/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "russian_metaphone"
8
+ gem.version = RussianMetaphone::VERSION
9
+ gem.authors = ["Pavlo V. Lysov"]
10
+ gem.email = ["pavlo@cleverua.com"]
11
+ gem.description = %q{Implements 'Metaphone' phonetic algorithm adapted for Russian language}
12
+ gem.summary = %q{Implements 'Metaphone' phonetic algorithm adapted for Russian language, allows easy extending and algorithm tuning.}
13
+ gem.homepage = "https://github.com/cleverua/russian_metaphone"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency("unicode", ">= 0.4.4")
21
+ gem.add_development_dependency "rspec"
22
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe "Breath Consonants Filter" do
5
+
6
+ it "should replace voiced with voiceless counterpart if voiced goes right before a voiceless" do
7
+ RussianMetaphone::Filter::BreathConsonants.filter('мавка').should == 'мафка'
8
+ RussianMetaphone::Filter::BreathConsonants.filter('обнимать').should == 'опнимать'
9
+ RussianMetaphone::Filter::BreathConsonants.filter('втгжбсаук').should == 'фткжпсаук'
10
+ end
11
+
12
+ it "skip_if_before_rezonant option is TRUE" do
13
+ # если 'Б' идет перед сонорным 'Н', тогда его не заменяем, если передан skip_if_before_rezonant
14
+ RussianMetaphone::Filter::BreathConsonants.filter('обнимать', :skip_if_before_rezonant => true).should == 'обнимать'
15
+ end
16
+
17
+ it "should replace voiced conconant with voiceless at the end of the word" do
18
+ RussianMetaphone::Filter::BreathConsonants.filter('город').should == 'горот'
19
+ RussianMetaphone::Filter::BreathConsonants.filter('мороз').should == 'морос'
20
+ end
21
+
22
+ end
23
+
@@ -0,0 +1,16 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe "Duplicates Removal Filter" do
5
+
6
+ it "should remove all duplicates" do
7
+ RussianMetaphone::Filter::DuplicatesRemoval.filter('Метревелли').should == 'Метревели'
8
+ RussianMetaphone::Filter::DuplicatesRemoval.filter('Длиннющий').should == 'Длинющий'
9
+ end
10
+
11
+ it "should not do anything if no duplicates available" do
12
+ RussianMetaphone::Filter::DuplicatesRemoval.filter('новый год').should == 'новый год'
13
+ end
14
+
15
+ end
16
+
@@ -0,0 +1,46 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe "Lastname Ending Filter" do
5
+
6
+ it "should collapse like this:" do
7
+ assert_filter('Дубровский', 'Дубр%1')
8
+ assert_filter('Раевский', 'Ра%2')
9
+ assert_filter('Покровская', 'Покр%3')
10
+ assert_filter('Раневская', 'Ран%4')
11
+
12
+ assert_filter('Палиева', 'Пал%5')
13
+ assert_filter('Авдеева', 'Авд%5')
14
+ assert_filter('Семенова', 'Семен%5')
15
+ assert_filter('Терентьева', 'Теренть%5')
16
+
17
+ assert_filter('Палиев', 'Пал%6')
18
+ assert_filter('Авдеев', 'Авд%6')
19
+ assert_filter('Семенов', 'Семен%6')
20
+ assert_filter('Терентьев', 'Теренть%6')
21
+
22
+ assert_filter('Кононенко', 'Кононе%7')
23
+
24
+ assert_filter('Яровая', 'Яров%8')
25
+
26
+ assert_filter('Чернявский', 'Чернявск%9')
27
+ assert_filter('Буденый', 'Буден%9')
28
+
29
+ assert_filter('Боровских', 'Боровск%10')
30
+ assert_filter('Черных', 'Черн%10')
31
+
32
+ assert_filter('Литвин', 'Литв%11')
33
+
34
+ assert_filter('Кулик', 'Кул%12')
35
+ assert_filter('Гашек', 'Гаш%12')
36
+
37
+ assert_filter('Гайдук', 'Гайд%13')
38
+ assert_filter('Мазнюк', 'Мазн%13')
39
+ end
40
+
41
+ end
42
+
43
+ def assert_filter(source, expected)
44
+ RussianMetaphone::Filter::LastnameEnding.filter(source).should == expected
45
+ end
46
+
@@ -0,0 +1,24 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe "Normalization Filter" do
5
+
6
+ it "should join multiple words into one" do
7
+ RussianMetaphone::Filter::Normalization.filter("привет от старых штиблет").should == 'приветотстарыхштиблет'
8
+ end
9
+
10
+ it "should not allow anything but cyrillic chars" do
11
+ RussianMetaphone::Filter::Normalization.filter("Привет мир! Hello World!").should == 'приветмир'
12
+ end
13
+
14
+ it "should downcase things properly" do
15
+ source = "МИРу МИр"
16
+ RussianMetaphone::Filter::Normalization.filter("МИРу МИр").should == 'мирумир'
17
+ end
18
+
19
+ it "should stip Ь and Ъ chars" do
20
+ RussianMetaphone::Filter::Normalization.filter("масянька").should == 'масянка'
21
+ RussianMetaphone::Filter::Normalization.filter("гундосъев").should == 'гундосев'
22
+ end
23
+
24
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ #
5
+ # Исходные символы | Конечный символ
6
+ # |
7
+ # О, Ы, А, Я | А
8
+ # Ю, У | У
9
+ # Е, Ё, Э, И | И
10
+ #
11
+ # ЙО, ИО, ЙЕ, ИЕ заменяются на И
12
+ # ТС, ДС заменяются на Ц
13
+
14
+ describe "Replacements Filter" do
15
+
16
+ it "should not take into account the accent of a word" do
17
+ RussianMetaphone::Filter::Replacement.filter('боян').should == 'баан'
18
+ RussianMetaphone::Filter::Replacement.filter('малюкиёлка').should == 'малyкиилка'
19
+ end
20
+
21
+ it "should replace ЙО, ИО, ЙЕ, ИЕ = И" do
22
+ RussianMetaphone::Filter::Replacement.filter('майонез').should == 'маиниз'
23
+ RussianMetaphone::Filter::Replacement.filter('физиотерапия').should == 'физитирапиа'
24
+ RussianMetaphone::Filter::Replacement.filter('йемен').should == 'имин'
25
+ RussianMetaphone::Filter::Replacement.filter('приключение').should == 'приклyчини'
26
+ end
27
+
28
+ it "should replace ТС, ДС = Ц" do
29
+ RussianMetaphone::Filter::Replacement.filter('безрассудство').should == 'бизрассуцтва'
30
+ RussianMetaphone::Filter::Replacement.filter('детсад').should == 'дицад'
31
+ end
32
+ end
33
+
@@ -0,0 +1,2 @@
1
+ # encoding: UTF-8
2
+ require 'russian_metaphone'
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: russian_metaphone
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Pavlo V. Lysov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: unicode
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.4.4
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.4.4
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: Implements 'Metaphone' phonetic algorithm adapted for Russian language
47
+ email:
48
+ - pavlo@cleverua.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - .gitignore
54
+ - Gemfile
55
+ - LICENSE.txt
56
+ - README.md
57
+ - Rakefile
58
+ - lib/russian_metaphone.rb
59
+ - lib/russian_metaphone/filter.rb
60
+ - lib/russian_metaphone/filter/breath_consonants.rb
61
+ - lib/russian_metaphone/filter/duplicates_removal.rb
62
+ - lib/russian_metaphone/filter/lastname_ending.rb
63
+ - lib/russian_metaphone/filter/normalization.rb
64
+ - lib/russian_metaphone/filter/replacement.rb
65
+ - lib/russian_metaphone/version.rb
66
+ - russian_metaphone.gemspec
67
+ - spec/breath_consonants_filter_spec.rb
68
+ - spec/duplicates_removal_filter_spec.rb
69
+ - spec/lastname_ending_filter_spec.rb
70
+ - spec/normalization_filter_spec.rb
71
+ - spec/replacement_filter_spec.rb
72
+ - spec/spec_helper.rb
73
+ homepage: https://github.com/cleverua/russian_metaphone
74
+ licenses: []
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubyforge_project:
93
+ rubygems_version: 1.8.24
94
+ signing_key:
95
+ specification_version: 3
96
+ summary: Implements 'Metaphone' phonetic algorithm adapted for Russian language, allows
97
+ easy extending and algorithm tuning.
98
+ test_files:
99
+ - spec/breath_consonants_filter_spec.rb
100
+ - spec/duplicates_removal_filter_spec.rb
101
+ - spec/lastname_ending_filter_spec.rb
102
+ - spec/normalization_filter_spec.rb
103
+ - spec/replacement_filter_spec.rb
104
+ - spec/spec_helper.rb