1. 前言
之前在做文本分类任务,使用了Facebook开源的Fasttext工具,用其在Unix下编译后得到的fasttext命令训练生成*.bin
文件。由于线上需要封装成jar
包调用,故在github上找到了vinhkhuc/JFastText
的项目,用Maven引入进行开发,挖坑开始。
1.1 模型文件格式错误
按照项目首页的README说明,引入依赖:
<dependency>
<groupId>com.github.vinhkhuc</groupId>groupId>
<artifactId>jfasttext</artifactId>artifactId>
<version>0.3</version>version>
</dependency>dependency>
开发Demo时,提示Model file has wrong file format!
。去查issues页面,第一个热门提问就是这个bug。开发者让尝试另一个fork的仓库地址:https://github.com/lidalei/JFastText
。
新地址表明不能用Maven引入,需git clone
到本地,进行mvn clean package
进行本地构建。构建完毕后在项目中添加依赖使用。
但是!!虽然本地可以正常加载用fasttext终端命令训练的模型,但是在deploy时会存在很大问题。即deploy后,别人用Maven引用时,依然会提示模型文件错误!。开发时,没有注意到这点,导致给小伙伴们挖了大坑。
2. 填坑开始
2.1 Maven依赖打包
若本地引入只能本地使用,可否将lidalei/JFastText
的代码clone下来,更改其pom文件,deploy到Nexus仓库来解决?
Step 1. Clone仓库
从github上将对方开发者的代码克隆下来:
git clone git@github.com:lidalei/JFastText.git
Step 2. 修改pom文件
查看了自带的pom文件,保持<build>
内容不变,修改groupId、version等字段,替换<distributionManagement>
下内容,使其能够deploy到我们的Nexus私服
Step3. 运行deploy
点击Maven
中的deploy选项开始上传。终端有一些信息值得注意:
[INFO] --- javacpp:1.4:build (run-javacpp-parser) @ jfasttext ---
[INFO] Detected platform "macosx-x86_64"
[INFO] Building for platform "macosx-x86_64"
[INFO] Targeting /Users/XXXX/Documents/tools/JFastText/src/main/java/com/github/jfasttext/FastTextWrapper.java
[INFO] Parsing /Users/XXXX/Documents/tools/JFastText/src/main/cpp/fasttext_wrapper.h
[INFO] Parsing /Users/XXXX/Documents/tools/JFastText/src/main/cpp/fasttext_wrapper_javacpp.h
[INFO]
[INFO] --- javacpp:1.4:build (run-javacpp-compiler) @ jfasttext ---
[INFO] Detected platform "macosx-x86_64"
[INFO] Building for platform "macosx-x86_64"
在编译时javacpp
自动检测了我的系统,然后根据我的系统适配地编译了jar包,上传到Nexus:
<dependency>
<groupId>com.xiaomi.search.ltp</groupId>groupId>
<artifactId>jfasttext</artifactId>artifactId>
<version>0.3.0-SNAPSHOT</version>version>
</dependency>dependency>
Step4. loadModel
用Maven引入上述deploy的jar包,写Demo样例:
import com.github.jfasttext.JFastText;
public class demo {
public static void main(String[] args) throws Exception{
JFastText jFastText = new JFastText();
jFastText.loadModel("/Users/XXXX/Desktop/model_t_92.bin");
}
}
成功加载模型
3. 最后的坑
完成jar包上传之后,想到之前build时终端输出关于的系统信息,可能在windows下使用出问题,因此在windows下按照同样的Demo项目测试了下,果然不行。
当前deploy的jar包目测仅支持mac,不排除仅支持我的mac的坑
4. 总结
- 用FastText的模型做Java封装时,还是建议使用Java进行训练,加载模型,从源头避免挖坑
- JFastText项目中之所以不支持加载Fasttext命令训练的模型,可能和动态链接库有关。毕竟安装fasttext生成一堆链接库,在上面尝试打包时,
javacpp
貌似也在检测动态链接库