跳转到内容

FastText 文本分类

fasttext.dev.znlp.FastText 是 Facebook fastText 的 Java 移植,对齐 v0.9.2 的 .bin 格式(FILEFORMAT_MAGIC = 793712314、FILEFORMAT_VERSION = 12),可以直接读写官方训练出的模型。

FastText 本身是一个 record:FastText(Args args, Dictionary dict, Model model)。

import fasttext.dev.znlp.FastText;
import args.fasttext.dev.znlp.Args;
Args args = new Args();
args.dim = 100;
args.epoch = 5;
args.lr = 0.05;
args.wordNgrams = 2;
args.label = "__label__";
FastText model = FastText.trainSupervised(new File("train.txt"), args);

训练语料每行一条样本,标签以 args.label 前缀开头:

__label__体育 姚明 出席 发布会
__label__财经 股市 收盘 上涨
import fasttext.dev.znlp.ScoreLabelPair;
List<String> tokens = List.of("股市", "收盘", "上涨");
// top-k 预测,带阈值
List<ScoreLabelPair> preds = model.predict(tokens, 3, 0.0f);
// 返回全部标签(k 传 -1,即 Model.kUnlimitedPredictions)
List<ScoreLabelPair> all = model.predict(tokens, Model.kUnlimitedPredictions, 0.0f);
// 已编码的词 id 版本,省去查词典
List<ScoreIdPair> byId = model.predict(3, wordsIntArrayList, 0.0f);
FastTextTestResult r = model.test(new File("test.txt"), 1, 0.0f, true);
// 或已解析的样本
FastTextTestResult r2 = model.test(samples, 1, 0.0f, true);

返回 P@k 和 R@k。最后一个参数 print 控制是否输出到控制台。

Args args = new Args();
args.model = ModelName.sg; // skip-gram;也可选 cbow
args.dim = 100;
args.ws = 5; // 窗口大小
args.neg = 5; // 负采样数量
args.loss = LossName.ns;
args.minCount = 5;
FastText model = FastText.train(new File("corpus.txt"), args);
// 或从内存样本训练
FastText model2 = FastText.train(List.of(sampleLines), args);

ModelName 枚举有三个值:cbow、sg、sup。训练词向量时要显式设置 args.model,因为默认值是 sg。

model.saveModel(new File("model.bin")); // Facebook 兼容 .bin,非量化
FastText loaded = FastText.loadModel(new File("model.bin"));

loadModel 支持官方 fastText 训练出的 .bin 文件。

args.fasttext.dev.znlp.Args 的字段都是 public,直接赋值即可。默认值:

字段 默认 字段 默认
dim 100 epoch 5
lr 0.05 lrUpdateRate 100
minCount 5 minCountLabel 0
wordNgrams 1 bucket 2000000
minn 3 maxn 6
t 1e-4 ws 5
neg 5 loss LossName.ns
model ModelName.sg maxVocabSize 500000
seed 0 thread CPU 核数 - 2(最少 2)
label "__label__"

minn / maxn 是 subword 的 n-gram 范围,设为 0 可关闭 subword 以减小模型体积和内存占用。

仓库自带的 FastTextExample 演示了分类训练、predict、无限 k、test 的 P@1/R@1,以及 saveModel/loadModel 往返:

终端窗口
./gradlew :znlp-examples:run -PmainClass=examples.dev.znlp.FastTextExample
  • 设计文档:docs/设计架构/FastText.md
  • 模块内说明:fasttext/README.md