
fastText Python 官方模块使用指南词向量训练、文本分类与完整 API 参考【免费下载链接】fastTextLibrary for fast text representation and classification.项目地址: https://gitcode.com/gh_mirrors/fa/fastText本指南系统讲解 fastText 官方 Python 模块fasttext包的安装、训练、预测与量化全流程。你将从零学会用fasttext.train_unsupervised训练 skipgram / cbow 词向量用fasttext.train_supervised训练文本分类器并通过_FastText模型对象完成保存、加载、评估与子词subword信息提取。文章同时深入仓库源码解释参数默认值、UTF-8 编码约定与分词细节让你不仅能跑通示例还能理解底层原理。环境要求RequirementsfastText 面向现代 Mac OS 与 Linux 发行版构建。由于 C 核心库使用了 C11 特性setup.py 中实际以 C17 编译扩展需要编译器具备良好的 C11 支持。Python 侧依赖如下Python2.7 或 ≥ 3.4当前版本 setup.py 声明支持 2.7 / 3.4 / 3.5 / 3.6NumPy 与 SciPy用于向量矩阵运算与数值处理pybind11用于把 C 核心库绑定为 Python 扩展模块fasttext_pybind安装时自动作为依赖拉取见 setup.py 的install_requires安装Installation安装最新发布版本直接使用 pip$ pip install fasttext如需使用仓库中的最新开发版本可以克隆仓库后本地安装$ git clone https://github.com/facebookresearch/fastText.git $ cd fastText $ sudo pip install . $ # 或 $ sudo python setup.py install安装过程会编译 python/fasttext_module/fasttext/pybind/fasttext_pybind.cc 这一 pybind11 绑定源文件连同src/目录下的全部.cc核心实现setup.py一起构建出名为fasttext_pybind的原生扩展。使用总览Usage OverviewPython 模块暴露了三个顶层训练/加载入口train_unsupervised词向量、train_supervised文本分类与load_model加载模型它们都返回_FastText模型对象。下面分别展开。词表示模型训练词向量参考利用子词信息增强词向量的方法可以用fasttext.train_unsupervised训练词向量import fasttext # Skipgram 模型 model fasttext.train_unsupervised(data.txt, modelskipgram) # 或 cbow 模型 model fasttext.train_unsupervised(data.txt, modelcbow)其中data.txt是包含 UTF-8 编码文本的训练文件。训练返回的model对象即学习到的模型可以用来检索信息print(model.words) # 词典中的词列表 print(model[king]) # 获取 king 的词向量model[king]走的是_FastText对__getitem__的运算符重载等价于model.get_word_vector(king)见 FastText.py。值得说明的是仓库还提供了训练词向量的完整命令行示例脚本 word-vector-example.sh以及 Python 版示例 train_unsupervised.py可对照使用。保存与加载模型对象调用save_model保存训练好的模型model.save_model(model_filename.bin)之后通过load_model加载model fasttext.load_model(model_filename.bin)文本分类模型训练分类器参考高效文本分类的技巧一文的方法可以用fasttext.train_supervised训练文本分类器import fasttext model fasttext.train_supervised(data.train.txt)其中data.train.txt是每行包含一条训练句子及其标签的文本文件。默认约定标签是带__label__前缀的词。即训练数据形如__label__sauce __label__cheese How much does potato starch affect a cheese sauce recipe? __label__cake __label__baking What is the best cake for a wedding?训练完成后可以获取词与标签列表print(model.words) print(model.labels)在测试集上评估P1 与召回率用test函数在测试集上计算 top-1 精确率precision at 1与召回率def print_results(N, p, r): print(N\t str(N)) print(P{}\t{:.3f}.format(1, p)) print(R{}\t{:.3f}.format(1, r)) print_results(*model.test(test.txt))model.test(path, k1, threshold0.0)返回三元组样本数 N、精确率 p、召回率 r其底层实现在 FastText.py 中委托给 C 绑定。预测标签对单条文本预测标签model.predict(Which baking dish is best to bake a banana bread ?)默认只返回概率最高的一个标签。通过参数k可预测多个标签model.predict(Which baking dish is best to bake a banana bread ?, k3)也可以一次性传入字符串数组批量预测model.predict([Which baking dish is best to bake a banana bread ?, Why not put knives in the dishwasher?], k3)注意predict还支持threshold参数默认 0.0它按概率阈值过滤返回的标签k与threshold会同时作用于最终返回的标签集合。此外predict每次只处理一行文本——如果传入的字符串包含换行符\n会抛出ValueError(predict processes one line at a time (remove \\n))源码见 FastText.py 的predict实现。分类模型同样可以像词向量模型那样保存与加载用法完全相同。仓库提供了完整的监督训练示例 train_supervised.py其中展示了更贴近实战的参数组合——例如epoch25, lr1.0, wordNgrams2, minCount1以及切换losshs层次 softmax的写法值得参考。使用量化压缩模型文件保存监督模型时fastText 可以将其压缩为体积小得多的模型文件代价是略微牺牲一点性能# 对之前训练好的 model 对象调用 model.quantize(inputdata.train.txt, retrainTrue) # 然后展示结果并保存新模型 print_results(*model.test(valid_data)) model.save_model(model_filename.ftz)model_filename.ftz的体积将远小于model_filename.bin。quantize方法的完整签名见 FastText.py为model.quantize(inputNone, qoutFalse, cutoff0, retrainFalse, epochNone, lrNone, threadNone, verboseNone, dsub2, qnormFalse)input重训练retrain时所需的数据文件路径若retrainTrue而未提供input会抛出ValueError(Need input file path if retraining)qout是否量化输出矩阵默认 Falsecutoff保留的词/ngram 数量截断值默认 0即不截断retrain是否在量化后基于原数据重训练以恢复精度dsub子向量维度默认 2qnorm是否重新计算并存储向量范数示例脚本 train_supervised.py 中即使用qnormTrue, cutoff100000关于量化的底层实现可查阅 src/quantmatrix.h 与 src/productquantizer.h——量化模型使用乘积量化product quantization压缩词向量矩阵加载后通过is_quantized()可判断模型是否已量化。重要数据预处理与编码约定正确处理数据是使用 fastText 的前提仓库根目录的示例脚本如 classification-example.sh、word-vector-example.sh都包含数据预处理步骤。UTF-8 编码fastText 假定输入是 UTF-8 编码文本。Python 2 中应传unicodePython 3 中应传str。传入的文本会由 pybind11 先编码为 UTF-8 再交给 fastText C 库见 fasttext_pybind.cc 中的castToPythonString实现它通过PyUnicode_DecodeUTF8解码 C 返回的字符串。因此构建模型时必须使用 UTF-8 编码的文本在类 Unix 系统上可以用iconv转换文本编码。分词依据的 ASCII 字符fastText 依据以下 ASCII 字符字节进行分词切分文本它不识别 UTF-8 空白符。请把 UTF-8 空白符/词边界转换为下列符号之一空格space制表符tab垂直制表符vertical tab回车符carriage return换页符formfeed空字符null character这一分词规则在 C 侧的实现可以看 src/dictionary.cc 的readWordNoNewline它使用的空白字符集合为 \n\r\t\v\f\0与上述列表一致。换行符与 EOS 标记换行符用于界定一行文本。遇到换行符时会在行尾追加 EOS 标记/s常量定义见 src/dictionary.h 与 src/dictionary.cc。唯一例外是当 token 数超过MAX_LINE_SIZE常量时——该常量定义在 src/dictionary.h值为 1024。这意味着如果文本没有换行分隔如 fil9 数据集它会被按最多 1024 个 token 切块并且不追加 EOS 标记。token 长度按 UTF-8 字符数计算一个 token 的长度是指其 UTF-8 字符数通过检查每个字节的前两位来判断多字节序列的后续字节实现在 src/dictionary.cc。这一点在选择子词subword的最小/最大长度minn、maxn时尤其重要。另外EOS 标记被视为一个字符不会被拆分成子词。子词的包装形式为tokenBOW/与 EOW/见 src/dictionary.cc例如词where的 3-gram 子词形如wh、whe、her、ere、re。更多示例与帮助想更深入了解 fastText 模型可以阅读仓库根目录的 README.md以及 Python 示例目录 python/doc/examples其中包含train_supervised.py监督训练 量化完整流程train_unsupervised.py无监督词向量训练compute_accuracy.py词类比analogy准确率评估get_vocab.py提取词典bin_to_vec.py把 .bin 模型导出为文本 .vec 词向量文件FastTextEmbeddingBag.pyPyTorch EmbeddingBag 复现 fastText 模型结构与任何 Python 包一样可以用内置help函数查看函数说明例如 import fasttext help(fasttext.FastText) Help on module fasttext.FastText in fasttext: NAME fasttext.FastText DESCRIPTION # Copyright (c) 2017-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the MIT license found in the # LICENSE file in the root directory of this source tree. FUNCTIONS load_model(path) Load a model given a filepath and return a model object. tokenize(text) Given a string of text, tokenize it and return a list of tokens [...]顶层模块还直接提供fasttext.tokenize(text)函数用于把文本按 fastText 规则切分为 token 列表实现见 FastText.py。API 参考train_unsupervised参数input # 训练文件路径必填 model # 无监督 fasttext 模型 {cbow, skipgram} [skipgram] lr # 学习率 [0.05] dim # 词向量维度 [100] ws # 上下文窗口大小 [5] epoch # 训练轮数 [5] minCount # 词的最少出现次数 [5] minn # 字符 ngram 最小长度 [3] maxn # 字符 ngram 最大长度 [6] neg # 负采样数量 [5] wordNgrams # 词 ngram 最大长度 [1] loss # 损失函数 {ns, hs, softmax, ova} [ns] bucket # 桶的数量 [2000000] thread # 线程数 [CPU 数] lrUpdateRate # 学习率更新速率 [100] t # 采样阈值 [0.0001] verbose # 日志详细程度 [2]这些默认值可以直接在 FastText.py 的unsupervised_default字典中核对。几个值得展开的点thread在 Python 模块中的默认值是multiprocessing.cpu_count() - 1即 CPU 数减一而不是 C 命令行默认值 12见 FastText.py。loss的可选值为ns负采样、hs层次 softmax、softmax、ovaone-vs-all字符串解析在_parse_loss_string中完成无监督训练默认ns这也是 skipgram/cbow 词向量的经典配置。minCountLabel默认 0无监督场景不涉及标签过滤label默认__label__。bucket用于把超出发音词典容量的字符 ngram 哈希映射到固定数量的桶中。源码中还有一个细节如果wordNgrams 1且maxn 0即完全不用子词与词 ngrambucket会被置 0从而省去无用的哈希表见 FastText.py 的_build_args。train_supervised参数input # 训练文件路径必填 lr # 学习率 [0.1] dim # 词向量维度 [100] ws # 上下文窗口大小 [5] epoch # 训练轮数 [5] minCount # 词的最少出现次数 [1] minCountLabel # 标签的最少出现次数 [1] minn # 字符 ngram 最小长度 [0] maxn # 字符 ngram 最大长度 [0] neg # 负采样数量 [5] wordNgrams # 词 ngram 最大长度 [1] loss # 损失函数 {ns, hs, softmax, ova} [softmax] bucket # 桶的数量 [2000000] thread # 线程数 [CPU 数] lrUpdateRate # 学习率更新速率 [100] t # 采样阈值 [0.0001] label # 标签前缀 [__label__] verbose # 日志详细程度 [2] pretrainedVectors # 预训练词向量文件.vec 格式用于监督学习 []与无监督训练相比的默认值差异源码见 FastText.py 的train_supervised以及 C 侧 src/args.cc 中supervised命令对默认值的改写lr默认 0.1无监督为 0.05分类任务常用更大的学习率minCount默认 1保留出现次数更少的词minn/maxn默认 0监督分类默认不使用字符子词只使用整词loss默认softmax输出层为完整 softmax多出minCountLabel标签最少出现次数与pretrainedVectors用预训练词向量初始化输入矩阵常用于小数据集的分类增强另外train_supervised还支持参数名下划线别名min_count、word_ngrams、lr_update_rate、label_prefix、pretrained_vectors会被自动映射为对应的驼峰参数名见 FastText.py 的read_args。train_supervised/train_unsupervised还接受seed随机种子与autotune*系列超参数自动调参见 src/autotune.h例如autotuneValidationFile、autotuneMetric、autotuneDuration。model对象_FastTexttrain_supervised、train_unsupervised与load_model均返回_FastText类的实例习惯上称为model对象类定义见 FastText.py。该对象把训练参数暴露为属性lr、dim、ws、epoch、minCount、minCountLabel、minn、maxn、neg、wordNgrams、loss、bucket、thread、lrUpdateRate、t、label、verbose、pretrainedVectors。例如model.wordNgrams返回训练该模型时使用的词 ngram 最大长度。此外对象还暴露以下方法get_dimension # 获取查找向量隐藏层的维度。等价于 dim 属性。 get_input_vector # 给定索引获取输入矩阵中对应的向量。 get_input_matrix # 获取模型完整输入矩阵的副本。 get_labels # 获取词典的完整标签列表。等价于 labels 属性。 get_line # 把一行文本切分为词与标签。 get_output_matrix # 获取模型完整输出矩阵的副本。 get_sentence_vector # 给定字符串获取单个向量表示。该函数假定输入为单行文本 # 按空白空格、换行、制表符、垂直制表符以及控制字符 # 回车、换页、空字符进行切分。 get_subword_id # 给定子词返回其在输入矩阵中哈希到的索引。 get_subwords # 给定词获取其子词及对应索引。 get_word_id # 给定词获取其在词典中的 id不在词典返回 -1。 get_word_vector # 获取词的向量表示。 get_words # 获取词典的完整词列表。等价于 words 属性。 is_quantized # 模型是否已被量化。 predict # 给定字符串获取标签列表及对应概率列表。 quantize # 量化模型减小模型体积与内存占用。 save_model # 把模型保存到给定路径。 test # 用给定路径的文件评估监督模型。 test_label # 返回每个标签的精确率与召回率。属性words、labels返回词典中的词与标签model.words # 等价于 model.get_words() model.labels # 等价于 model.get_labels()对象重写了__getitem__与__contains__从而支持取词向量与词表成员判断model[king] # 等价于 model.get_word_vector(king) king in model # 等价于 king in model.get_words()补充几个文档中未展开但源码可确认的实用方法见 FastText.pyget_nearest_neighbors(word, k10)返回与给定词最相近的 k 个邻居基于 src/fasttext.h 中 C 侧的getNN实现常用于词向量质量评估与同义词发现get_analogies(wordA, wordB, wordC, k10)执行词类比推理返回wordA - wordB wordC最相近的 k 个词对应 C 的getAnalogiesget_words(include_freqTrue)与get_labels(include_freqTrue)同时返回词/标签及其频率注意无监督模型的标签就是词因此get_labels会转调get_words见 FastText.pyget_meter(path, k-1)返回_Meter对象可用于计算每个标签的精确率-召回率曲线precision/recall curve、指定召回率下的精确率等底层对应 src/meter.hset_matrices(input_matrix, output_matrix)直接设置输入/输出矩阵需要自行确保正确性get_line(text)把一行文本切分为词与标签标签必须使用模型创建时的前缀默认__label__小结fastText 的 Python 模块把 C 核心的全部能力以简洁 API 呈现train_unsupervised负责词向量train_supervised负责文本分类统一的_FastText模型对象承担查询、评估、量化与序列化。掌握本文的参数默认值与预处理约定后配合仓库中的示例脚本classification-example.sh、word-vector-example.sh与 python/doc/examples 目录即可快速开展实际项目。【免费下载链接】fastTextLibrary for fast text representation and classification.项目地址: https://gitcode.com/gh_mirrors/fa/fastText创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考