langue 0.0.2
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/.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:
|