fasttext 0.1.3 → 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: fb6649e0a3992c6e12572d672e8ba768220662efc37b982c278a8d0713716029
4
- data.tar.gz: 12a0441cf1030bfbfe99d26824fe757d5b83c2f47de899fecf13a73aa657bd76
3
+ metadata.gz: 1bb25234ba16e6af2a30087522d498984a933274d24719be58cd348f6f456c11
4
+ data.tar.gz: 2ec68073ce633dae21077be74264f686153abff5431d850c5cf87aa26304b299
5
5
  SHA512:
6
- metadata.gz: dadcbc9a0d39468b4d1070cbf74abece85e687fe2d5de9dfb03c8e79f630b47a0ce37bf73f1383bccf917190bf4f1a2acb12e4741b4aaf45d0c688991baf7893
7
- data.tar.gz: b9615f2edf557b7a2bb9c90457581489dd86be7539e7f4e9b75ee72cb3fe26ca9a216c5ecda4ff6e82ef348fbcc0482cd4e727e9c6652f2b38195ad3edba1752
6
+ metadata.gz: '058233f6d6dcfc698b4e00f940d927962c28bef1aa51048ffdfb969accadcaf0616fbc3353c56c35e6609f1324c5d2ba469c4ba242b8a87daf60fd2b1fa7a35b'
7
+ data.tar.gz: e2bf6042ddc218398584b399acdde2ad89ece74e3009ac5348981e4ce958057233b10b5a5a504cb2e316c4a03fb4595fea524e3af0f30d787a1fb689885f6d5d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.2.0 (2021-05-17)
2
+
3
+ - Updated to Rice 4
4
+ - Dropped support for Ruby < 2.6
5
+
1
6
  ## 0.1.3 (2020-04-28)
2
7
 
3
8
  - Updated fastText to 0.9.2
data/LICENSE.txt CHANGED
@@ -1,22 +1,22 @@
1
- Copyright (c) 2019-2020 Andrew Kane
2
-
3
1
  MIT License
4
2
 
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:
3
+ Copyright (c) 2016-present, Facebook, Inc.
4
+ Copyright (c) 2019-2021 Andrew Kane
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
12
 
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
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.
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [fastText](https://fasttext.cc) - efficient text classification and representation learning - for Ruby
4
4
 
5
- [![Build Status](https://travis-ci.org/ankane/fasttext.svg?branch=master)](https://travis-ci.org/ankane/fasttext) [![Build status](https://ci.appveyor.com/api/projects/status/67yby3w6mth766y9/branch/master?svg=true)](https://ci.appveyor.com/project/ankane/fasttext/branch/master)
5
+ [![Build Status](https://github.com/ankane/fastText/workflows/build/badge.svg?branch=master)](https://github.com/ankane/fastText/actions)
6
6
 
7
7
  ## Installation
8
8
 
@@ -127,6 +127,12 @@ Get a word vector
127
127
  model.word_vector("carrot")
128
128
  ```
129
129
 
130
+ Get a sentence vector
131
+
132
+ ```ruby
133
+ model.sentence_vector("sentence text")
134
+ ```
135
+
130
136
  Get words
131
137
 
132
138
  ```ruby
@@ -172,7 +178,7 @@ FastText::Classifier.new(
172
178
  thread: 3, # number of threads
173
179
  lr_update_rate: 100, # change the rate of updates for the learning rate
174
180
  t: 0.0001, # sampling threshold
175
- label_prefix: "__label__" # label prefix
181
+ label_prefix: "__label__", # label prefix
176
182
  verbose: 2, # verbose
177
183
  pretrained_vectors: nil, # pretrained word vectors (.vec file)
178
184
  autotune_metric: "f1", # autotune optimization metric
@@ -232,7 +238,7 @@ __label__spam text from document three
232
238
 
233
239
  ## Pretrained Models
234
240
 
235
- There are a number of [pretrained models](https://fasttext.cc/docs/en/english-vectors.html) you can download
241
+ There are a number of [pretrained models](https://fasttext.cc/docs/en/supervised-models.html) you can download
236
242
 
237
243
  ### Language Identification
238
244
 
@@ -248,15 +254,6 @@ Get language predictions
248
254
  model.predict("bon appétit")
249
255
  ```
250
256
 
251
- ## rbenv
252
-
253
- This library uses [Rice](https://github.com/jasonroelofs/rice) to interface with the fastText C++ library. Rice and earlier versions of rbenv don’t play nicely together. If you encounter an error during installation, upgrade ruby-build and reinstall your Ruby version.
254
-
255
- ```sh
256
- brew upgrade ruby-build
257
- rbenv install [version]
258
- ```
259
-
260
257
  ## History
261
258
 
262
259
  View the [changelog](https://github.com/ankane/fasttext/blob/master/CHANGELOG.md)
@@ -273,7 +270,7 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
273
270
  To get started with development:
274
271
 
275
272
  ```sh
276
- git clone https://github.com/ankane/fastText.git
273
+ git clone --recursive https://github.com/ankane/fastText.git
277
274
  cd fastText
278
275
  bundle install
279
276
  bundle exec rake compile
data/ext/fasttext/ext.cpp CHANGED
@@ -13,10 +13,8 @@
13
13
  #include <vector.h>
14
14
 
15
15
  // rice
16
- #include <rice/Array.hpp>
17
- #include <rice/Constructor.hpp>
18
- #include <rice/Data_Type.hpp>
19
- #include <rice/Hash.hpp>
16
+ #include <rice/rice.hpp>
17
+ #include <rice/stl.hpp>
20
18
 
21
19
  using fasttext::FastText;
22
20
 
@@ -29,18 +27,24 @@ using Rice::define_class_under;
29
27
  using Rice::define_module;
30
28
  using Rice::define_module_under;
31
29
 
32
- template<>
33
- inline
34
- Object to_ruby<std::vector<std::pair<fasttext::real, std::string>>>(std::vector<std::pair<fasttext::real, std::string>> const & x)
30
+ namespace Rice::detail
35
31
  {
36
- Array ret;
37
- for (const auto& v : x) {
38
- Array a;
39
- a.push(v.first);
40
- a.push(v.second);
41
- ret.push(a);
42
- }
43
- return ret;
32
+ template<>
33
+ class To_Ruby<std::vector<std::pair<fasttext::real, std::string>>>
34
+ {
35
+ public:
36
+ VALUE convert(std::vector<std::pair<fasttext::real, std::string>> const & x)
37
+ {
38
+ Array ret;
39
+ for (const auto& v : x) {
40
+ Array a;
41
+ a.push(v.first);
42
+ a.push(v.second);
43
+ ret.push(a);
44
+ }
45
+ return ret;
46
+ }
47
+ };
44
48
  }
45
49
 
46
50
  fasttext::Args buildArgs(Hash h) {
@@ -52,33 +56,33 @@ fasttext::Args buildArgs(Hash h) {
52
56
 
53
57
  for(; it != end; ++it)
54
58
  {
55
- std::string name = from_ruby<std::string>(it->key.to_s());
56
- Object value = it->value;
59
+ std::string name = it->key.to_s().str();
60
+ VALUE value = (it->value).value();
57
61
 
58
62
  if (name == "input") {
59
- a.input = from_ruby<std::string>(value);
63
+ a.input = Rice::detail::From_Ruby<std::string>().convert(value);
60
64
  } else if (name == "output") {
61
- a.output = from_ruby<std::string>(value);
65
+ a.output = Rice::detail::From_Ruby<std::string>().convert(value);
62
66
  } else if (name == "lr") {
63
- a.lr = from_ruby<double>(value);
67
+ a.lr = Rice::detail::From_Ruby<double>().convert(value);
64
68
  } else if (name == "lr_update_rate") {
65
- a.lrUpdateRate = from_ruby<int>(value);
69
+ a.lrUpdateRate = Rice::detail::From_Ruby<int>().convert(value);
66
70
  } else if (name == "dim") {
67
- a.dim = from_ruby<int>(value);
71
+ a.dim = Rice::detail::From_Ruby<int>().convert(value);
68
72
  } else if (name == "ws") {
69
- a.ws = from_ruby<int>(value);
73
+ a.ws = Rice::detail::From_Ruby<int>().convert(value);
70
74
  } else if (name == "epoch") {
71
- a.epoch = from_ruby<int>(value);
75
+ a.epoch = Rice::detail::From_Ruby<int>().convert(value);
72
76
  } else if (name == "min_count") {
73
- a.minCount = from_ruby<int>(value);
77
+ a.minCount = Rice::detail::From_Ruby<int>().convert(value);
74
78
  } else if (name == "min_count_label") {
75
- a.minCountLabel = from_ruby<int>(value);
79
+ a.minCountLabel = Rice::detail::From_Ruby<int>().convert(value);
76
80
  } else if (name == "neg") {
77
- a.neg = from_ruby<int>(value);
81
+ a.neg = Rice::detail::From_Ruby<int>().convert(value);
78
82
  } else if (name == "word_ngrams") {
79
- a.wordNgrams = from_ruby<int>(value);
83
+ a.wordNgrams = Rice::detail::From_Ruby<int>().convert(value);
80
84
  } else if (name == "loss") {
81
- std::string str = from_ruby<std::string>(value);
85
+ std::string str = Rice::detail::From_Ruby<std::string>().convert(value);
82
86
  if (str == "softmax") {
83
87
  a.loss = fasttext::loss_name::softmax;
84
88
  } else if (str == "ns") {
@@ -91,7 +95,7 @@ fasttext::Args buildArgs(Hash h) {
91
95
  throw std::invalid_argument("Unknown loss: " + str);
92
96
  }
93
97
  } else if (name == "model") {
94
- std::string str = from_ruby<std::string>(value);
98
+ std::string str = Rice::detail::From_Ruby<std::string>().convert(value);
95
99
  if (str == "supervised") {
96
100
  a.model = fasttext::model_name::sup;
97
101
  } else if (str == "skipgram") {
@@ -102,35 +106,35 @@ fasttext::Args buildArgs(Hash h) {
102
106
  throw std::invalid_argument("Unknown model: " + str);
103
107
  }
104
108
  } else if (name == "bucket") {
105
- a.bucket = from_ruby<int>(value);
109
+ a.bucket = Rice::detail::From_Ruby<int>().convert(value);
106
110
  } else if (name == "minn") {
107
- a.minn = from_ruby<int>(value);
111
+ a.minn = Rice::detail::From_Ruby<int>().convert(value);
108
112
  } else if (name == "maxn") {
109
- a.maxn = from_ruby<int>(value);
113
+ a.maxn = Rice::detail::From_Ruby<int>().convert(value);
110
114
  } else if (name == "thread") {
111
- a.thread = from_ruby<int>(value);
115
+ a.thread = Rice::detail::From_Ruby<int>().convert(value);
112
116
  } else if (name == "t") {
113
- a.t = from_ruby<double>(value);
117
+ a.t = Rice::detail::From_Ruby<double>().convert(value);
114
118
  } else if (name == "label_prefix") {
115
- a.label = from_ruby<std::string>(value);
119
+ a.label = Rice::detail::From_Ruby<std::string>().convert(value);
116
120
  } else if (name == "verbose") {
117
- a.verbose = from_ruby<int>(value);
121
+ a.verbose = Rice::detail::From_Ruby<int>().convert(value);
118
122
  } else if (name == "pretrained_vectors") {
119
- a.pretrainedVectors = from_ruby<std::string>(value);
123
+ a.pretrainedVectors = Rice::detail::From_Ruby<std::string>().convert(value);
120
124
  } else if (name == "save_output") {
121
- a.saveOutput = from_ruby<bool>(value);
125
+ a.saveOutput = Rice::detail::From_Ruby<bool>().convert(value);
122
126
  } else if (name == "seed") {
123
- a.seed = from_ruby<int>(value);
127
+ a.seed = Rice::detail::From_Ruby<int>().convert(value);
124
128
  } else if (name == "autotune_validation_file") {
125
- a.autotuneValidationFile = from_ruby<std::string>(value);
129
+ a.autotuneValidationFile = Rice::detail::From_Ruby<std::string>().convert(value);
126
130
  } else if (name == "autotune_metric") {
127
- a.autotuneMetric = from_ruby<std::string>(value);
131
+ a.autotuneMetric = Rice::detail::From_Ruby<std::string>().convert(value);
128
132
  } else if (name == "autotune_predictions") {
129
- a.autotunePredictions = from_ruby<int>(value);
133
+ a.autotunePredictions = Rice::detail::From_Ruby<int>().convert(value);
130
134
  } else if (name == "autotune_duration") {
131
- a.autotuneDuration = from_ruby<int>(value);
135
+ a.autotuneDuration = Rice::detail::From_Ruby<int>().convert(value);
132
136
  } else if (name == "autotune_model_size") {
133
- a.autotuneModelSize = from_ruby<std::string>(value);
137
+ a.autotuneModelSize = Rice::detail::From_Ruby<std::string>().convert(value);
134
138
  } else {
135
139
  throw std::invalid_argument("Unknown argument: " + name);
136
140
  }
@@ -148,7 +152,7 @@ void Init_ext()
148
152
  .define_constructor(Constructor<FastText>())
149
153
  .define_method(
150
154
  "words",
151
- *[](FastText& m) {
155
+ [](FastText& m) {
152
156
  std::shared_ptr<const fasttext::Dictionary> d = m.getDictionary();
153
157
  std::vector<int64_t> freq = d->getCounts(fasttext::entry_type::word);
154
158
 
@@ -166,7 +170,7 @@ void Init_ext()
166
170
  })
167
171
  .define_method(
168
172
  "labels",
169
- *[](FastText& m) {
173
+ [](FastText& m) {
170
174
  std::shared_ptr<const fasttext::Dictionary> d = m.getDictionary();
171
175
  std::vector<int64_t> freq = d->getCounts(fasttext::entry_type::label);
172
176
 
@@ -184,7 +188,7 @@ void Init_ext()
184
188
  })
185
189
  .define_method(
186
190
  "test",
187
- *[](FastText& m, const std::string filename, int32_t k) {
191
+ [](FastText& m, const std::string& filename, int32_t k) {
188
192
  std::ifstream ifs(filename);
189
193
  if (!ifs.is_open()) {
190
194
  throw std::invalid_argument("Test file cannot be opened!");
@@ -201,17 +205,21 @@ void Init_ext()
201
205
  })
202
206
  .define_method(
203
207
  "load_model",
204
- *[](FastText& m, std::string s) { m.loadModel(s); })
208
+ [](FastText& m, const std::string& s) {
209
+ m.loadModel(s);
210
+ })
205
211
  .define_method(
206
212
  "save_model",
207
- *[](FastText& m, std::string s) { m.saveModel(s); })
213
+ [](FastText& m, const std::string& s) {
214
+ m.saveModel(s);
215
+ })
208
216
  .define_method("dimension", &FastText::getDimension)
209
217
  .define_method("quantized?", &FastText::isQuant)
210
218
  .define_method("word_id", &FastText::getWordId)
211
219
  .define_method("subword_id", &FastText::getSubwordId)
212
220
  .define_method(
213
221
  "predict",
214
- *[](FastText& m, const std::string text, int32_t k, float threshold) {
222
+ [](FastText& m, const std::string& text, int32_t k, float threshold) {
215
223
  std::stringstream ioss(text);
216
224
  std::vector<std::pair<fasttext::real, std::string>> predictions;
217
225
  m.predictLine(ioss, predictions, k, threshold);
@@ -219,14 +227,14 @@ void Init_ext()
219
227
  })
220
228
  .define_method(
221
229
  "nearest_neighbors",
222
- *[](FastText& m, const std::string& word, int32_t k) {
230
+ [](FastText& m, const std::string& word, int32_t k) {
223
231
  return m.getNN(word, k);
224
232
  })
225
233
  .define_method("analogies", &FastText::getAnalogies)
226
- .define_method("ngram_vectors", &FastText::getNgramVectors)
234
+ // .define_method("ngram_vectors", &FastText::getNgramVectors)
227
235
  .define_method(
228
236
  "word_vector",
229
- *[](FastText& m, const std::string word) {
237
+ [](FastText& m, const std::string& word) {
230
238
  int dimension = m.getDimension();
231
239
  fasttext::Vector vec = fasttext::Vector(dimension);
232
240
  m.getWordVector(vec, word);
@@ -239,7 +247,7 @@ void Init_ext()
239
247
  })
240
248
  .define_method(
241
249
  "subwords",
242
- *[](FastText& m, const std::string word) {
250
+ [](FastText& m, const std::string& word) {
243
251
  std::vector<std::string> subwords;
244
252
  std::vector<int32_t> ngrams;
245
253
  std::shared_ptr<const fasttext::Dictionary> d = m.getDictionary();
@@ -253,7 +261,7 @@ void Init_ext()
253
261
  })
254
262
  .define_method(
255
263
  "sentence_vector",
256
- *[](FastText& m, const std::string text) {
264
+ [](FastText& m, const std::string& text) {
257
265
  std::istringstream in(text);
258
266
  int dimension = m.getDimension();
259
267
  fasttext::Vector vec = fasttext::Vector(dimension);
@@ -267,7 +275,7 @@ void Init_ext()
267
275
  })
268
276
  .define_method(
269
277
  "train",
270
- *[](FastText& m, Hash h) {
278
+ [](FastText& m, Hash h) {
271
279
  auto a = buildArgs(h);
272
280
  if (a.hasAutotune()) {
273
281
  fasttext::Autotune autotune(std::shared_ptr<fasttext::FastText>(&m, [](fasttext::FastText*) {}));
@@ -278,17 +286,17 @@ void Init_ext()
278
286
  })
279
287
  .define_method(
280
288
  "quantize",
281
- *[](FastText& m, Hash h) {
289
+ [](FastText& m, Hash h) {
282
290
  m.quantize(buildArgs(h));
283
291
  })
284
292
  .define_method(
285
293
  "supervised?",
286
- *[](FastText& m) {
294
+ [](FastText& m) {
287
295
  return m.getArgs().model == fasttext::model_name::sup;
288
296
  })
289
297
  .define_method(
290
298
  "label_prefix",
291
- *[](FastText& m) {
299
+ [](FastText& m) {
292
300
  return m.getArgs().label;
293
301
  });
294
302
  }
@@ -1,8 +1,7 @@
1
1
  require "mkmf-rice"
2
2
 
3
- # TODO use -std=c++14 when available
4
3
  # -pthread and -O3 set by default
5
- $CXXFLAGS << " -std=c++11 -funroll-loops " << with_config("optflags", "-march=native")
4
+ $CXXFLAGS << " -std=c++17 -funroll-loops " << with_config("optflags", "-march=native")
6
5
 
7
6
  ext = File.expand_path(".", __dir__)
8
7
  fasttext = File.expand_path("../../vendor/fastText/src", __dir__)
@@ -1,3 +1,3 @@
1
1
  module FastText
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fasttext
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-28 00:00:00.000000000 Z
11
+ date: 2021-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice
@@ -16,72 +16,16 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.2'
19
+ version: 4.0.2
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.2'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rake-compiler
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: minitest
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '5'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '5'
83
- description:
84
- email: andrew@chartkick.com
26
+ version: 4.0.2
27
+ description:
28
+ email: andrew@ankane.org
85
29
  executables: []
86
30
  extensions:
87
31
  - ext/fasttext/extconf.rb
@@ -131,7 +75,7 @@ homepage: https://github.com/ankane/fastText
131
75
  licenses:
132
76
  - MIT
133
77
  metadata: {}
134
- post_install_message:
78
+ post_install_message:
135
79
  rdoc_options: []
136
80
  require_paths:
137
81
  - lib
@@ -139,15 +83,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
83
  requirements:
140
84
  - - ">="
141
85
  - !ruby/object:Gem::Version
142
- version: '2.4'
86
+ version: '2.6'
143
87
  required_rubygems_version: !ruby/object:Gem::Requirement
144
88
  requirements:
145
89
  - - ">="
146
90
  - !ruby/object:Gem::Version
147
91
  version: '0'
148
92
  requirements: []
149
- rubygems_version: 3.1.2
150
- signing_key:
93
+ rubygems_version: 3.2.3
94
+ signing_key:
151
95
  specification_version: 4
152
96
  summary: fastText - efficient text classification and representation learning - for
153
97
  Ruby