这是 Facebook FastText 库的跨平台 .NET Standard 包装器。该包装器附带了适用于所有三个平台的捆绑预编译本机二进制文件:Windows、Linux 和 MacO。
只需将其添加到您的项目中并开始使用它!无需额外设置。该库将根据目标平台解压并调用适当的本机二进制文件。
当然不是!它刚刚完成:) fastText 没有重大更新,并且此存储库中的大多数错误都已修复。所有功能都应该可以使用,如果有什么功能不能使用,只需向我提出问题,我会尽力回复您。
库 API 紧密遵循 fastText 命令行界面,因此您可以直接使用。
最简单的用例是使用默认参数训练监督模型。我们创建一个FastTextWrapper
并调用Supervised()
。
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "cooking");
注意参数:
我们指定一个输入文件,每行一个带标签的示例。这里我们使用来自 Facebook 的 Stack Overflow 烹饪数据集:https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz。您可以在此存储库的UnitTests
目录中找到分成训练集和验证集的提取文件。
您的模型将保存到cooking.bin
中,如果同一目录中,则将放置带有预训练向量的cooking.vec
。
这里我们使用带有 2 个参数的Supervised()
重载。这意味着训练将使用默认参数完成。这是一个很好的起点,与以这种方式调用 fastText 相同:
./fasttext 监督-输入烹饪.train.txt -输出烹饪
调用LoadModel()
并指定.bin
模型文件的路径:
var fastText = new FastTextWrapper();fastText.LoadModel("model.bin");
要将预训练向量用于监督模型,请创建SupervisedArgs
的实例并对其进行自定义:
重要原始文档中的任何地方都没有说明这一点,但您必须使用文本格式( .vec
文件扩展名)的预训练向量,而不是二进制格式。如果您尝试使用二元向量,您将收到关于维度为 0 的向量的错误。
var fastText = new FastTextWrapper();var args = new SupervisedArgs{PretrainedVectors = "cooking.unsup.300.vec",dim = 300};fastText.Supervised("cooking.train.txt", "cooking", args);
在这里,我们获得默认的训练参数,提供预训练向量文件的路径并相应地调整向量维度。
重要事项请务必检查预训练向量的维度!互联网上的许多向量的维度都是300
,但 fastText 监督模型训练的默认维度是100
。
现在,您可以轻松地根据验证集测试监督模型。您也可以为k
和threshlod
指定不同的值。
var result = fastText.Test("cooking.valid.txt");
您将获得一个TestResult
实例,您可以在其中找到聚合或每个标签的指标:
Console.WriteLine($"结果:ntPrecision:{result.GlobalMetrics.GetPrecision()}" +$"ntRecall:{result.GlobalMetrics.GetRecall()}" +$"ntF1:{result.GlobalMetrics.GetF1()}" );
您甚至可以获得精确召回曲线(聚合或每个标签)!以下是使用跨平台 OxyPlot 库导出 SVG 绘图的示例:
var result = fastText.Test("cooking.valid.txt");var curve = result.GetPrecisionRecallCurve();var series = new LineSeries {StrokeThickness = 1};series.Points.AddRange(curve.Select(x => new) DataPoint(x.recall, x. precision)).OrderBy(x => xX));varplotModel = new PlotModel{Series = { 系列},Axes ={new LinearAxis {Position = AxisPosition.Bottom, Title = "Recall"},new LinearAxis {Position = AxisPosition.Left, Title = "Precision"}}};using (var stream = new FileStream(" precision-召回.svg", FileMode.Create, FileAccess.Write)){SvgExporter.Export(plotModel, 流, 600, 600, 错误的);}
您可以训练新的监督模型并通过将SupervisedArgs
替换为QuantizedSupervisedArgs
来立即量化它:
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "烹饪", new QuantizedSupervisedArgs());
您还可以加载现有模型并对其进行量化:
var fastText = new FastTextWrapper();fastText.LoadModel("model.bin");fastText.Quantize();
使用Unsupervised()
方法指定模型类型:Skipgram 或 Cbow:
var fastText = new FastTextWrapper();fastText.Unsupervised(UnsupervisedModel.SkipGram, "cooking.train.nolabels.txt", "烹饪");
您可以使用可选的UnsupervisedArgs
参数来自定义训练。
您可以使用 fastText 自动调谐来执行自动超参数搜索。
请参阅 https://github.com/facebookresearch/fastText/blob/master/docs/autotune.md 以获取完整的参数参考。
使用AutotuneArgs
控制调整:
var fastText = new FastTextWrapper();var autotuneArgs = new AutotuneArgs{Duration = 30, // 以秒为单位Metric = " precisionAtRecall:30", // 支持自定义指标Predictions = 2, // 支持@k PredictionsModelSize = "10M", //设置此项以训练量化模型并执行 // 额外的量化超参数搜索。需要 QuantizedSupervisedArgs.ValidationFile = "cooking.valid.txt" // 必需:验证文件的路径};fastText.Supervised("cooking.train.txt", "cooking", new QuantizedSupervisedArgs(), autotuneArgs);
您可以从本机库获取进度回调。为此,请将处理程序添加到(Un)SupervisedArgs.TrainProgressCallback
进行简单训练,或添加到AutotuneArgs.AutotuneProgressCallback
进行超参数调整。
有关使用ShellProgressBar
库训练回调的示例,请参阅ConsoleTest
项目:
using (var pBar = new ProgressBar(100, "Training")){var ftArgs = new SupervisedArgs{// ... 其他 argsverbose = 0,TrainProgressCallback = (progress, loss, wst, lr, eta) =>{pBar. Tick((int)Math.Ceiling(progress * 100), $"损失:{loss},字数/线程/秒: {wst},LR:{lr},预计到达时间:{eta}");}};fastText.Supervised("cooking.train.txt",outPath,ftArgs);}
stderr
输出默认情况下,本机 FastText 库会向stderr
报告训练进度。您可以通过设置(Un)SupervisedArgs.verbose = 0
进行简单训练和设置AutotuneArgs.Verbose = 0
进行超参数调整来关闭此输出。
FastTextWrapper
可以生成少量日志,主要涉及本机库管理。您可以通过提供Microsoft.Extensions.Logging.ILoggerFactory
的实例来打开日志记录。在此示例中,我们将 Serilog 与控制台接收器一起使用。
您还可以通过 .NET Core DI 注入标准IloggerFactory
。
// 将以下 Nuget 包添加到您的项目中:// * Serilog.Sinks.Console // * Serilog.Extensions.LoggingLog.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.Console(theme: ConsoleTheme.None ).CreateLogger();var fastText = new FastTextWrapper(loggerFactory: new SerilogLoggerFactory());
在1.1
版本中,我添加了更好的本机错误处理。现在,如果出现大多数本机错误,您将得到一个很好的NativeLibraryException
,您可以检查它以获取详细的错误描述。
由于此包装器在底层使用本机 C++ 二进制文件,因此在 Windows 下运行时需要安装 Visual C++ 运行时版本 140。访问 MS 下载页面 (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) 并选择适当的可再发行组件。
如果您有兴趣使用带有 C 风格 API 的 FastText,这里是我的官方库分支:https://github.com/olegtarasov/fastText。
1.3.1
使用 Facebook 存储库的最新改进更新了 fastText 二进制文件。
1.3.0
本机库现在明确包含在目标项目中并复制到输出目录。希望这可以解决以前从资源中动态提取库的方法的一些问题。
1.2.5
修复了无监督模型训练的进度回调。
1.2.4
添加了模型训练和自动调整的进度回调。
1.2.3
添加了使用Quantize
方法进行监督模型量化。
稳定版发布!
1.2.2-preview
将 #20 与新的GetWordVector
方法合并。
1.2.1-preview
添加了具有量化支持的模型自动调整。
修复了bool
编组的一个可怕错误。
1.2.0-preview
版本 1.2.0 对库 API 进行了一些重大更改。如果您尚未准备好迁移,请使用 v. 1.1.2
。
重大更改:删除了两个已弃用的Train()
方法。
重大更改:删除了已弃用的SupervisedArgs
类。
重大更改:删除了FastTextArgs.SupervisedDefaults()
转而使用带有默认构造函数的新SupervisedArgs
。
重大更改:无法直接构造FastTextArgs
类,请使用新的SupervisedArgs
和UnsupervisedArgs
类。
添加了Unsupervised()
方法来训练 Skipgram 或 Cbow 模型。
1.1.2
修复了1.1.*
分支上bool
的可怕错误。
1.1.0
1.1.1
添加了新的Supervised()
方法作为简化 API 的一部分。
添加了新的Test()
方法来测试监督模型。
已弃用这两种Train()
方法。它们将在 v. 1.2.0
中被删除。
1.0.38
修复了1.0.*
分支上bool
的可怕错误。
1.2.0
版本迁移指南使用Supervised()
和Unsupervised()
方法代替旧的Train()
方法。
使用带有 2 个参数的SupervisedArgs
或Supervised()
重载代替FastTextArgs.SupervisedDefaults()
。