這是 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"
在這裡,我們獲得預設的訓練參數,提供預訓練向量檔案的路徑並相應地調整向量維度。
重要事項請務必檢查預訓練向量的維度!網路上的許多向量的維度都是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 => newve.Select) ) 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-recall.svg", FileMode.Create, FileAccess.Write)){SvgExporter.Export(繪圖模型、流、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(進度* 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
新增了新的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()
。