suika 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 41135bca7252d6e52d8c13c52ca08446ebe79ffe388f585a1739976e5b26ad4f
4
- data.tar.gz: 22e021383f5169c264392cf4e1c4cd185319f810d86c2c8e85000b80ac493ccd
3
+ metadata.gz: bfb2e78e15c648ee309868bdfd3f386a66b1cff633cb546880132cdb9b8f3806
4
+ data.tar.gz: d398f4de11a4af80b7c62c4e468fa2e3f9393bbb2211e0f2e317a08ed05c73b5
5
5
  SHA512:
6
- metadata.gz: 534e3c4c67612fcf0c052057dbb85b649cba037517c9c500c2a3e20e8f0cae97e734b71fcce7ff47ba1a55d4b99fd5fcdab0be26f14addddc3728c784d1e8966
7
- data.tar.gz: 8f929702297098e8c3439170323205e9c58f6f5f9735192604bd08566f4f20c8ae1d603185126636097846df45e45c6e7141380fea3e2b449bea3e6c73bd983d
6
+ metadata.gz: 6fea777a4229725a174aa0955bcf5f775cc6e319fa73cf6f204385b3a47d84997b74b8798f78269f442aa11dcf151b1319c079c315dfea103dcd7a148cf0b5c5
7
+ data.tar.gz: 17d2fd7f248c965b6d585542c4ec4cb90e87663f96b0522f06f1c3e94c55a18e59f08e4ab1e7724f9dd48a114c2c0f35a0499100fb8850a89d2822de87927988
@@ -3,7 +3,8 @@ require:
3
3
  - rubocop-rspec
4
4
 
5
5
  AllCops:
6
- TargetRubyVersion: 2.4
6
+ NewCops: enable
7
+ TargetRubyVersion: 2.5
7
8
  DisplayCopNames: true
8
9
  DisplayStyleGuide: true
9
10
  Exclude:
@@ -1,6 +1,12 @@
1
1
  ---
2
+ os: linux
3
+ dist: xenial
2
4
  language: ruby
3
5
  cache: bundler
4
6
  rvm:
5
- - 2.7.0
6
- before_install: gem install bundler -v 2.1.2
7
+ - '2.5'
8
+ - '2.6'
9
+ - '2.7'
10
+
11
+ before_install:
12
+ - gem install bundler -v 2.1.4
@@ -0,0 +1,37 @@
1
+ ## 0.2.0
2
+
3
+ ### Breaking Change
4
+ - Change to use dartsclone for trie library.
5
+
6
+
7
+ ## 0.1.4
8
+
9
+ ### Bug Fixes
10
+ - Fix CharDef.char_type to return 'DEFAULT' when unknown character code is given.
11
+
12
+ ### Features
13
+ - Add character code of square era name Reiwa.
14
+
15
+ ## 0.1.3
16
+
17
+ ### Bug Fixes
18
+ - Fix unknown word processing.
19
+
20
+ ### Changes
21
+ - Remove redundant spaces from output.
22
+
23
+
24
+ ## 0.1.2
25
+
26
+ ### Bug Fixes
27
+ - Fix local variable typo in Tagger.parse.
28
+
29
+
30
+ ## 0.1.1
31
+
32
+ ### Bug Fixes
33
+ - Fix specification of class in CharDef.char_type.
34
+
35
+
36
+ ## 0.1.0
37
+ - First release.
@@ -0,0 +1,36 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ suika (0.2.0)
5
+ dartsclone (>= 0.2.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ dartsclone (0.2.0)
11
+ diff-lcs (1.4.4)
12
+ rake (12.3.3)
13
+ rspec (3.9.0)
14
+ rspec-core (~> 3.9.0)
15
+ rspec-expectations (~> 3.9.0)
16
+ rspec-mocks (~> 3.9.0)
17
+ rspec-core (3.9.2)
18
+ rspec-support (~> 3.9.3)
19
+ rspec-expectations (3.9.2)
20
+ diff-lcs (>= 1.2.0, < 2.0)
21
+ rspec-support (~> 3.9.0)
22
+ rspec-mocks (3.9.1)
23
+ diff-lcs (>= 1.2.0, < 2.0)
24
+ rspec-support (~> 3.9.0)
25
+ rspec-support (3.9.3)
26
+
27
+ PLATFORMS
28
+ ruby
29
+
30
+ DEPENDENCIES
31
+ rake (~> 12.0)
32
+ rspec (~> 3.0)
33
+ suika!
34
+
35
+ BUNDLED WITH
36
+ 2.1.2
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # Suika
2
2
 
3
+ [![Build Status](https://travis-ci.org/yoshoku/suika.svg?branch=master)](https://travis-ci.org/yoshoku/suika)
3
4
  [![Gem Version](https://badge.fury.io/rb/suika.svg)](https://badge.fury.io/rb/suika)
4
5
  [![BSD 3-Clause License](https://img.shields.io/badge/License-BSD%203--Clause-orange.svg)](https://github.com/yoshoku/suika/blob/master/LICENSE.txt)
5
6
  [![Documentation](https://img.shields.io/badge/api-reference-blue.svg)](https://rubydoc.info/gems/suika)
@@ -30,13 +31,13 @@ require 'suika'
30
31
  tagger = Suika::Tagger.new
31
32
  tagger.parse('すもももももももものうち').each { |token| puts token }
32
33
 
33
- # すもも 名詞, 一般, *, *, *, *, すもも, スモモ, スモモ
34
- # も 助詞, 係助詞, *, *, *, *, も, モ, モ
35
- # もも 名詞, 一般, *, *, *, *, もも, モモ, モモ
36
- # も 助詞, 係助詞, *, *, *, *, も, モ, モ
37
- # もも 名詞, 一般, *, *, *, *, もも, モモ, モモ
38
- # の 助詞, 連体化, *, *, *, *, の, ノ, ノ
39
- # うち 名詞, 非自立, 副詞可能, *, *, *, うち, ウチ, ウチ
34
+ # すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
35
+ # も 助詞,係助詞,*,*,*,*,も,モ,モ
36
+ # もも 名詞,一般,*,*,*,*,もも,モモ,モモ
37
+ # も 助詞,係助詞,*,*,*,*,も,モ,モ
38
+ # もも 名詞,一般,*,*,*,*,もも,モモ,モモ
39
+ # の 助詞,連体化,*,*,*,*,の,ノ,ノ
40
+ # うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
40
41
  ```
41
42
 
42
43
  Since the Tagger class loads the binary dictionary at initialization, it is recommended to reuse the instance.
@@ -51,6 +52,25 @@ sentences.each do |sentence|
51
52
  end
52
53
  ```
53
54
 
55
+ ## Test
56
+ Suika was able to parse all sentences in the [Livedoor news corpus](https://www.rondhuit.com/download.html#ldcc)
57
+ without any error.
58
+
59
+ ```ruby
60
+ require 'suika'
61
+
62
+ tagger = Suika::Tagger.new
63
+
64
+ Dir.glob('ldcc-20140209/text/*/*.txt').each do |filename|
65
+ File.foreach(filename) do |sentence|
66
+ sentence.strip!
67
+ puts tagger.parse(sentence) unless sentence.empty?
68
+ end
69
+ end
70
+ ```
71
+
72
+ ![suika_test](https://user-images.githubusercontent.com/5562409/90264778-8f593f80-de8c-11ea-81f1-20831e3c8b12.gif)
73
+
54
74
  ## Contributing
55
75
 
56
76
  Bug reports and pull requests are welcome on GitHub at https://github.com/yoshoku/suika.
@@ -2,5 +2,6 @@
2
2
 
3
3
  require 'suika/version'
4
4
  require 'suika/char_def'
5
+ require 'suika/node'
5
6
  require 'suika/lattice'
6
7
  require 'suika/tagger'
@@ -5,10 +5,11 @@ module Suika
5
5
  class CharDef
6
6
  # @!visibility private
7
7
  def self.char_type(ch)
8
- code = ch.unpack1('U*')
9
- CHAR_TYPES.find do |ctype|
10
- Object.const_get("CharDef::#{ctype}").any? { |r| r.include?(code) }
8
+ ch_code = ch.unpack1('U*')
9
+ ch_type = CHAR_TYPES.find do |ct|
10
+ Object.const_get("::Suika::CharDef::#{ct}").any? { |r| r.include?(ch_code) }
11
11
  end
12
+ ch_type || 'DEFAULT'
12
13
  end
13
14
 
14
15
  # @!visibility private
@@ -16,39 +17,41 @@ module Suika
16
17
  CHAR_CATEGORY[char_type(ch)]
17
18
  end
18
19
 
20
+ MAX_GROUPING_SIZE = 24
21
+
19
22
  CHAR_CATEGORY = {
20
23
  'DEFAULT' => {
21
- invoke: 0, group: 1, length: 0
24
+ invoke: false, group: true, length: 0
22
25
  },
23
26
  'SPACE' => {
24
- invoke: 0, group: 1, length: 0
27
+ invoke: false, group: true, length: 0
25
28
  },
26
29
  'KANJI' => {
27
- invoke: 0, group: 0, length: 2
30
+ invoke: false, group: false, length: 2
28
31
  },
29
32
  'SYMBOL' => {
30
- invoke: 1, group: 1, length: 0
33
+ invoke: true, group: true, length: 0
31
34
  },
32
35
  'NUMERIC' => {
33
- invoke: 1, group: 1, length: 0
36
+ invoke: true, group: true, length: 0
34
37
  },
35
38
  'ALPHA' => {
36
- invoke: 1, group: 1, length: 0
39
+ invoke: true, group: true, length: 0
37
40
  },
38
41
  'HIRAGANA' => {
39
- invoke: 0, group: 1, length: 2
42
+ invoke: false, group: true, length: 2
40
43
  },
41
44
  'KATAKANA' => {
42
- invoke: 1, group: 1, length: 2
45
+ invoke: true, group: true, length: 2
43
46
  },
44
47
  'KANJINUMERIC' => {
45
- invoke: 1, group: 1, length: 0
48
+ invoke: true, group: true, length: 0
46
49
  },
47
50
  'GREEK' => {
48
- invoke: 1, group: 1, length: 0
51
+ invoke: true, group: true, length: 0
49
52
  },
50
53
  'CYRILLIC' => {
51
- invoke: 1, group: 1, length: 0
54
+ invoke: true, group: true, length: 0
52
55
  }
53
56
  }.freeze
54
57
 
@@ -117,6 +120,7 @@ module Suika
117
120
  0x2B00..0x2BFF, # Miscellaneous Symbols and Arrows
118
121
  0x2A00..0x2AFF, # Supplemental Mathematical Operators
119
122
  0x3300..0x33FF,
123
+ 0x32FF..0x32FF, # Square era name REIWA
120
124
  0x3200..0x32FE, # ENclosed CJK Letters and Months
121
125
  0x3000..0x303F, # CJK Symbol and Punctuation
122
126
  0xFE30..0xFE4F, # CJK Compatibility Forms
@@ -171,8 +175,6 @@ module Suika
171
175
  0xF900..0xFA2D,
172
176
  0xFA30..0xFA6A
173
177
  ].freeze
174
-
175
- # rubocop:disable Style/AsciiComments
176
178
  # KANJI-NUMERIC (一 二 三 四 五 六 七 八 九 十 百 千 万 億 兆)
177
179
  # 0x4E00 KANJINUMERIC KANJI
178
180
  KANJINUMERIC = [
@@ -192,7 +194,6 @@ module Suika
192
194
  0x5104..0x5104,
193
195
  0x5146..0x5146
194
196
  ].freeze
195
- # rubocop:enable Style/AsciiComments
196
197
 
197
198
  private_constant :CHAR_CATEGORY, :CHAR_TYPES
198
199
 
@@ -4,8 +4,6 @@ module Suika
4
4
  # @!visibility private
5
5
  class Lattice
6
6
  # @!visibility private
7
- Node = Struct.new(:surface, :min_cost, :min_prev, :left_id, :right_id, :cost, :attrs, keyword_init: true)
8
-
9
7
  attr_reader :begin_nodes, :end_nodes, :length
10
8
 
11
9
  # @!visibility private
@@ -13,17 +11,17 @@ module Suika
13
11
  @length = length
14
12
  @begin_nodes = Array.new(length + 1) { [] }
15
13
  @end_nodes = Array.new(length + 1) { [] }
16
- bos = Node.new(surface: 'BOS', left_id: 0, right_id: 0, cost: 0, attrs: [])
17
- @end_nodes[0].append(bos)
18
- eos = Node.new(surface: 'EOS', left_id: 0, right_id: 0, cost: 0, attrs: [])
19
- @begin_nodes[length].append(eos)
14
+ bos = Node.new(surface: 'BOS', unknown: false, left_id: 0, right_id: 0, cost: 0, attrs: [])
15
+ @end_nodes[0].push(bos)
16
+ eos = Node.new(surface: 'EOS', unknown: false, left_id: 0, right_id: 0, cost: 0, attrs: [])
17
+ @begin_nodes[length].push(eos)
20
18
  end
21
19
 
22
20
  # @!visibility private
23
- def insert(begin_id, end_id, surface, left_id, right_id, cost, attrs)
24
- node = Node.new(surface: surface, left_id: left_id, right_id: right_id, cost: cost, attrs: attrs)
25
- @begin_nodes[begin_id].append(node)
26
- @end_nodes[end_id].append(node)
21
+ def insert(begin_id, end_id, surface, unknown, left_id, right_id, cost, attrs)
22
+ node = Node.new(surface: surface, unknown: unknown, left_id: left_id, right_id: right_id, cost: cost, attrs: attrs)
23
+ @begin_nodes[begin_id].push(node)
24
+ @end_nodes[end_id].push(node)
27
25
  end
28
26
  end
29
27
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Suika
4
+ # @!visibility private
5
+ class Node
6
+ # @!visibility private
7
+ attr_accessor :surface, :unknown, :min_cost, :min_prev, :left_id, :right_id, :cost, :attrs
8
+
9
+ # @!visibility private
10
+ def initialize(surface: '', unknown: false, min_cost: 0, min_prev: nil, left_id: 0, right_id: 0, cost: 0, attrs: [])
11
+ @surface = surface
12
+ @unknown = unknown
13
+ @min_cost = min_cost
14
+ @min_prev = min_prev
15
+ @left_id = left_id
16
+ @right_id = right_id
17
+ @cost = cost
18
+ @attrs = attrs
19
+ end
20
+ end
21
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rambling-trie'
3
+ require 'dartsclone'
4
+ require 'rubygems/package'
4
5
  require 'zlib'
5
6
 
6
7
  module Suika
@@ -12,22 +13,22 @@ module Suika
12
13
  # tagger = Suika::Tagger.new
13
14
  # tagger.parse('すもももももももものうち').each { |token| puts token }
14
15
  #
15
- # # すもも 名詞, 一般, *, *, *, *, すもも, スモモ, スモモ
16
- # # も 助詞, 係助詞, *, *, *, *, も, モ, モ
17
- # # もも 名詞, 一般, *, *, *, *, もも, モモ, モモ
18
- # # も 助詞, 係助詞, *, *, *, *, も, モ, モ
19
- # # もも 名詞, 一般, *, *, *, *, もも, モモ, モモ
20
- # # の 助詞, 連体化, *, *, *, *, の, ノ, ノ
21
- # # うち 名詞, 非自立, 副詞可能, *, *, *, うち, ウチ, ウチ
16
+ # # すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
17
+ # # も 助詞,係助詞,*,*,*,*,も,モ,モ
18
+ # # もも 名詞,一般,*,*,*,*,もも,モモ,モモ
19
+ # # も 助詞,係助詞,*,*,*,*,も,モ,モ
20
+ # # もも 名詞,一般,*,*,*,*,もも,モモ,モモ
21
+ # # の 助詞,連体化,*,*,*,*,の,ノ,ノ
22
+ # # うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
22
23
  #
23
24
  class Tagger
24
25
  # Create a new tagger by loading the built-in binary dictionary.
25
26
  def initialize
26
- ipadic = Marshal.load(Zlib::GzipReader.open(__dir__ + '/../../dict/ipadic.gz', &:read))
27
- @trie = ipadic[:trie]
28
- @dictionary = ipadic[:dictionary]
29
- @unknown_dictionary = ipadic[:unknown_dictionary]
30
- @cost_mat = ipadic[:cost_matrix]
27
+ raise IOError, 'SHA1 digest of dictionary file does not match.' unless DICTIONARY_KEY == Digest::SHA1.file(DICTIONARY_PATH).to_s
28
+
29
+ @sysdic = Marshal.load(Zlib::GzipReader.open(DICTIONARY_PATH, &:read))
30
+ @trie = DartsClone::DoubleArray.new
31
+ @trie.set_array(@sysdic[:trie])
31
32
  end
32
33
 
33
34
  # Parse the given sentence.
@@ -39,44 +40,40 @@ module Suika
39
40
  terminal = sentence.length
40
41
 
41
42
  while start < terminal
42
- word = sentence[start]
43
- pos = start
44
- is_unknown = true
45
- while @trie.match?(word) && pos < terminal
46
- if @dictionary.key?(word)
47
- @dictionary[word].each do |el|
48
- lattice.insert(start, start + word.length,
49
- word, el[0].to_i, el[1].to_i, el[2].to_i,
50
- el[3..-1])
43
+ step = terminal - start
44
+
45
+ query = sentence[start..-1]
46
+ result = trie.common_prefix_search(query)
47
+ unless result.empty?
48
+ words, indices = result
49
+ words.each_with_index do |word, i|
50
+ features[indices[i]].each do |el|
51
+ lattice.insert(start, start + word.length, word, false,
52
+ el[0].to_i, el[1].to_i, el[2].to_i, el[3..-1])
51
53
  end
52
- is_unknown = false
53
54
  end
54
- pos += 1
55
- word = sentence[start..pos]
56
- end
57
-
58
- unless is_unknown
59
- start += 1
60
- next
55
+ step = words.map(&:size).min
61
56
  end
62
57
 
63
58
  word = sentence[start]
64
- char_type = CharDef.char_type(sentence[start])
65
59
  char_cate = CharDef.char_category(sentence[start])
66
- if char_cate[:group] == 1
67
- unk_terminal = char_cate[:length].zero? ? terminal : start + char_cate[:length]
60
+ char_type = CharDef.char_type(sentence[start])
61
+ if char_cate[:invoke]
62
+ char_length = char_cate[:group] ? CharDef::MAX_GROUPING_SIZE : char_cate[:length]
63
+ unk_terminal = [start + char_length, terminal].min
68
64
  pos = start + 1
69
- while pos < unk_terminal && char_type == CharDef.char_type(text[t])
70
- word << text[t]
65
+ while pos < unk_terminal && char_type == CharDef.char_type(sentence[pos])
66
+ word << sentence[pos]
71
67
  pos += 1
72
68
  end
73
69
  end
74
- @unknown_dictionary[char_type].each do |el|
75
- lattice.insert(start, start + word.length,
76
- word, el[0].to_i, el[1].to_i, el[2].to_i,
77
- el[3..-1])
70
+ unknowns[char_type].each do |el|
71
+ lattice.insert(start, start + word.length, word, true,
72
+ el[0].to_i, el[1].to_i, el[2].to_i, el[3..-1])
78
73
  end
79
- start += 1
74
+ step = [step, word.length].min
75
+
76
+ start += step
80
77
  end
81
78
 
82
79
  viterbi(lattice)
@@ -84,9 +81,25 @@ module Suika
84
81
 
85
82
  private
86
83
 
84
+ DICTIONARY_PATH = "#{__dir__}/../../dict/sysdic.gz"
85
+ DICTIONARY_KEY = '562e53853b8a5b9f4857536b0748847a0878ebf0'
87
86
  INT_MAX = 2**(([42].pack('i').size * 16) - 2) - 1
88
87
 
89
- private_constant :INT_MAX
88
+ private_constant :DICTIONARY_PATH, :DICTIONARY_KEY, :INT_MAX
89
+
90
+ attr_reader :trie
91
+
92
+ def features
93
+ @sysdic[:dictionary]
94
+ end
95
+
96
+ def unknowns
97
+ @sysdic[:unknown_dictionary]
98
+ end
99
+
100
+ def costmat
101
+ @sysdic[:cost_matrix]
102
+ end
90
103
 
91
104
  def viterbi(lattice)
92
105
  bos = lattice.end_nodes[0].first
@@ -98,7 +111,7 @@ module Suika
98
111
  rnode.min_cost = INT_MAX
99
112
  rnode.min_prev = nil
100
113
  lattice.end_nodes[n].each do |lnode|
101
- cost = lnode.min_cost + @cost_mat[lnode.right_id][rnode.left_id] + rnode.cost
114
+ cost = lnode.min_cost + costmat[lnode.right_id][rnode.left_id] + rnode.cost
102
115
  if cost < rnode.min_cost
103
116
  rnode.min_cost = cost
104
117
  rnode.min_prev = lnode
@@ -111,9 +124,10 @@ module Suika
111
124
  prev_node = eos.min_prev
112
125
  res = []
113
126
  until prev_node.nil?
114
- res.append("#{prev_node.surface}\t#{prev_node.attrs.join(', ')}") if prev_node.surface != 'BOS' && prev_node.surface != 'EOS'
127
+ res.push("#{prev_node.surface}\t#{prev_node.attrs.join(',')}") if prev_node.surface != 'BOS' && prev_node.surface != 'EOS'
115
128
  prev_node = prev_node.min_prev
116
129
  end
130
+
117
131
  res.reverse
118
132
  end
119
133
  end
@@ -3,5 +3,5 @@
3
3
  # Suika is a Japanese morphological analyzer written in pure Ruby.
4
4
  module Suika
5
5
  # The version of Suika you are using.
6
- VERSION = '0.1.0'
6
+ VERSION = '0.2.0'
7
7
  end
@@ -12,11 +12,10 @@ Gem::Specification.new do |spec|
12
12
  spec.description = 'Suika is a Japanese morphological analyzer written in pure Ruby.'
13
13
  spec.homepage = 'https://github.com/yoshoku/suika'
14
14
  spec.license = 'BSD-3-Clause'
15
- spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
16
15
 
17
16
  spec.metadata['homepage_uri'] = spec.homepage
18
17
  spec.metadata['source_code_uri'] = spec.homepage
19
- spec.metadata['changelog_uri'] = 'https://github.com/yoshoku/magro/blob/master/CHANGELOG.md'
18
+ spec.metadata['changelog_uri'] = 'https://github.com/yoshoku/suika/blob/master/CHANGELOG.md'
20
19
  spec.metadata['documentation_uri'] = 'https://rubydoc.info/gems/suika'
21
20
 
22
21
  # Specify which files should be added to the gem when it is released.
@@ -28,5 +27,5 @@ Gem::Specification.new do |spec|
28
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
28
  spec.require_paths = ['lib']
30
29
 
31
- spec.add_runtime_dependency 'rambling-trie', '~> 2.1'
30
+ spec.add_runtime_dependency 'dartsclone', '>= 0.2.0'
32
31
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: suika
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yoshoku
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-04 00:00:00.000000000 Z
11
+ date: 2020-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rambling-trie
14
+ name: dartsclone
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.1'
19
+ version: 0.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '2.1'
26
+ version: 0.2.0
27
27
  description: Suika is a Japanese morphological analyzer written in pure Ruby.
28
28
  email:
29
29
  - yoshoku@outlook.com
@@ -35,18 +35,21 @@ files:
35
35
  - ".rspec"
36
36
  - ".rubocop.yml"
37
37
  - ".travis.yml"
38
+ - CHANGELOG.md
38
39
  - CODE_OF_CONDUCT.md
39
40
  - Gemfile
41
+ - Gemfile.lock
40
42
  - LICENSE.txt
41
43
  - NOTICE.txt
42
44
  - README.md
43
45
  - Rakefile
44
46
  - bin/console
45
47
  - bin/setup
46
- - dict/ipadic.gz
48
+ - dict/sysdic.gz
47
49
  - lib/suika.rb
48
50
  - lib/suika/char_def.rb
49
51
  - lib/suika/lattice.rb
52
+ - lib/suika/node.rb
50
53
  - lib/suika/tagger.rb
51
54
  - lib/suika/version.rb
52
55
  - suika.gemspec
@@ -56,7 +59,7 @@ licenses:
56
59
  metadata:
57
60
  homepage_uri: https://github.com/yoshoku/suika
58
61
  source_code_uri: https://github.com/yoshoku/suika
59
- changelog_uri: https://github.com/yoshoku/magro/blob/master/CHANGELOG.md
62
+ changelog_uri: https://github.com/yoshoku/suika/blob/master/CHANGELOG.md
60
63
  documentation_uri: https://rubydoc.info/gems/suika
61
64
  post_install_message:
62
65
  rdoc_options: []
@@ -66,7 +69,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
66
69
  requirements:
67
70
  - - ">="
68
71
  - !ruby/object:Gem::Version
69
- version: 2.3.0
72
+ version: '0'
70
73
  required_rubygems_version: !ruby/object:Gem::Requirement
71
74
  requirements:
72
75
  - - ">="