From f16e4633fc07f2c0f24b7c5b751fb991b940c3fa Mon Sep 17 00:00:00 2001 From: borissmidt Date: Mon, 7 Aug 2017 09:57:15 +0200 Subject: [PATCH 01/38] added a convinience function that returns an array instead of a list which is usefull for interop with other libraries like deeplearning4j --- src/main/java/com/github/jfasttext/JFastText.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/github/jfasttext/JFastText.java b/src/main/java/com/github/jfasttext/JFastText.java index aaca009..69b6dd6 100644 --- a/src/main/java/com/github/jfasttext/JFastText.java +++ b/src/main/java/com/github/jfasttext/JFastText.java @@ -92,6 +92,15 @@ public List getVector(String word) { return wordVec; } + public float[] getArrayVector(String word) { + FastTextWrapper.RealVector rv = fta.getVector(word); + float[] wordVec = new float[(int)rv.size()]; + for (int i = 0; i < rv.size(); i++) { + wordVec[i] = rv.get(i); + } + return wordVec; + } + public int getNWords() { return fta.getNWords(); } From c576b1f7ceb549c7b97e4404ab9f91d8c281a95b Mon Sep 17 00:00:00 2001 From: bxshi Date: Tue, 22 Jan 2019 21:14:53 -0800 Subject: [PATCH 02/38] add Java binding for getSentenceVector --- src/main/cpp/fasttext_wrapper.cc | 9 ++++++++- src/main/cpp/fasttext_wrapper.h | 1 + .../com/github/jfasttext/FastTextWrapper.java | 2 ++ .../java/com/github/jfasttext/JFastText.java | 12 ++++++++++++ .../com/github/jfasttext/JFastTextTest.java | 17 ++++++++++++++--- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/main/cpp/fasttext_wrapper.cc b/src/main/cpp/fasttext_wrapper.cc index ec5c90e..58ef344 100644 --- a/src/main/cpp/fasttext_wrapper.cc +++ b/src/main/cpp/fasttext_wrapper.cc @@ -80,7 +80,14 @@ namespace FastTextWrapper { std::vector FastTextApi::getVector(const std::string& word) { Vector vec(privateMembers->args_->dim); - fastText.getVector(vec, word); + fastText.getWordVector(vec, word); + return std::vector(vec.data(), vec.data() + vec.size()); + } + + std::vector FastTextApi::getSentenceVector(const std::string& sentence) { + Vector vec(privateMembers->args_->dim); + std::istringstream in(sentence); + fastText.getSentenceVector(in, vec); return std::vector(vec.data(), vec.data() + vec.size()); } diff --git a/src/main/cpp/fasttext_wrapper.h b/src/main/cpp/fasttext_wrapper.h index 10562ef..68758ec 100644 --- a/src/main/cpp/fasttext_wrapper.h +++ b/src/main/cpp/fasttext_wrapper.h @@ -29,6 +29,7 @@ namespace FastTextWrapper { std::vector predict(const std::string&, int32_t); std::vector> predictProba(const std::string&, int32_t); std::vector getVector(const std::string&); + std::vector getSentenceVector(const std::string&); std::vector getWords(); std::vector getLabels(); std::string getWord(int32_t); diff --git a/src/main/java/com/github/jfasttext/FastTextWrapper.java b/src/main/java/com/github/jfasttext/FastTextWrapper.java index c583d03..023b19a 100644 --- a/src/main/java/com/github/jfasttext/FastTextWrapper.java +++ b/src/main/java/com/github/jfasttext/FastTextWrapper.java @@ -201,6 +201,8 @@ public DoubleIntPair put(float firstValue, int secondValue) { public native @ByVal FloatStringPairVector predictProba(@StdString String arg0, int arg1); public native @ByVal RealVector getVector(@StdString BytePointer arg0); public native @ByVal RealVector getVector(@StdString String arg0); + public native @ByVal RealVector getSentenceVector(@StdString BytePointer arg0); + public native @ByVal RealVector getSentenceVector(@StdString String arg0); public native @ByVal StringVector getWords(); public native @ByVal StringVector getLabels(); public native @StdString BytePointer getWord(int arg0); diff --git a/src/main/java/com/github/jfasttext/JFastText.java b/src/main/java/com/github/jfasttext/JFastText.java index 1f2d333..c7ce7d1 100644 --- a/src/main/java/com/github/jfasttext/JFastText.java +++ b/src/main/java/com/github/jfasttext/JFastText.java @@ -93,6 +93,18 @@ public List getVector(String word) { return wordVec; } + public List getSentenceVector(String sentence) { + if (!sentence.endsWith("\n")) { + sentence += "\n"; + } + FastTextWrapper.RealVector rv = fta.getSentenceVector(sentence); + List wordVec = new ArrayList<>(); + for (int i = 0; i < rv.size(); i++) { + wordVec.add(rv.get(i)); + } + return wordVec; + } + public int getNWords() { return fta.getNWords(); } diff --git a/src/test/java/com/github/jfasttext/JFastTextTest.java b/src/test/java/com/github/jfasttext/JFastTextTest.java index b6f1521..d7eb3c5 100644 --- a/src/test/java/com/github/jfasttext/JFastTextTest.java +++ b/src/test/java/com/github/jfasttext/JFastTextTest.java @@ -16,7 +16,9 @@ public void test01TrainSupervisedCmd() { jft.runCmd(new String[] { "supervised", "-input", "src/test/resources/data/labeled_data.txt", - "-output", "src/test/resources/models/supervised.model" + "-output", "src/test/resources/models/supervised.model", + "-wordNgrams", "3", + "-bucket", "100" }); } @@ -86,11 +88,20 @@ public void test07GetVector() throws Exception { System.out.printf("\nWord embedding vector of '%s': %s\n", word, vec); } + @Test + public void test08GetSentenceVector() throws Exception { + JFastText jft = new JFastText(); + jft.loadModel("src/test/resources/models/supervised.model.bin"); + String word = "soccers"; + List vec = jft.getSentenceVector(word); + System.out.printf("\nSentence embedding vector of '%s': %s\n", word, vec); + } + /** * Test retrieving model's information: words, labels, learning rate, etc. */ @Test - public void test08ModelInfo() throws Exception { + public void test09ModelInfo() throws Exception { System.out.printf("\nSupervised model information:\n"); JFastText jft = new JFastText(); jft.loadModel("src/test/resources/models/supervised.model.bin"); @@ -113,7 +124,7 @@ public void test08ModelInfo() throws Exception { * allocated by native function calls). */ @Test - public void test09ModelUnloading() throws Exception { + public void test10ModelUnloading() throws Exception { JFastText jft = new JFastText(); System.out.println("\nLoading model ..."); jft.loadModel("src/test/resources/models/supervised.model.bin"); From e6af0a0cf8101c73ec52a077f7749928e68cfd8e Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Wed, 12 Sep 2018 15:16:49 +0200 Subject: [PATCH 03/38] Set fastText submodule to v0.2.0. --- src/main/cpp/fastText | 2 +- src/main/cpp/fasttext_wrapper.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/cpp/fastText b/src/main/cpp/fastText index 9c9b9b2..7842495 160000 --- a/src/main/cpp/fastText +++ b/src/main/cpp/fastText @@ -1 +1 @@ -Subproject commit 9c9b9b2eca4fdc0182182cb69234fffbb847d820 +Subproject commit 7842495a4d64c7a3bb4339d45d6e64321d002ed8 diff --git a/src/main/cpp/fasttext_wrapper.cc b/src/main/cpp/fasttext_wrapper.cc index ec5c90e..dc09a4e 100644 --- a/src/main/cpp/fasttext_wrapper.cc +++ b/src/main/cpp/fasttext_wrapper.cc @@ -74,7 +74,7 @@ namespace FastTextWrapper { const std::string& text, int32_t k) { std::vector> predictions; std::istringstream in(text); - fastText.predict(in, k, predictions); + fastText.predictLine(in, predictions, k, 0.0); return predictions; } From e7449bc4149808c007e5fb6b663d3729388d1b5f Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Mon, 17 Jun 2019 13:31:12 +0200 Subject: [PATCH 04/38] Increase version number to 0.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3899d17..6fa3f73 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.github.vinhkhuc jfasttext - 0.4 + 0.5 Java interface for fastText JFastText is a Java interface for fastText, a library for efficient learning of From c12efceb681437109988f0070fee7870af43fda9 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Mon, 17 Jun 2019 13:36:40 +0200 Subject: [PATCH 05/38] Update jdk version to oraclejdk11 so that Mac OS can build. Update README. --- .travis.yml | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5c71a1e..88b997e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java jdk: - - oraclejdk8 + - oraclejdk11 os: - linux - osx diff --git a/README.md b/README.md index d32185a..4149c3c 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ JFastText is ideal for building fast text classifiers in Java. com.github.vinhkhuc jfasttext - 0.4 + 0.5 ``` The Jar package on Maven Central is bundled with precompiled fastText library for Windows, Linux and From 1efff12b97240ca63588eca186b7ce9ffb4dbaf7 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Mon, 17 Jun 2019 14:13:20 +0200 Subject: [PATCH 06/38] Specify JDK version for Javadoc. --- pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pom.xml b/pom.xml index 6fa3f73..fa7c1fd 100644 --- a/pom.xml +++ b/pom.xml @@ -110,6 +110,9 @@ org.apache.maven.plugins maven-javadoc-plugin 2.9.1 + + 8 + attach-javadocs From 0e0343482f2483084e5a36d2173fcd103bd2105c Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Tue, 23 Jul 2019 16:22:05 +0200 Subject: [PATCH 07/38] Travis settings. --- .travis.yml | 1 - README.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 88b997e..786759a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ jdk: - oraclejdk11 os: - linux - - osx cache: bundler # Setting install to 'true' to prevent Travis CI from installing depedencies via: # "mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V" which fails due to missing the GPG secret key. diff --git a/README.md b/README.md index 4149c3c..d0c4585 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/vinhkhuc/JFastText.svg?branch=master)](https://travis-ci.org/vinhkhuc/JFastText) +[![Build Status](https://travis-ci.org/carschno/JFastText.svg?branch=master)](https://travis-ci.org/carschno/JFastText) Table of Contents ================= From aadc4d3f6ef8b74c04ed5da199647449660137ad Mon Sep 17 00:00:00 2001 From: bxshi Date: Tue, 22 Jan 2019 21:14:53 -0800 Subject: [PATCH 08/38] add Java binding for getSentenceVector --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5c71a1e..ed8dd68 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java jdk: - - oraclejdk8 + - oraclejdk9 os: - linux - osx From 3d545ced6f8a20a0177f3f5fd4dccfa89e6e6e94 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Wed, 24 Jul 2019 17:09:59 +0200 Subject: [PATCH 09/38] Add unit test. --- .../java/com/github/jfasttext/JFastTextTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/com/github/jfasttext/JFastTextTest.java b/src/test/java/com/github/jfasttext/JFastTextTest.java index b6f1521..d93cfb3 100644 --- a/src/test/java/com/github/jfasttext/JFastTextTest.java +++ b/src/test/java/com/github/jfasttext/JFastTextTest.java @@ -6,6 +6,8 @@ import java.util.List; +import static org.junit.Assert.assertArrayEquals; + @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JFastTextTest { @@ -55,6 +57,16 @@ public void test04Predict() throws Exception { System.out.printf("\nText: '%s', label: '%s'\n", text, predictedLabel); } + @Test + public void test04getArrayVector() throws Exception { + JFastText jft = new JFastText(); + jft.loadModel("src/test/resources/models/supervised.model.bin"); + String text = "I like soccer"; + float[] predictedArray = jft.getArrayVector(text); + float[] expected = new float[100]; + assertArrayEquals("", predictedArray, expected, 0.1f); + } + @Test public void test05PredictProba() throws Exception { JFastText jft = new JFastText(); From ed5eb5a8b4b54f4d645bb003b5818806189b56ea Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Wed, 24 Jul 2019 17:33:53 +0200 Subject: [PATCH 10/38] Add unit test. --- src/test/java/com/github/jfasttext/JFastTextTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/jfasttext/JFastTextTest.java b/src/test/java/com/github/jfasttext/JFastTextTest.java index d7eb3c5..5e91ff3 100644 --- a/src/test/java/com/github/jfasttext/JFastTextTest.java +++ b/src/test/java/com/github/jfasttext/JFastTextTest.java @@ -6,6 +6,8 @@ import java.util.List; +import static org.junit.Assert.assertEquals; + @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JFastTextTest { @@ -94,7 +96,8 @@ public void test08GetSentenceVector() throws Exception { jft.loadModel("src/test/resources/models/supervised.model.bin"); String word = "soccers"; List vec = jft.getSentenceVector(word); - System.out.printf("\nSentence embedding vector of '%s': %s\n", word, vec); + int expectedSize = 100; + assertEquals(expectedSize, vec.size()); } /** From 9793d7bbd3f367409d5725ad953159b9e5f97f68 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Thu, 25 Jul 2019 11:05:43 +0200 Subject: [PATCH 11/38] Build on OpenJDK11 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 786759a..4673191 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java jdk: - - oraclejdk11 + - openjdk11 os: - linux cache: bundler From 10429dc43df3de26f001f2d9f8f533cbbe1cd2db Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Thu, 25 Jul 2019 11:05:43 +0200 Subject: [PATCH 12/38] Build on OpenJDK11 (cherry picked from commit 9793d7bbd3f367409d5725ad953159b9e5f97f68) --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 786759a..4673191 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: java jdk: - - oraclejdk11 + - openjdk11 os: - linux cache: bundler From 3c468a96e17475db13946aad98742e9c7d7f0695 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Thu, 25 Jul 2019 12:07:32 +0200 Subject: [PATCH 13/38] Adapt information to fork. --- README.md | 2 +- pom.xml | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d0c4585..8e81543 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ JFastText is ideal for building fast text classifiers in Java. ## Maven Dependency ```xml - com.github.vinhkhuc + com.github.carschno jfasttext 0.5 diff --git a/pom.xml b/pom.xml index fa7c1fd..a5afc2f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.github.vinhkhuc + io.github.carschno jfasttext 0.5 Java interface for fastText @@ -22,6 +22,14 @@ + + carschno + Carsten Schnober + http://github.com/carschno + + developer + + vinhkhuc Vinh Khuc @@ -34,9 +42,9 @@ - scm:git:https://github.com/vinhkhuc/JFastText.git - scm:git:git@github.com:vinhkhuc/JFastText.git - https://github.com/vinhkhuc/JFastText + scm:git:https://github.com/carschno/JFastText.git + scm:git:git@github.com:carschno/JFastText.git + https://github.com/carschno/JFastText From ed194e7ed47f7f114298865044015862b0f92541 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Thu, 25 Jul 2019 12:11:31 +0200 Subject: [PATCH 14/38] Upgrade javacpp to v1.5.1 --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a5afc2f..338eeab 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,7 @@ UTF-8 + 1.5.1 @@ -166,7 +167,7 @@ org.bytedeco javacpp - 1.3.1 + ${javacpp.version} run-javacpp-parser @@ -245,7 +246,7 @@ org.bytedeco javacpp - 1.3.1 + ${javacpp.version} From ca617a7a6256cc0f22fbff099fe0a752440d5a54 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Sun, 28 Jul 2019 14:36:43 +0200 Subject: [PATCH 15/38] Update to JavaCPP v1.5.1 --- .../com/github/jfasttext/FastTextWrapper.java | 110 ++++++++++++++++-- 1 file changed, 103 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/github/jfasttext/FastTextWrapper.java b/src/main/java/com/github/jfasttext/FastTextWrapper.java index 023b19a..21db8c4 100644 --- a/src/main/java/com/github/jfasttext/FastTextWrapper.java +++ b/src/main/java/com/github/jfasttext/FastTextWrapper.java @@ -1,4 +1,4 @@ -// Targeted by JavaCPP version 1.3.1: DO NOT EDIT THIS FILE +// Targeted by JavaCPP version 1.5.1: DO NOT EDIT THIS FILE package com.github.jfasttext; @@ -13,7 +13,9 @@ public class FastTextWrapper extends com.github.jfasttext.config.FastTextWrapper static { Loader.load(); } /** Pointer cast constructor. Invokes {@link Pointer#Pointer(Pointer)}. */ public StringVector(Pointer p) { super(p); } + public StringVector(BytePointer value) { this(1); put(0, value); } public StringVector(BytePointer ... array) { this(array.length); put(array); } + public StringVector(String value) { this(1); put(0, value); } public StringVector(String ... array) { this(array.length); put(array); } public StringVector() { allocate(); } public StringVector(long n) { allocate(n); } @@ -21,13 +23,54 @@ public class FastTextWrapper extends com.github.jfasttext.config.FastTextWrapper private native void allocate(@Cast("size_t") long n); public native @Name("operator=") @ByRef StringVector put(@ByRef StringVector x); + public boolean empty() { return size() == 0; } public native long size(); + public void clear() { resize(0); } public native void resize(@Cast("size_t") long n); - @Index public native @StdString BytePointer get(@Cast("size_t") long i); + @Index(function = "at") public native @StdString BytePointer get(@Cast("size_t") long i); public native StringVector put(@Cast("size_t") long i, BytePointer value); - @ValueSetter @Index public native StringVector put(@Cast("size_t") long i, @StdString String value); + @ValueSetter @Index(function = "at") public native StringVector put(@Cast("size_t") long i, @StdString String value); + + public native @ByVal Iterator insert(@ByVal Iterator pos, @StdString BytePointer value); + public native @ByVal Iterator erase(@ByVal Iterator pos); + public native @ByVal Iterator begin(); + public native @ByVal Iterator end(); + @NoOffset @Name("iterator") public static class Iterator extends Pointer { + public Iterator(Pointer p) { super(p); } + public Iterator() { } + + public native @Name("operator++") @ByRef Iterator increment(); + public native @Name("operator==") boolean equals(@ByRef Iterator it); + public native @Name("operator*") @StdString BytePointer get(); + } + + public BytePointer[] get() { + BytePointer[] array = new BytePointer[size() < Integer.MAX_VALUE ? (int)size() : Integer.MAX_VALUE]; + for (int i = 0; i < array.length; i++) { + array[i] = get(i); + } + return array; + } + @Override public String toString() { + return java.util.Arrays.toString(get()); + } + public BytePointer pop_back() { + long size = size(); + BytePointer value = get(size - 1); + resize(size - 1); + return value; + } + public StringVector push_back(BytePointer value) { + long size = size(); + resize(size + 1); + return put(size, value); + } + public StringVector put(BytePointer value) { + if (size() != 1) { resize(1); } + return put(0, value); + } public StringVector put(BytePointer ... array) { if (size() != array.length) { resize(array.length); } for (int i = 0; i < array.length; i++) { @@ -36,6 +79,15 @@ public StringVector put(BytePointer ... array) { return this; } + public StringVector push_back(String value) { + long size = size(); + resize(size + 1); + return put(size, value); + } + public StringVector put(String value) { + if (size() != 1) { resize(1); } + return put(0, value); + } public StringVector put(String ... array) { if (size() != array.length) { resize(array.length); } for (int i = 0; i < array.length; i++) { @@ -49,6 +101,7 @@ public StringVector put(String ... array) { static { Loader.load(); } /** Pointer cast constructor. Invokes {@link Pointer#Pointer(Pointer)}. */ public RealVector(Pointer p) { super(p); } + public RealVector(float value) { this(1); put(0, value); } public RealVector(float ... array) { this(array.length); put(array); } public RealVector() { allocate(); } public RealVector(long n) { allocate(n); } @@ -56,12 +109,53 @@ public StringVector put(String ... array) { private native void allocate(@Cast("size_t") long n); public native @Name("operator=") @ByRef RealVector put(@ByRef RealVector x); + public boolean empty() { return size() == 0; } public native long size(); + public void clear() { resize(0); } public native void resize(@Cast("size_t") long n); - @Index public native @ByRef float get(@Cast("size_t") long i); + @Index(function = "at") public native @ByRef float get(@Cast("size_t") long i); public native RealVector put(@Cast("size_t") long i, float value); + public native @ByVal Iterator insert(@ByVal Iterator pos, @ByRef float value); + public native @ByVal Iterator erase(@ByVal Iterator pos); + public native @ByVal Iterator begin(); + public native @ByVal Iterator end(); + @NoOffset @Name("iterator") public static class Iterator extends Pointer { + public Iterator(Pointer p) { super(p); } + public Iterator() { } + + public native @Name("operator++") @ByRef Iterator increment(); + public native @Name("operator==") boolean equals(@ByRef Iterator it); + public native @Name("operator*") @ByRef @Const float get(); + } + + public float[] get() { + float[] array = new float[size() < Integer.MAX_VALUE ? (int)size() : Integer.MAX_VALUE]; + for (int i = 0; i < array.length; i++) { + array[i] = get(i); + } + return array; + } + @Override public String toString() { + return java.util.Arrays.toString(get()); + } + + public float pop_back() { + long size = size(); + float value = get(size - 1); + resize(size - 1); + return value; + } + public RealVector push_back(float value) { + long size = size(); + resize(size + 1); + return put(size, value); + } + public RealVector put(float value) { + if (size() != 1) { resize(1); } + return put(0, value); + } public RealVector put(float ... array) { if (size() != array.length) { resize(array.length); } for (int i = 0; i < array.length; i++) { @@ -83,12 +177,14 @@ public RealVector put(float ... array) { private native void allocate(@Cast("size_t") long n); public native @Name("operator=") @ByRef FloatStringPairVector put(@ByRef FloatStringPairVector x); + public boolean empty() { return size() == 0; } public native long size(); + public void clear() { resize(0); } public native void resize(@Cast("size_t") long n); - @Index public native @ByRef float first(@Cast("size_t") long i); public native FloatStringPairVector first(@Cast("size_t") long i, float first); - @Index public native @StdString BytePointer second(@Cast("size_t") long i); public native FloatStringPairVector second(@Cast("size_t") long i, BytePointer second); - @MemberSetter @Index public native FloatStringPairVector second(@Cast("size_t") long i, @StdString String second); + @Index(function = "at") public native @ByRef float first(@Cast("size_t") long i); public native FloatStringPairVector first(@Cast("size_t") long i, float first); + @Index(function = "at") public native @StdString BytePointer second(@Cast("size_t") long i); public native FloatStringPairVector second(@Cast("size_t") long i, BytePointer second); + @MemberSetter @Index(function = "at") public native FloatStringPairVector second(@Cast("size_t") long i, @StdString String second); public FloatStringPairVector put(float[] firstValue, BytePointer[] secondValue) { for (int i = 0; i < firstValue.length && i < secondValue.length; i++) { From 4fb85990b7dd360e66acbcb76e4cfc4b80f5146b Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Sun, 28 Jul 2019 14:40:55 +0200 Subject: [PATCH 16/38] Bump version to 0.5.0 --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8e81543..bfa329e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ JFastText is ideal for building fast text classifiers in Java. com.github.carschno jfasttext - 0.5 + 0.5.0 ``` The Jar package on Maven Central is bundled with precompiled fastText library for Windows, Linux and diff --git a/pom.xml b/pom.xml index 338eeab..d2b8491 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.carschno jfasttext - 0.5 + 0.5.0 Java interface for fastText JFastText is a Java interface for fastText, a library for efficient learning of From 6d92a1ca30f559b21d91f3068cd783768e0095f1 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Sun, 28 Jul 2019 14:49:35 +0200 Subject: [PATCH 17/38] Update example --- examples/api/pom.xml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/api/pom.xml b/examples/api/pom.xml index c2002ae..0ca4a9d 100644 --- a/examples/api/pom.xml +++ b/examples/api/pom.xml @@ -7,12 +7,15 @@ com.github.vinhkhuc java_sandbox 0.1 - + + 1.8 + 1.8 + - com.github.vinhkhuc + io.github.carschno jfasttext - 0.4 + 0.5.0 \ No newline at end of file From bf2f52bd2e86016e57dd365ae0b2a434a384cc72 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Sun, 28 Jul 2019 14:53:44 +0200 Subject: [PATCH 18/38] Update instructions. --- README.md | 4 +++- pom.xml | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bfa329e..0c17c9b 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,10 @@ MacOSX 64bit. C++ compiler (g++ on Mac/Linux or cl.exe on Windows) is required to compile fastText's code. ```bash -git clone --recursive https://github.com/vinhkhuc/JFastText +git clone --recursive https://github.com/carschno/JFastText cd JFastText +git submodule init +git submodule update mvn package ``` diff --git a/pom.xml b/pom.xml index d2b8491..b8c13b6 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ http://github.com/carschno developer + maintainer From 7c6cec990ff8c7b79637b3f64f85e70c821c5b18 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Sun, 28 Jul 2019 18:11:56 +0200 Subject: [PATCH 19/38] Fix Maven dependency. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c17c9b..98204a2 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ JFastText is ideal for building fast text classifiers in Java. ## Maven Dependency ```xml - com.github.carschno + io.github.carschno jfasttext 0.5.0 From 84f13ebd3ec48bb651fb546c14decf34013f7290 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Fri, 25 Oct 2019 12:16:38 +0200 Subject: [PATCH 20/38] Remove claim for Windows/MacOSX binary support (Closes #5). --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 98204a2..7b960a9 100644 --- a/README.md +++ b/README.md @@ -33,11 +33,11 @@ JFastText is ideal for building fast text classifiers in Java. 0.5.0 ``` -The Jar package on Maven Central is bundled with precompiled fastText library for Windows, Linux and -MacOSX 64bit. +The Jar package on Maven Central is bundled with precompiled fastText library for ~~Windows,~~ Linux ~~and +MacOSX~~ 64bit. ## Building -C++ compiler (g++ on Mac/Linux or cl.exe on Windows) is required to compile fastText's code. +C++ compiler (g++ on Mac/Linux or `cl.exe` on Windows) is required to compile fastText's code. ```bash git clone --recursive https://github.com/carschno/JFastText From 9f60ef2f05504ae19dffd843ccb5efa70260190e Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Fri, 25 Oct 2019 12:16:38 +0200 Subject: [PATCH 21/38] Remove claim for Windows/MacOSX binary support (Closes #5). --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 98204a2..7b960a9 100644 --- a/README.md +++ b/README.md @@ -33,11 +33,11 @@ JFastText is ideal for building fast text classifiers in Java. 0.5.0 ``` -The Jar package on Maven Central is bundled with precompiled fastText library for Windows, Linux and -MacOSX 64bit. +The Jar package on Maven Central is bundled with precompiled fastText library for ~~Windows,~~ Linux ~~and +MacOSX~~ 64bit. ## Building -C++ compiler (g++ on Mac/Linux or cl.exe on Windows) is required to compile fastText's code. +C++ compiler (g++ on Mac/Linux or `cl.exe` on Windows) is required to compile fastText's code. ```bash git clone --recursive https://github.com/carschno/JFastText From e7c7c12e719c3340f70ddb89eb4fa6b91b0fe85d Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Fri, 25 Oct 2019 12:36:40 +0200 Subject: [PATCH 22/38] Bump version. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b8c13b6..1155405 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.carschno jfasttext - 0.5.0 + 0.9.1-SNAPSHOT Java interface for fastText JFastText is a Java interface for fastText, a library for efficient learning of From 38521029ca1fd597741da185aed9e43ce1bc80d6 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Fri, 25 Oct 2019 12:42:28 +0200 Subject: [PATCH 23/38] Update to FastText v0.9.1. --- src/main/cpp/fastText | 2 +- src/main/cpp/fasttext_wrapper_javacpp.h | 2 +- src/main/java/com/github/jfasttext/FastTextWrapper.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/cpp/fastText b/src/main/cpp/fastText index 7842495..b5b7d30 160000 --- a/src/main/cpp/fastText +++ b/src/main/cpp/fastText @@ -1 +1 @@ -Subproject commit 7842495a4d64c7a3bb4339d45d6e64321d002ed8 +Subproject commit b5b7d307274ce00ef52198fbc692ed3bd11d9856 diff --git a/src/main/cpp/fasttext_wrapper_javacpp.h b/src/main/cpp/fasttext_wrapper_javacpp.h index 3991d2e..a49c223 100644 --- a/src/main/cpp/fasttext_wrapper_javacpp.h +++ b/src/main/cpp/fasttext_wrapper_javacpp.h @@ -6,7 +6,7 @@ #include "fastText/src/matrix.cc" #include "fastText/src/model.cc" #include "fastText/src/productquantizer.cc" -#include "fastText/src/qmatrix.cc" +#include "fastText/src/quantmatrix.cc" #include "fastText/src/vector.cc" #include "fastText/src/utils.cc" diff --git a/src/main/java/com/github/jfasttext/FastTextWrapper.java b/src/main/java/com/github/jfasttext/FastTextWrapper.java index 21db8c4..6f013d9 100644 --- a/src/main/java/com/github/jfasttext/FastTextWrapper.java +++ b/src/main/java/com/github/jfasttext/FastTextWrapper.java @@ -338,7 +338,7 @@ public DoubleIntPair put(float firstValue, int secondValue) { // #include "fastText/src/matrix.cc" // #include "fastText/src/model.cc" // #include "fastText/src/productquantizer.cc" -// #include "fastText/src/qmatrix.cc" +// #include "fastText/src/quantmatrix.cc" // #include "fastText/src/vector.cc" // #include "fastText/src/utils.cc" From 143f94b6eb85c32c7f4f1e30198b01ae51948ac1 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Fri, 25 Oct 2019 14:50:44 +0200 Subject: [PATCH 24/38] Update to most FastText branch with fix for comparePairs() call. cf. https://github.com/facebookresearch/fastText/pull/936 --- src/main/cpp/fastText | 2 +- src/main/cpp/fasttext_wrapper_javacpp.h | 2 ++ src/main/java/com/github/jfasttext/FastTextWrapper.java | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/cpp/fastText b/src/main/cpp/fastText index b5b7d30..cda295f 160000 --- a/src/main/cpp/fastText +++ b/src/main/cpp/fastText @@ -1 +1 @@ -Subproject commit b5b7d307274ce00ef52198fbc692ed3bd11d9856 +Subproject commit cda295f1b5851df0a26a6ac2ab04230fb864a89d diff --git a/src/main/cpp/fasttext_wrapper_javacpp.h b/src/main/cpp/fasttext_wrapper_javacpp.h index a49c223..93e92e0 100644 --- a/src/main/cpp/fasttext_wrapper_javacpp.h +++ b/src/main/cpp/fasttext_wrapper_javacpp.h @@ -1,8 +1,10 @@ // Added since VS 14.0 complains about missing std::iota #include #include "fastText/src/args.cc" +#include "fastText/src/densematrix.cc" #include "fastText/src/dictionary.cc" #include "fastText/src/fasttext.cc" +#include "fastText/src/loss.cc" #include "fastText/src/matrix.cc" #include "fastText/src/model.cc" #include "fastText/src/productquantizer.cc" diff --git a/src/main/java/com/github/jfasttext/FastTextWrapper.java b/src/main/java/com/github/jfasttext/FastTextWrapper.java index 6f013d9..02d405c 100644 --- a/src/main/java/com/github/jfasttext/FastTextWrapper.java +++ b/src/main/java/com/github/jfasttext/FastTextWrapper.java @@ -333,8 +333,10 @@ public DoubleIntPair put(float firstValue, int secondValue) { // Added since VS 14.0 complains about missing std::iota // #include // #include "fastText/src/args.cc" +// #include "fastText/src/densematrix.cc" // #include "fastText/src/dictionary.cc" // #include "fastText/src/fasttext.cc" +// #include "fastText/src/loss.cc" // #include "fastText/src/matrix.cc" // #include "fastText/src/model.cc" // #include "fastText/src/productquantizer.cc" From 685cad2fafb5d6b9280d166bce360ded316a4d9c Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Fri, 25 Oct 2019 16:06:38 +0200 Subject: [PATCH 25/38] Include meter.cc. --- src/main/cpp/fasttext_wrapper_javacpp.h | 1 + src/main/java/com/github/jfasttext/FastTextWrapper.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/cpp/fasttext_wrapper_javacpp.h b/src/main/cpp/fasttext_wrapper_javacpp.h index 93e92e0..3666f44 100644 --- a/src/main/cpp/fasttext_wrapper_javacpp.h +++ b/src/main/cpp/fasttext_wrapper_javacpp.h @@ -6,6 +6,7 @@ #include "fastText/src/fasttext.cc" #include "fastText/src/loss.cc" #include "fastText/src/matrix.cc" +#include "fastText/src/meter.cc" #include "fastText/src/model.cc" #include "fastText/src/productquantizer.cc" #include "fastText/src/quantmatrix.cc" diff --git a/src/main/java/com/github/jfasttext/FastTextWrapper.java b/src/main/java/com/github/jfasttext/FastTextWrapper.java index 02d405c..5fe8295 100644 --- a/src/main/java/com/github/jfasttext/FastTextWrapper.java +++ b/src/main/java/com/github/jfasttext/FastTextWrapper.java @@ -338,6 +338,7 @@ public DoubleIntPair put(float firstValue, int secondValue) { // #include "fastText/src/fasttext.cc" // #include "fastText/src/loss.cc" // #include "fastText/src/matrix.cc" +// #include "fastText/src/meter.cc" // #include "fastText/src/model.cc" // #include "fastText/src/productquantizer.cc" // #include "fastText/src/quantmatrix.cc" From 5674ed72081273dc96f329a3cec213ba61f9bec9 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Sat, 26 Oct 2019 10:59:04 +0200 Subject: [PATCH 26/38] Add instructions for Windows, Mac OS (#5). --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 7b960a9..79320e5 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Table of Contents * [Introduction](#introduction) * [Maven Dependency](#maven-dependency) + * [Windows and Mac OSX](#windows-and-mac-os-x) * [Building](#building) * [Quick Application - Language Identification](#quick-application-\--language-identification) * [Detailed Examples](#detailed-examples) @@ -36,6 +37,11 @@ JFastText is ideal for building fast text classifiers in Java. The Jar package on Maven Central is bundled with precompiled fastText library for ~~Windows,~~ Linux ~~and MacOSX~~ 64bit. +### Windows and Mac OS X + +Currently, the Maven dependency only contains binaries for Linux (64 bit), _not_ for Windows or Mac OS X. +In order to use JFastText for Windows or Mac OS X (or any other system), you need to build it yourself (see [below](#building)). + ## Building C++ compiler (g++ on Mac/Linux or `cl.exe` on Windows) is required to compile fastText's code. @@ -47,6 +53,15 @@ git submodule update mvn package ``` +### Building on Windows + +The (automatic) build seems to fail on some Windows systems/C++ compilers. +See [this issue](https://github.com/carschno/JFastText/issues/5#issuecomment-546485377): + +> I used MS's developer tools, not the full-blown Visual Studio. If I run `cl` directly, the compilation fails with the same error. +> +> I was able to build on Windows by changing the call to `cl.exe` and running it outside the Maven build. I changed one parameter in the call to `cl`: I use `/MT` (whereas Maven uses `/MD`). Bundling the generated DLLs works fine. + ## Quick Application - Language Identification JFastText can use FastText's pretrained models directly. Language identification models can be downloaded [here](https://fasttext.cc/docs/en/language-identification.html). In this quick example, we will use the [quantized model](https://s3-us-west-1.amazonaws.com/fasttext-vectors/supervised_models/lid.176.ftz) From 6b125f5312f4aa3ae4b2a79a245df2d66d98cc50 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Sat, 26 Oct 2019 11:14:30 +0200 Subject: [PATCH 27/38] Update Maven dependency version. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b960a9..aa94d55 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ JFastText is ideal for building fast text classifiers in Java. io.github.carschno jfasttext - 0.5.0 + 0.9.1 ``` The Jar package on Maven Central is bundled with precompiled fastText library for ~~Windows,~~ Linux ~~and From 5b2e96d3f792dba33c3fcdd784d3febd53f1c491 Mon Sep 17 00:00:00 2001 From: Alex Ott Date: Sun, 21 Apr 2019 13:30:52 +0200 Subject: [PATCH 28/38] Fix issue #19 - allow to load models from InputStream/URL/URI * Added corresponding implementations of the `loadModel` that copy data from `InputStream`/`URL`/`URI` into temporary file, and load it into fastText; * Added corresponding constructors to simplify code --- .../java/com/github/jfasttext/JFastText.java | 66 +++++++++++++++++-- .../com/github/jfasttext/JFastTextTest.java | 34 ++++++---- 2 files changed, 85 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/github/jfasttext/JFastText.java b/src/main/java/com/github/jfasttext/JFastText.java index ad543a2..bfff410 100644 --- a/src/main/java/com/github/jfasttext/JFastText.java +++ b/src/main/java/com/github/jfasttext/JFastText.java @@ -3,15 +3,40 @@ import org.bytedeco.javacpp.PointerPointer; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.nio.file.CopyOption; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; public class JFastText { - private FastTextWrapper.FastTextApi fta; + private FastTextWrapper.FastTextApi fta = new FastTextWrapper.FastTextApi();; public JFastText() { - fta = new FastTextWrapper.FastTextApi(); + } + + public JFastText(final String modelFile) { + loadModel(modelFile); + } + + public JFastText(final URI modelUri) throws IOException { + loadModel(modelUri); + } + + public JFastText(final URL modelUrl) throws IOException { + loadModel(modelUrl); + } + + public JFastText(final InputStream modelStream) throws IOException { + loadModel(modelStream); } public void runCmd(String[] args) { @@ -22,9 +47,9 @@ public void runCmd(String[] args) { fta.runCmd(cArgs.length, new PointerPointer(cArgs)); } - public void loadModel(String modelFile) { + public void loadModel(String modelFile) throws IllegalArgumentException { if (!new File(modelFile).exists()) { - throw new IllegalArgumentException("Model file doesn't exist!"); + throw new IllegalArgumentException("Model file " + modelFile + " doesn't exist!"); } if (!fta.checkModel(modelFile)) { throw new IllegalArgumentException( @@ -33,6 +58,39 @@ public void loadModel(String modelFile) { fta.loadModel(modelFile); } + /** + * Loads model from location specified by URI, by copying its content into local file & then loading it. + * + * @param modelUri location of the model + */ + public void loadModel(URI modelUri) throws IOException { + loadModel(modelUri.toURL()); + } + + /** + * Loads model from location specified by URL, by copying its content into local file & then loading it. + * + * @param modelUrl location of the model + */ + public void loadModel(URL modelUrl) throws IOException { + loadModel(modelUrl.openStream()); + } + + /** + * Loads model given InputStream, by copying its content into local file & then loading it. + * + * @param modelStream stream for model + */ + public void loadModel(InputStream modelStream) throws IOException { + Path tmpFile = Files.createTempFile("jft-", ".model"); + try { + Files.copy(modelStream, tmpFile, StandardCopyOption.REPLACE_EXISTING); + loadModel(tmpFile.toString()); + } finally { + Files.deleteIfExists(tmpFile); + } + } + public void unloadModel() { fta.unloadModel(); } diff --git a/src/test/java/com/github/jfasttext/JFastTextTest.java b/src/test/java/com/github/jfasttext/JFastTextTest.java index 160831b..0b2fbc5 100644 --- a/src/test/java/com/github/jfasttext/JFastTextTest.java +++ b/src/test/java/com/github/jfasttext/JFastTextTest.java @@ -4,6 +4,9 @@ import org.junit.Test; import org.junit.runners.MethodSorters; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; import java.util.List; import static org.junit.Assert.assertEquals; @@ -73,8 +76,7 @@ public void test04getArrayVector() throws Exception { @Test public void test05PredictProba() throws Exception { - JFastText jft = new JFastText(); - jft.loadModel("src/test/resources/models/supervised.model.bin"); + JFastText jft = new JFastText("src/test/resources/models/supervised.model.bin"); String text = "What is the most popular sport in the US ?"; JFastText.ProbLabel predictedProbLabel = jft.predictProba(text); System.out.printf("\nText: '%s', label: '%s', probability: %f\n", @@ -83,8 +85,7 @@ public void test05PredictProba() throws Exception { @Test public void test06MultiPredictProba() throws Exception { - JFastText jft = new JFastText(); - jft.loadModel("src/test/resources/models/supervised.model.bin"); + JFastText jft = new JFastText("src/test/resources/models/supervised.model.bin"); String text = "Do you like soccer ?"; System.out.printf("Text: '%s'\n", text); for (JFastText.ProbLabel predictedProbLabel: jft.predictProba(text, 2)) { @@ -95,11 +96,12 @@ public void test06MultiPredictProba() throws Exception { @Test public void test07GetVector() throws Exception { - JFastText jft = new JFastText(); - jft.loadModel("src/test/resources/models/supervised.model.bin"); - String word = "soccer"; - List vec = jft.getVector(word); - System.out.printf("\nWord embedding vector of '%s': %s\n", word, vec); + try (InputStream is = new FileInputStream("src/test/resources/models/supervised.model.bin")) { + JFastText jft = new JFastText(is); + String word = "soccer"; + List vec = jft.getVector(word); + System.out.printf("\nWord embedding vector of '%s': %s\n", word, vec); + } } @Test @@ -118,8 +120,7 @@ public void test08GetSentenceVector() throws Exception { @Test public void test09ModelInfo() throws Exception { System.out.printf("\nSupervised model information:\n"); - JFastText jft = new JFastText(); - jft.loadModel("src/test/resources/models/supervised.model.bin"); + JFastText jft = new JFastText("src/test/resources/models/supervised.model.bin"); System.out.printf("\tnumber of words = %d\n", jft.getNWords()); System.out.printf("\twords = %s\n", jft.getWords()); System.out.printf("\tlearning rate = %g\n", jft.getLr()); @@ -146,4 +147,15 @@ public void test10ModelUnloading() throws Exception { System.out.println("Unloading model ..."); jft.unloadModel(); } + + /** + * Loads model from specified URL (resource, web, etc.) + * + */ + @Test + public void test10ModelFromURL() throws Exception { + URL modelUrl = this.getClass().getClassLoader().getResource("models/supervised.model.bin"); + JFastText jft = new JFastText(modelUrl); + System.out.printf("\tnumber of words = %d\n", jft.getNWords()); + } } From 7f9e7250dd376126044d1ba432e8e51ac85741b1 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Thu, 25 Jul 2019 11:44:53 +0200 Subject: [PATCH 29/38] Add test for model file resource loading. --- src/test/java/com/github/jfasttext/JFastTextTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/github/jfasttext/JFastTextTest.java b/src/test/java/com/github/jfasttext/JFastTextTest.java index 0b2fbc5..bd038de 100644 --- a/src/test/java/com/github/jfasttext/JFastTextTest.java +++ b/src/test/java/com/github/jfasttext/JFastTextTest.java @@ -12,6 +12,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertNotNull; @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JFastTextTest { @@ -154,7 +155,9 @@ public void test10ModelUnloading() throws Exception { */ @Test public void test10ModelFromURL() throws Exception { - URL modelUrl = this.getClass().getClassLoader().getResource("models/supervised.model.bin"); + String modelFile = "models/supervised.model.bin"; + URL modelUrl = this.getClass().getClassLoader().getResource(modelFile); + assertNotNull(String.format("Failed to locate model '%s'", modelFile), modelUrl); JFastText jft = new JFastText(modelUrl); System.out.printf("\tnumber of words = %d\n", jft.getNWords()); } From e7d88477ca51884fa461a291448077982257c441 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Sat, 26 Oct 2019 11:27:11 +0200 Subject: [PATCH 30/38] Commit test model. --- src/test/resources/models/supervised.model.bin | Bin 0 -> 60874 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/test/resources/models/supervised.model.bin diff --git a/src/test/resources/models/supervised.model.bin b/src/test/resources/models/supervised.model.bin new file mode 100644 index 0000000000000000000000000000000000000000..296d68eb732ea1f61e535accb6258d438d742330 GIT binary patch literal 60874 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 Date: Sun, 27 Oct 2019 12:15:37 +0100 Subject: [PATCH 31/38] Fix test10ModelFromURL(). --- .../com/github/jfasttext/JFastTextTest.java | 5 +++-- src/test/resources/models/supervised.model.bin | Bin 60874 -> 0 bytes 2 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 src/test/resources/models/supervised.model.bin diff --git a/src/test/java/com/github/jfasttext/JFastTextTest.java b/src/test/java/com/github/jfasttext/JFastTextTest.java index bd038de..23dbc2d 100644 --- a/src/test/java/com/github/jfasttext/JFastTextTest.java +++ b/src/test/java/com/github/jfasttext/JFastTextTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.junit.runners.MethodSorters; +import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.URL; @@ -155,8 +156,8 @@ public void test10ModelUnloading() throws Exception { */ @Test public void test10ModelFromURL() throws Exception { - String modelFile = "models/supervised.model.bin"; - URL modelUrl = this.getClass().getClassLoader().getResource(modelFile); + String modelFile = "src/test/resources/models/supervised.model.bin"; + URL modelUrl = new File(modelFile).toURI().toURL(); assertNotNull(String.format("Failed to locate model '%s'", modelFile), modelUrl); JFastText jft = new JFastText(modelUrl); System.out.printf("\tnumber of words = %d\n", jft.getNWords()); diff --git a/src/test/resources/models/supervised.model.bin b/src/test/resources/models/supervised.model.bin deleted file mode 100644 index 296d68eb732ea1f61e535accb6258d438d742330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60874 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 Date: Sun, 27 Oct 2019 12:20:37 +0100 Subject: [PATCH 32/38] Update Maven dependency version. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 537b711..d4665b7 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ JFastText is ideal for building fast text classifiers in Java. io.github.carschno jfasttext - 0.9.1 + 0.9.1-SNAPSHOT ``` The Jar package on Maven Central is bundled with precompiled fastText library for ~~Windows,~~ Linux ~~and From 777df81704654e5fec4fadedebd51fae68f44bc4 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Mon, 28 Oct 2019 11:14:26 +0100 Subject: [PATCH 33/38] Add Changelog. --- CHANGELOG.md | 7 +++++++ README.md | 1 + 2 files changed, 8 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4be0e6c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +## Version 0.9.1 + +* Use [FastText v0.9.1](https://github.com/facebookresearch/fastText/releases/tag/v0.9.1) +* Minor bug fixes + \ No newline at end of file diff --git a/README.md b/README.md index d4665b7..b044575 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Table of Contents * [FastText's Command Line](#fasttexts-command-line) * [License](#license) * [References](#references) + * [Changelog](CHANGELOG.md) ## Introduction From 41b58a146f7d7d70b9038f643e1105aa995f1434 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Mon, 28 Oct 2019 16:35:00 +0100 Subject: [PATCH 34/38] Release version 0.9.1. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1155405..0ed58cf 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.carschno jfasttext - 0.9.1-SNAPSHOT + 0.9.1 Java interface for fastText JFastText is a Java interface for fastText, a library for efficient learning of From d4756b5099135c708136edc359f3d60464b19228 Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Mon, 28 Oct 2019 16:53:24 +0100 Subject: [PATCH 35/38] Update dependency version. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b044575..3eb99f9 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ JFastText is ideal for building fast text classifiers in Java. io.github.carschno jfasttext - 0.9.1-SNAPSHOT + 0.9.1 ``` The Jar package on Maven Central is bundled with precompiled fastText library for ~~Windows,~~ Linux ~~and From 781b7367cfdf2e584af7de2a20531ad88527ba2c Mon Sep 17 00:00:00 2001 From: Carsten Schnober Date: Mon, 28 Oct 2019 16:53:42 +0100 Subject: [PATCH 36/38] Set autoReleaseAfterClose to false. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0ed58cf..c7ce161 100644 --- a/pom.xml +++ b/pom.xml @@ -87,7 +87,7 @@ ossrh https://oss.sonatype.org/ - true + false From 18c756b89ea610b5ffefb9a570b0854d24570bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Mazur?= Date: Tue, 18 Feb 2020 11:33:47 +0100 Subject: [PATCH 37/38] Add optimized version of getSentenceVector --- .../java/com/github/jfasttext/JFastText.java | 29 +++++++------ .../com/github/jfasttext/JFastTextTest.java | 43 +++++++++++++------ 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/github/jfasttext/JFastText.java b/src/main/java/com/github/jfasttext/JFastText.java index bfff410..f728f78 100644 --- a/src/main/java/com/github/jfasttext/JFastText.java +++ b/src/main/java/com/github/jfasttext/JFastText.java @@ -142,34 +142,37 @@ public List predictProba(String text, int k) { return probaPredictions; } + @Deprecated public List getVector(String word) { - FastTextWrapper.RealVector rv = fta.getVector(word); + float[] vector = getArrayVector(word); List wordVec = new ArrayList<>(); - for (int i = 0; i < rv.size(); i++) { - wordVec.add(rv.get(i)); + for (float f : vector) { + wordVec.add(f); } return wordVec; } public float[] getArrayVector(String word) { FastTextWrapper.RealVector rv = fta.getVector(word); - float[] wordVec = new float[(int)rv.size()]; - for (int i = 0; i < rv.size(); i++) { - wordVec[i] = rv.get(i); - } - return wordVec; + return rv.get(); } + @Deprecated public List getSentenceVector(String sentence) { + float[] vector = getArraySentenceVector(sentence); + List sentenceVec = new ArrayList<>(); + for (float f : vector) { + sentenceVec.add(f); + } + return sentenceVec; + } + + public float[] getArraySentenceVector(String sentence) { if (!sentence.endsWith("\n")) { sentence += "\n"; } FastTextWrapper.RealVector rv = fta.getSentenceVector(sentence); - List wordVec = new ArrayList<>(); - for (int i = 0; i < rv.size(); i++) { - wordVec.add(rv.get(i)); - } - return wordVec; + return rv.get(); } public int getNWords() { diff --git a/src/test/java/com/github/jfasttext/JFastTextTest.java b/src/test/java/com/github/jfasttext/JFastTextTest.java index 23dbc2d..1fd7ffc 100644 --- a/src/test/java/com/github/jfasttext/JFastTextTest.java +++ b/src/test/java/com/github/jfasttext/JFastTextTest.java @@ -8,11 +8,11 @@ import java.io.FileInputStream; import java.io.InputStream; import java.net.URL; +import java.util.Arrays; import java.util.List; -import static org.junit.Assert.assertEquals; - import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @FixMethodOrder(MethodSorters.NAME_ASCENDING) @@ -66,15 +66,15 @@ public void test04Predict() throws Exception { System.out.printf("\nText: '%s', label: '%s'\n", text, predictedLabel); } - @Test - public void test04getArrayVector() throws Exception { - JFastText jft = new JFastText(); - jft.loadModel("src/test/resources/models/supervised.model.bin"); - String text = "I like soccer"; - float[] predictedArray = jft.getArrayVector(text); - float[] expected = new float[100]; - assertArrayEquals("", predictedArray, expected, 0.1f); - } + @Test + public void test04getArrayVector() throws Exception { + JFastText jft = new JFastText(); + jft.loadModel("src/test/resources/models/supervised.model.bin"); + String text = "I like soccer"; + float[] predictedArray = jft.getArrayVector(text); + float[] expected = new float[100]; + assertArrayEquals("", predictedArray, expected, 0.1f); + } @Test public void test05PredictProba() throws Exception { @@ -106,6 +106,16 @@ public void test07GetVector() throws Exception { } } + @Test + public void test07GetArrayVector() throws Exception { + try (InputStream is = new FileInputStream("src/test/resources/models/supervised.model.bin")) { + JFastText jft = new JFastText(is); + String word = "soccer"; + float[] vec = jft.getArrayVector(word); + System.out.printf("\nWord embedding vector of '%s': %s\n", word, Arrays.toString(vec)); + } + } + @Test public void test08GetSentenceVector() throws Exception { JFastText jft = new JFastText(); @@ -116,6 +126,16 @@ public void test08GetSentenceVector() throws Exception { assertEquals(expectedSize, vec.size()); } + @Test + public void test08GetArraySentenceVector() throws Exception { + JFastText jft = new JFastText(); + jft.loadModel("src/test/resources/models/supervised.model.bin"); + String word = "soccers"; + float[] vec = jft.getArraySentenceVector(word); + int expectedSize = 100; + assertEquals(expectedSize, vec.length); + } + /** * Test retrieving model's information: words, labels, learning rate, etc. */ @@ -152,7 +172,6 @@ public void test10ModelUnloading() throws Exception { /** * Loads model from specified URL (resource, web, etc.) - * */ @Test public void test10ModelFromURL() throws Exception { From 0c7b10e72bd658611c2e694cdca0f32786cf96e5 Mon Sep 17 00:00:00 2001 From: Alex Ott Date: Sat, 21 Nov 2020 16:32:35 +0100 Subject: [PATCH 38/38] Move release-related plugins into a separate profile Right now `mvn install` fails if there is no PGP installed or configured. Given patch moves the `nexus-staging-maven-plugin` and `maven-gpg-plugin` into a separate profile - `release` that should be used for generation of the release artifacts --- pom.xml | 55 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/pom.xml b/pom.xml index c7ce161..01b5822 100644 --- a/pom.xml +++ b/pom.xml @@ -75,21 +75,42 @@ -Xdoclint:none - - - - - + + release + + + org.sonatype.plugins nexus-staging-maven-plugin 1.6.3 true - ossrh - https://oss.sonatype.org/ - false + ossrh + https://oss.sonatype.org/ + false - + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + + + + + + org.apache.maven.plugins maven-compiler-plugin @@ -132,20 +153,6 @@ - - org.apache.maven.plugins - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - org.apache.maven.plugins maven-enforcer-plugin @@ -251,4 +258,4 @@ - \ No newline at end of file +