langue 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +57 -0
- data/Rakefile +2 -0
- data/langue.gemspec +21 -0
- data/lib/langue.rb +47 -0
- data/lib/langue/all.rb +3 -0
- data/lib/langue/exceptions.rb +5 -0
- data/lib/langue/language.rb +31 -0
- data/lib/langue/morpheme.rb +30 -0
- data/lib/langue/morphemes.rb +22 -0
- data/lib/langue/sentence.rb +18 -0
- data/lib/langue/text.rb +22 -0
- data/lib/langue/version.rb +3 -0
- data/lib/langue/word.rb +64 -0
- data/spec/langue/language_spec.rb +46 -0
- data/spec/langue/morpheme_spec.rb +105 -0
- data/spec/langue/morphemes_spec.rb +73 -0
- data/spec/langue/sentence_spec.rb +57 -0
- data/spec/langue/text_spec.rb +72 -0
- data/spec/langue/word_spec.rb +261 -0
- data/spec/langue_spec.rb +134 -0
- metadata +101 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Takahiro Kondo
|
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,57 @@
|
|
1
|
+
What is langue
|
2
|
+
==============
|
3
|
+
|
4
|
+
It is the foundation to provide the operations to the natural languages.
|
5
|
+
|
6
|
+
Installation
|
7
|
+
------------
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'langue'
|
12
|
+
|
13
|
+
# When using Japanese
|
14
|
+
gem 'langue-japanese'
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Or install it yourself as:
|
21
|
+
|
22
|
+
$ gem install langue
|
23
|
+
$ gem install langue-japanese
|
24
|
+
|
25
|
+
Usage
|
26
|
+
-----
|
27
|
+
|
28
|
+
# coding: utf-8
|
29
|
+
require 'langue-japanese'
|
30
|
+
|
31
|
+
# Get a language class
|
32
|
+
language = Langue['japanese'].new
|
33
|
+
|
34
|
+
# Split to morphemes a text
|
35
|
+
morphemes = language.parse('今日は妹と一緒にお買い物してきたよ。楽しかった〜')
|
36
|
+
|
37
|
+
# Create a structured text from the morphemes
|
38
|
+
text = language.structure(morphemes)
|
39
|
+
|
40
|
+
# When using English
|
41
|
+
require 'langue-english'
|
42
|
+
|
43
|
+
other_language = Langue['english'].new
|
44
|
+
|
45
|
+
If tiresome to require gem for each language, you will write the code following
|
46
|
+
instead:
|
47
|
+
|
48
|
+
require 'langue/all'
|
49
|
+
|
50
|
+
Contributing
|
51
|
+
------------
|
52
|
+
|
53
|
+
1. Fork it
|
54
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
55
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
56
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
57
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/langue.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/langue/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Takahiro Kondo"]
|
6
|
+
gem.email = ["kondo@atedesign.net"]
|
7
|
+
gem.description = %q{It is the foundation to provide the operations to the natural languages.}
|
8
|
+
gem.summary = %q{The foundation for the natural languages}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.name = "langue"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Langue::VERSION
|
17
|
+
|
18
|
+
gem.add_runtime_dependency 'activesupport'
|
19
|
+
|
20
|
+
gem.add_development_dependency 'rspec'
|
21
|
+
end
|
data/lib/langue.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'langue/version'
|
2
|
+
require 'langue/language'
|
3
|
+
require 'langue/exceptions'
|
4
|
+
|
5
|
+
module Langue
|
6
|
+
extend self
|
7
|
+
|
8
|
+
@languages = {}
|
9
|
+
|
10
|
+
def languages
|
11
|
+
@languages.values
|
12
|
+
end
|
13
|
+
|
14
|
+
def support(language_class)
|
15
|
+
id = to_language_id(language_class)
|
16
|
+
raise LanguageAlreadySupported, "'#{language_class.name}' language is supported already" if @languages.key?(id)
|
17
|
+
@languages[id] = language_class
|
18
|
+
end
|
19
|
+
|
20
|
+
def unsupport(language_spec)
|
21
|
+
id = to_language_id(language_spec)
|
22
|
+
raise unsupported!(language_spec) unless @languages.key?(id)
|
23
|
+
@languages.delete(id)
|
24
|
+
end
|
25
|
+
|
26
|
+
def unsupport_all
|
27
|
+
@languages.clear
|
28
|
+
end
|
29
|
+
|
30
|
+
def language(language_spec)
|
31
|
+
id = to_language_id(language_spec)
|
32
|
+
raise unsupported!(language_spec) unless @languages.key?(id)
|
33
|
+
@languages[id]
|
34
|
+
end
|
35
|
+
alias [] language
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def to_language_id(language_spec)
|
40
|
+
Class === language_spec ? language_spec.id : language_spec.to_s.downcase
|
41
|
+
end
|
42
|
+
|
43
|
+
def unsupported!(language_spec)
|
44
|
+
name = Class === language_spec ? language_spec.name : language_spec
|
45
|
+
raise LanguageUnsupported, "'#{name}' language is unsupported"
|
46
|
+
end
|
47
|
+
end
|
data/lib/langue/all.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'active_support/core_ext/string/inflections'
|
2
|
+
|
3
|
+
require 'langue/exceptions'
|
4
|
+
|
5
|
+
module Langue
|
6
|
+
class Language
|
7
|
+
class << self
|
8
|
+
def id
|
9
|
+
parts = name.split('::').reverse.drop_while { |part| part == 'Language' }
|
10
|
+
raise InvalidDefinition, "'#{name}' is invalid definition" if parts.empty?
|
11
|
+
parts.first.underscore
|
12
|
+
end
|
13
|
+
|
14
|
+
def depend_to(orig_method_name, *gems)
|
15
|
+
method_name = "_#{orig_method_name}"
|
16
|
+
alias_method(method_name, orig_method_name) unless respond_to?(method_name)
|
17
|
+
|
18
|
+
define_method(orig_method_name) do |*args|
|
19
|
+
gems.each { |gem| require gem }
|
20
|
+
value = __send__(method_name, *args)
|
21
|
+
self.class.class_eval { alias_method(orig_method_name, method_name) }
|
22
|
+
value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(options = {})
|
28
|
+
@options = options
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Langue
|
2
|
+
class Morpheme
|
3
|
+
KEYS = %w(
|
4
|
+
text
|
5
|
+
part_of_speech
|
6
|
+
categories
|
7
|
+
inflection
|
8
|
+
inflection_type
|
9
|
+
root_form
|
10
|
+
yomi
|
11
|
+
pronunciation
|
12
|
+
).map(&:to_sym)
|
13
|
+
|
14
|
+
def initialize(attrs)
|
15
|
+
KEYS.each { |key| instance_variable_set("@#{key}", attrs[key]) }
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader(*KEYS)
|
19
|
+
|
20
|
+
def classified?(part_of_speech, *categories)
|
21
|
+
got = [@part_of_speech] + @categories
|
22
|
+
expected = [part_of_speech] + categories
|
23
|
+
expected.zip(got).all? { |pair| pair[0] == pair[1] }
|
24
|
+
end
|
25
|
+
|
26
|
+
def inflected?(inflection)
|
27
|
+
@inflection == inflection
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'langue/morpheme'
|
2
|
+
|
3
|
+
module Langue
|
4
|
+
class Morphemes < Array
|
5
|
+
def valid?
|
6
|
+
all? { |morpheme| Morpheme === morpheme }
|
7
|
+
end
|
8
|
+
|
9
|
+
def at(index)
|
10
|
+
morpheme = self[index]
|
11
|
+
morpheme.nil? || !block_given? ? morpheme : yield(morpheme)
|
12
|
+
end
|
13
|
+
|
14
|
+
# def match?(index, text)
|
15
|
+
# at(index) {|morpheme| morpheme.text == text}
|
16
|
+
# end
|
17
|
+
|
18
|
+
# def after(index)
|
19
|
+
# self[index..-1]
|
20
|
+
# end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'langue/morphemes'
|
2
|
+
require 'langue/word'
|
3
|
+
|
4
|
+
module Langue
|
5
|
+
class Sentence < Array
|
6
|
+
def valid?
|
7
|
+
all? { |word| Word === word && word.valid? }
|
8
|
+
end
|
9
|
+
|
10
|
+
def words
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def morphemes
|
15
|
+
@morphemes ||= Morphemes.new(flatten)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/langue/text.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'langue/morphemes'
|
2
|
+
require 'langue/sentence'
|
3
|
+
|
4
|
+
module Langue
|
5
|
+
class Text < Array
|
6
|
+
def valid?
|
7
|
+
all? { |sentence| Sentence === sentence && sentence.valid? }
|
8
|
+
end
|
9
|
+
|
10
|
+
def sentences
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def words
|
15
|
+
@words ||= inject(&:+)
|
16
|
+
end
|
17
|
+
|
18
|
+
def morphemes
|
19
|
+
@morphemes ||= Morphemes.new(flatten)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/langue/word.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'langue/morphemes'
|
2
|
+
require 'langue/morpheme'
|
3
|
+
|
4
|
+
module Langue
|
5
|
+
class Word < Array
|
6
|
+
def valid?
|
7
|
+
all? { |morpheme| Morpheme === morpheme }
|
8
|
+
end
|
9
|
+
|
10
|
+
def morphemes
|
11
|
+
@morphemes ||= Morphemes.new(self)
|
12
|
+
end
|
13
|
+
|
14
|
+
alias key_morpheme last
|
15
|
+
|
16
|
+
def text
|
17
|
+
@text = not_empty? { map(&:text) } unless instance_variable_defined?(:@text)
|
18
|
+
@text
|
19
|
+
end
|
20
|
+
|
21
|
+
def inflection
|
22
|
+
@inflection = value_in_key_morpheme(:inflection) unless instance_variable_defined?(:@inflection)
|
23
|
+
@inflection
|
24
|
+
end
|
25
|
+
|
26
|
+
def inflection_type
|
27
|
+
@inflection_type = value_in_key_morpheme(:inflection_type) unless instance_variable_defined?(:@inflection_type)
|
28
|
+
@inflection_type
|
29
|
+
end
|
30
|
+
|
31
|
+
def root_form
|
32
|
+
@root_form = not_empty? { self[0..-2].map(&:text) + self[-1, 1].map(&:root_form) } unless instance_variable_defined?(:@root_form)
|
33
|
+
@root_form
|
34
|
+
end
|
35
|
+
|
36
|
+
def yomi
|
37
|
+
@yomi = join_values(:yomi) unless instance_variable_defined?(:@yomi)
|
38
|
+
@yomi
|
39
|
+
end
|
40
|
+
|
41
|
+
def pronunciation
|
42
|
+
@pronunciation = join_values(:pronunciation) unless instance_variable_defined?(:@pronunciation)
|
43
|
+
@pronunciation
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def not_empty?
|
49
|
+
empty? ? nil : yield.join
|
50
|
+
end
|
51
|
+
|
52
|
+
def value_in_key_morpheme(key)
|
53
|
+
morpheme = key_morpheme
|
54
|
+
morpheme.nil? ? nil : morpheme.__send__(key)
|
55
|
+
end
|
56
|
+
|
57
|
+
def join_values(key)
|
58
|
+
empty? ? nil : begin
|
59
|
+
values = map(&key)
|
60
|
+
values.any? { |value| value.nil? } ? nil : values.join
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'langue/language'
|
2
|
+
|
3
|
+
module Example
|
4
|
+
class LanguageExample < Langue::Language
|
5
|
+
def parse(text)
|
6
|
+
text
|
7
|
+
end
|
8
|
+
depend_to :parse, 'example/language_example/parser'
|
9
|
+
end
|
10
|
+
|
11
|
+
class Language < Langue::Language
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Language < Langue::Language
|
16
|
+
end
|
17
|
+
|
18
|
+
describe Langue::Language, '.id' do
|
19
|
+
it 'returns the class name based underscore' do
|
20
|
+
Example::LanguageExample.id.should == 'language_example'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns the class name of the parent that are separated by the namespace if the name of the language class is "Language"' do
|
24
|
+
Example::Language.id.should == 'example'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'raises Langue::InvalidDefinition if the name of the language class is "Language" and it is the top level object' do
|
28
|
+
lambda { Language.id }.should raise_error(Langue::InvalidDefinition, /'Language'/)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe Langue::Language, '.depend_to' do
|
33
|
+
before do
|
34
|
+
@language = Example::LanguageExample.new
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'calls require method' do
|
38
|
+
@language.should_receive(:require).with('example/language_example/parser')
|
39
|
+
@language.parse('text')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'does not call require method more than once' do
|
43
|
+
@language.should_not_receive(:require)
|
44
|
+
@language.parse('text')
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'langue/morpheme'
|
2
|
+
|
3
|
+
describe Langue::Morpheme, ' accessors' do
|
4
|
+
before do
|
5
|
+
@morpheme = described_class.new(
|
6
|
+
:text => 'text',
|
7
|
+
:part_of_speech => 'part_of_speech',
|
8
|
+
:categories => %w(category1 category2),
|
9
|
+
:inflection => 'inflection',
|
10
|
+
:inflection_type => 'inflection_type',
|
11
|
+
:root_form => 'root_form',
|
12
|
+
:yomi => 'yomi',
|
13
|
+
:pronunciation => 'pronunciation'
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'returns the text by text method' do
|
18
|
+
@morpheme.text.should == 'text'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns the part of speech by part_of_speech method' do
|
22
|
+
@morpheme.part_of_speech.should == 'part_of_speech'
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'returns the categories by categories method' do
|
26
|
+
@morpheme.categories.should == %w(category1 category2)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'returns the inflection by inflection method' do
|
30
|
+
@morpheme.inflection.should == 'inflection'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns the type of the inflection by inflection_type method' do
|
34
|
+
@morpheme.inflection_type.should == 'inflection_type'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns the root form by root_form method' do
|
38
|
+
@morpheme.root_form.should == 'root_form'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'returns the yomi by yomi method' do
|
42
|
+
@morpheme.yomi.should == 'yomi'
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns the pronunciation by pronunciation method' do
|
46
|
+
@morpheme.pronunciation.should == 'pronunciation'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe Langue::Morpheme, '#classified?' do
|
51
|
+
before do
|
52
|
+
@morpheme = described_class.new(
|
53
|
+
:part_of_speech => 'part_of_speech',
|
54
|
+
:categories => %w(category1 category2)
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'returns true if part of speech matched' do
|
59
|
+
@morpheme.should be_classified('part_of_speech')
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'returns false if part of speech did not match' do
|
63
|
+
@morpheme.should_not be_classified('part_0f_speech')
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'with fewer than the categories' do
|
67
|
+
it 'returns true if matched' do
|
68
|
+
@morpheme.should be_classified('part_of_speech', 'category1')
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns false if not matched' do
|
72
|
+
@morpheme.should_not be_classified('part_of_speech', 'category10')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'with equal to the categories' do
|
77
|
+
it 'returns true if matched' do
|
78
|
+
@morpheme.should be_classified('part_of_speech', 'category1', 'category2')
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'returns false if not matched' do
|
82
|
+
@morpheme.should_not be_classified('part_of_speech', 'category1', 'category20')
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'with many than the categories' do
|
87
|
+
it 'returns false' do
|
88
|
+
@morpheme.should_not be_classified('part_of_speech', 'category1', 'category2', 'category3')
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe Langue::Morpheme, '#inflected?' do
|
94
|
+
before do
|
95
|
+
@morpheme = described_class.new(:inflection => 'inflection')
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'returns true if inflection matched' do
|
99
|
+
@morpheme.should be_inflected('inflection')
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'returns false if inflection did not match' do
|
103
|
+
@morpheme.should_not be_inflected('inflecti0n')
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'langue/morphemes'
|
2
|
+
|
3
|
+
describe Langue::Morphemes, '#valid?' do
|
4
|
+
before do
|
5
|
+
@morphemes = described_class.new([
|
6
|
+
Langue::Morpheme.new({}),
|
7
|
+
Langue::Morpheme.new({}),
|
8
|
+
Langue::Morpheme.new({})
|
9
|
+
])
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'with all morphemes' do
|
13
|
+
it 'returns true' do
|
14
|
+
@morphemes.should be_valid
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with including non-morpheme' do
|
19
|
+
before do
|
20
|
+
@morphemes[1] = 'invalid_as_morpheme'
|
21
|
+
end
|
22
|
+
|
23
|
+
it do
|
24
|
+
@morphemes.should_not be_valid
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe Langue::Morphemes, '#at' do
|
30
|
+
before do
|
31
|
+
@morphemes = described_class.new([1, 2, 3])
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns a morpheme at the position of the index' do
|
35
|
+
morpheme = @morphemes.at(0)
|
36
|
+
morpheme.should == 1
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'with do not have a morpheme at the position of the index' do
|
40
|
+
it 'returns nil' do
|
41
|
+
morpheme = @morphemes.at(3)
|
42
|
+
morpheme.should be_nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'with a block' do
|
47
|
+
it 'passes to the block a morpheme at the position of the index' do
|
48
|
+
@morphemes.at(0) { |morpheme| morpheme.should == 1 }
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns the value returned from the block' do
|
52
|
+
value = @morphemes.at(0) { |morpheme| 'value' }
|
53
|
+
value.should == 'value'
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'with do not have a morpheme at the position of the index' do
|
57
|
+
it 'does not call the block' do
|
58
|
+
lambda { @morphemes.at(3) { |morpheme| fail } }.should_not raise_error
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns nil' do
|
62
|
+
value = @morphemes.at(3) { |morpheme| fail }
|
63
|
+
value.should be_nil
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# describe Langue::Morphemes, '#match?' do
|
70
|
+
# end
|
71
|
+
|
72
|
+
# describe Langue::Morphemes, '#after' do
|
73
|
+
# end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'langue/sentence'
|
2
|
+
|
3
|
+
describe Langue::Sentence, '#valid?' do
|
4
|
+
before do
|
5
|
+
@sentence = described_class.new([
|
6
|
+
Langue::Word.new,
|
7
|
+
Langue::Word.new,
|
8
|
+
Langue::Word.new
|
9
|
+
])
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'with all words' do
|
13
|
+
it 'returns true' do
|
14
|
+
@sentence.should be_valid
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with including non-word' do
|
19
|
+
before do
|
20
|
+
@sentence[1] = 'invalid_as_word'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns false' do
|
24
|
+
@sentence.should_not be_valid
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe Langue::Sentence, '#words' do
|
30
|
+
before do
|
31
|
+
sentence = described_class.new([[1, 2], [3, 4]])
|
32
|
+
@words = sentence.words
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'returns an instance of Array' do
|
36
|
+
@words.should be_an Array
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the words' do
|
40
|
+
@words.should == [[1, 2], [3, 4]]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe Langue::Sentence, '#morphemes' do
|
45
|
+
before do
|
46
|
+
sentence = described_class.new([[1, 2], [3, 4]])
|
47
|
+
@morphemes = sentence.morphemes
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'returns an instance of Langue::Morphemes' do
|
51
|
+
@morphemes.should be_a Langue::Morphemes
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'returns the morphemes in the words' do
|
55
|
+
@morphemes.should == [1, 2, 3, 4]
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'langue/text'
|
2
|
+
|
3
|
+
describe Langue::Text, '#valid?' do
|
4
|
+
before do
|
5
|
+
@text = described_class.new([
|
6
|
+
Langue::Sentence.new,
|
7
|
+
Langue::Sentence.new,
|
8
|
+
Langue::Sentence.new
|
9
|
+
])
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'with all sentences' do
|
13
|
+
it 'returns true' do
|
14
|
+
@text.should be_valid
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with including non-sentence' do
|
19
|
+
before do
|
20
|
+
@text[1] = 'invalid_as_sentence'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns false' do
|
24
|
+
@text.should_not be_valid
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe Langue::Text, '#sentences' do
|
30
|
+
before do
|
31
|
+
text = described_class.new([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
|
32
|
+
@sentences = text.sentences
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'returns an instance of Array' do
|
36
|
+
@sentences.should be_an Array
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns the sentences' do
|
40
|
+
@sentences.should == [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe Langue::Text, '#words' do
|
45
|
+
before do
|
46
|
+
text = described_class.new([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
|
47
|
+
@words = text.words
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'returns an instance of Array' do
|
51
|
+
@words.should be_an Array
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'returns the words in the sentences' do
|
55
|
+
@words.should == [[1, 2], [3, 4], [5, 6], [7, 8]]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe Langue::Text, '#morphemes' do
|
60
|
+
before do
|
61
|
+
text = described_class.new([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
|
62
|
+
@morphemes = text.morphemes
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'returns an instance of Langue::Morphemes' do
|
66
|
+
@morphemes.should be_a Langue::Morphemes
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'returns the morphemes in the words in the sentences' do
|
70
|
+
@morphemes.should == [1, 2, 3, 4, 5, 6, 7, 8]
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,261 @@
|
|
1
|
+
require 'langue/word'
|
2
|
+
|
3
|
+
describe Langue::Word, '#valid?' do
|
4
|
+
before do
|
5
|
+
@word = described_class.new([
|
6
|
+
Langue::Morpheme.new({}),
|
7
|
+
Langue::Morpheme.new({}),
|
8
|
+
Langue::Morpheme.new({})
|
9
|
+
])
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'with all morphemes' do
|
13
|
+
it 'returns true' do
|
14
|
+
@word.should be_valid
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'with including non-morpheme' do
|
19
|
+
before do
|
20
|
+
@word[1] = 'invalid_as_morpheme'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'returns false' do
|
24
|
+
@word.should_not be_valid
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe Langue::Word, '#morphemes' do
|
30
|
+
before do
|
31
|
+
word = described_class.new([1, 2, 3])
|
32
|
+
@morphemes = word.morphemes
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'returns an instance of Langue::Morphemes' do
|
36
|
+
@morphemes.should be_a Langue::Morphemes
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns ' do
|
40
|
+
@morphemes.should == [1, 2, 3]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe Langue::Word, '#key_morpheme' do
|
45
|
+
before do
|
46
|
+
word = described_class.new([1, 2, 3])
|
47
|
+
@morpheme = word.key_morpheme
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'returns the last morpheme' do
|
51
|
+
@morpheme.should == 3
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'with do not have morphemes' do
|
55
|
+
before do
|
56
|
+
word = described_class.new
|
57
|
+
@morpheme = word.key_morpheme
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'returns nil' do
|
61
|
+
@morpheme.should be_nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe Langue::Word, '#text' do
|
67
|
+
before do
|
68
|
+
word = described_class.new([
|
69
|
+
stub.tap { |s| s.stub!(:text).and_return('text1') },
|
70
|
+
stub.tap { |s| s.stub!(:text).and_return('text2') },
|
71
|
+
stub.tap { |s| s.stub!(:text).and_return('text3') }
|
72
|
+
])
|
73
|
+
|
74
|
+
@text = word.text
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'returns a concatenated string of the text of the morphemes' do
|
78
|
+
@text.should == 'text1text2text3'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe Langue::Word, '#inflection' do
|
83
|
+
before do
|
84
|
+
word = described_class.new([
|
85
|
+
stub.tap { |s| s.stub!(:inflection).and_return('inflection1') },
|
86
|
+
stub.tap { |s| s.stub!(:inflection).and_return('inflection2') },
|
87
|
+
stub.tap { |s| s.stub!(:inflection).and_return('inflection3') }
|
88
|
+
])
|
89
|
+
|
90
|
+
@inflection = word.inflection
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'returns the inflection of the last morpheme' do
|
94
|
+
@inflection.should == 'inflection3'
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'with do not have morphemes' do
|
98
|
+
before do
|
99
|
+
word = described_class.new
|
100
|
+
@inflection = word.inflection
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'returns nil' do
|
104
|
+
@inflection.should be_nil
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe Langue::Word, '#inflection_type' do
|
110
|
+
before do
|
111
|
+
word = described_class.new([
|
112
|
+
stub.tap { |s| s.stub!(:inflection_type).and_return('inflection_type1') },
|
113
|
+
stub.tap { |s| s.stub!(:inflection_type).and_return('inflection_type2') },
|
114
|
+
stub.tap { |s| s.stub!(:inflection_type).and_return('inflection_type3') }
|
115
|
+
])
|
116
|
+
|
117
|
+
@inflection_type = word.inflection_type
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'returns the type of the inflection of the last morpheme' do
|
121
|
+
@inflection_type.should == 'inflection_type3'
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'with do not have morphemes' do
|
125
|
+
before do
|
126
|
+
word = described_class.new
|
127
|
+
@inflection_type = word.inflection_type
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'returns nil' do
|
131
|
+
@inflection_type.should be_nil
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe Langue::Word, '#root_form' do
|
137
|
+
before do
|
138
|
+
word = described_class.new([
|
139
|
+
stub.tap { |s| s.stub!(:text).and_return('text1') },
|
140
|
+
stub.tap { |s| s.stub!(:text).and_return('text2') },
|
141
|
+
stub.tap { |s| s.stub!(:root_form).and_return('root_form3') }
|
142
|
+
])
|
143
|
+
|
144
|
+
@root_form = word.root_form
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'makes only the last of the text of the morphemes the root form, and returns a concatenated string' do
|
148
|
+
@root_form.should == 'text1text2root_form3'
|
149
|
+
end
|
150
|
+
|
151
|
+
context 'with have a morpheme' do
|
152
|
+
before do
|
153
|
+
word = described_class.new([
|
154
|
+
stub.tap { |s| s.stub!(:root_form).and_return('root_form1') }
|
155
|
+
])
|
156
|
+
|
157
|
+
@root_form = word.root_form
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'returns the root form text of the morpheme' do
|
161
|
+
@root_form.should == 'root_form1'
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'with do not have morphemes' do
|
166
|
+
before do
|
167
|
+
word = described_class.new
|
168
|
+
@root_form = word.root_form
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'returns nil' do
|
172
|
+
@root_form.should be_nil
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe Langue::Word, '#yomi' do
|
178
|
+
before do
|
179
|
+
word = described_class.new([
|
180
|
+
stub.tap { |s| s.stub!(:yomi).and_return('yomi1') },
|
181
|
+
stub.tap { |s| s.stub!(:yomi).and_return('yomi2') },
|
182
|
+
stub.tap { |s| s.stub!(:yomi).and_return('yomi3') }
|
183
|
+
])
|
184
|
+
|
185
|
+
@yomi = word.yomi
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'returns a concatenated string of the yomi of the morphemes' do
|
189
|
+
@yomi.should == 'yomi1yomi2yomi3'
|
190
|
+
end
|
191
|
+
|
192
|
+
context 'with have morpheme without a yomi' do
|
193
|
+
before do
|
194
|
+
word = described_class.new([
|
195
|
+
stub.tap { |s| s.stub!(:yomi).and_return('yomi1') },
|
196
|
+
stub.tap { |s| s.stub!(:yomi).and_return(nil) },
|
197
|
+
stub.tap { |s| s.stub!(:yomi).and_return('yomi3') }
|
198
|
+
])
|
199
|
+
|
200
|
+
@yomi = word.yomi
|
201
|
+
end
|
202
|
+
|
203
|
+
it 'returns nil' do
|
204
|
+
@yomi.should be_nil
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context 'with do not have morphemes' do
|
209
|
+
before do
|
210
|
+
word = described_class.new
|
211
|
+
@yomi = word.yomi
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'returns nil' do
|
215
|
+
@yomi.should be_nil
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
describe Langue::Word, '#pronunciation' do
|
221
|
+
before do
|
222
|
+
word = described_class.new([
|
223
|
+
stub.tap { |s| s.stub!(:pronunciation).and_return('pronunciation1') },
|
224
|
+
stub.tap { |s| s.stub!(:pronunciation).and_return('pronunciation2') },
|
225
|
+
stub.tap { |s| s.stub!(:pronunciation).and_return('pronunciation3') }
|
226
|
+
])
|
227
|
+
|
228
|
+
@pronunciation = word.pronunciation
|
229
|
+
end
|
230
|
+
|
231
|
+
it 'returns a concatenated string of the pronunciation of the morphemes' do
|
232
|
+
@pronunciation.should == 'pronunciation1pronunciation2pronunciation3'
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'with have morpheme without a pronunciation' do
|
236
|
+
before do
|
237
|
+
word = described_class.new([
|
238
|
+
stub.tap { |s| s.stub!(:pronunciation).and_return('pronunciation1') },
|
239
|
+
stub.tap { |s| s.stub!(:pronunciation).and_return(nil) },
|
240
|
+
stub.tap { |s| s.stub!(:pronunciation).and_return('pronunciation3') }
|
241
|
+
])
|
242
|
+
|
243
|
+
@pronunciation = word.pronunciation
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'returns nil' do
|
247
|
+
@pronunciation.should be_nil
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
context 'with do not have morphemes' do
|
252
|
+
before do
|
253
|
+
word = described_class.new
|
254
|
+
@pronunciation = word.pronunciation
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'returns nil' do
|
258
|
+
@pronunciation.should be_nil
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
data/spec/langue_spec.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'langue'
|
2
|
+
|
3
|
+
class LanguageExample < Langue::Language; end
|
4
|
+
class OtherLanguageExample < Langue::Language; end
|
5
|
+
|
6
|
+
describe Langue do
|
7
|
+
it 'is an instance of Module' do
|
8
|
+
described_class.should be_an_instance_of Module
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'has VERSION constant' do
|
12
|
+
described_class.should be_const_defined :VERSION
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Langue, '.languages' do
|
17
|
+
before do
|
18
|
+
@languages = described_class.languages
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns an instance of Array' do
|
22
|
+
@languages.should be_an Array
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'returns an empty array in default' do
|
26
|
+
@languages.should be_empty
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe Langue, '.support' do
|
31
|
+
before do
|
32
|
+
described_class.unsupport_all
|
33
|
+
described_class.support(LanguageExample)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'adds to the supported languages' do
|
37
|
+
language = described_class.languages.first
|
38
|
+
language.should == LanguageExample
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with already a supported language' do
|
42
|
+
it "raises #{described_class}::LanguageAlreadySupported" do
|
43
|
+
lambda { described_class.support(LanguageExample) }.should raise_error(Langue::LanguageAlreadySupported, /LanguageExample/)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe Langue, '.unsupport' do
|
49
|
+
before do
|
50
|
+
described_class.unsupport_all
|
51
|
+
described_class.support(LanguageExample)
|
52
|
+
described_class.unsupport(LanguageExample)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'removes from the supported languages' do
|
56
|
+
languages = described_class.languages
|
57
|
+
languages.should be_empty
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'with not a class' do
|
61
|
+
before do
|
62
|
+
described_class.unsupport_all
|
63
|
+
described_class.support(LanguageExample)
|
64
|
+
described_class.unsupport('language_example')
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'removes from the supported languages' do
|
68
|
+
languages = described_class.languages
|
69
|
+
languages.should be_empty
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'with an unsupported language' do
|
74
|
+
before do
|
75
|
+
described_class.unsupport_all
|
76
|
+
end
|
77
|
+
|
78
|
+
it "raises #{described_class}::LanguageUnsupported" do
|
79
|
+
lambda { described_class.unsupport(OtherLanguageExample) }.should raise_error(Langue::LanguageUnsupported, /OtherLanguageExample/)
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'with not a language class' do
|
83
|
+
it "raises #{described_class}::LanguageUnsupported" do
|
84
|
+
lambda { described_class.unsupport('other_language_example') }.should raise_error(Langue::LanguageUnsupported, /other_language_example/)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe Langue, '.unsupport_all' do
|
91
|
+
it 'removes all languages from the supported languages' do
|
92
|
+
described_class.support(LanguageExample)
|
93
|
+
described_class.support(OtherLanguageExample)
|
94
|
+
described_class.languages.should_not be_empty
|
95
|
+
described_class.unsupport_all
|
96
|
+
described_class.languages.should be_empty
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe Langue, '.language' do
|
101
|
+
before do
|
102
|
+
described_class.unsupport_all
|
103
|
+
described_class.support(LanguageExample)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'returns the language class' do
|
107
|
+
language = described_class.language('language_example')
|
108
|
+
language.should == LanguageExample
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'with an unsupported language' do
|
112
|
+
it "raises #{described_class}::LanguageUnsupported" do
|
113
|
+
lambda { described_class.language('other_language_example') }.should raise_error(Langue::LanguageUnsupported)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe Langue, '.[]' do
|
119
|
+
before do
|
120
|
+
described_class.unsupport_all
|
121
|
+
described_class.support(LanguageExample)
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'returns the language class' do
|
125
|
+
language = described_class['language_example']
|
126
|
+
language.should == LanguageExample
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'with an unsupported language' do
|
130
|
+
it "raises #{described_class}::LanguageUnsupported" do
|
131
|
+
lambda { described_class['other_language_example'] }.should raise_error(Langue::LanguageUnsupported)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: langue
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Takahiro Kondo
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-13 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
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'
|
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: It is the foundation to provide the operations to the natural languages.
|
47
|
+
email:
|
48
|
+
- kondo@atedesign.net
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- .gitignore
|
54
|
+
- Gemfile
|
55
|
+
- LICENSE
|
56
|
+
- README.md
|
57
|
+
- Rakefile
|
58
|
+
- langue.gemspec
|
59
|
+
- lib/langue.rb
|
60
|
+
- lib/langue/all.rb
|
61
|
+
- lib/langue/exceptions.rb
|
62
|
+
- lib/langue/language.rb
|
63
|
+
- lib/langue/morpheme.rb
|
64
|
+
- lib/langue/morphemes.rb
|
65
|
+
- lib/langue/sentence.rb
|
66
|
+
- lib/langue/text.rb
|
67
|
+
- lib/langue/version.rb
|
68
|
+
- lib/langue/word.rb
|
69
|
+
- spec/langue/language_spec.rb
|
70
|
+
- spec/langue/morpheme_spec.rb
|
71
|
+
- spec/langue/morphemes_spec.rb
|
72
|
+
- spec/langue/sentence_spec.rb
|
73
|
+
- spec/langue/text_spec.rb
|
74
|
+
- spec/langue/word_spec.rb
|
75
|
+
- spec/langue_spec.rb
|
76
|
+
homepage: ''
|
77
|
+
licenses: []
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements: []
|
95
|
+
rubyforge_project:
|
96
|
+
rubygems_version: 1.8.21
|
97
|
+
signing_key:
|
98
|
+
specification_version: 3
|
99
|
+
summary: The foundation for the natural languages
|
100
|
+
test_files: []
|
101
|
+
has_rdoc:
|