Dies ist ein plattformübergreifender .NET Standard-Wrapper für die FastText-Bibliothek von Facebook. Der Wrapper wird mit gebündelten vorkompilierten nativen Binärdateien für alle drei Plattformen geliefert: Windows, Linux und MacOs.
Fügen Sie es einfach Ihrem Projekt hinzu und beginnen Sie mit der Verwendung! Keine zusätzliche Einrichtung erforderlich. Diese Bibliothek entpackt und ruft je nach Zielplattform die entsprechende native Binärdatei auf.
Natürlich nicht! Es ist gerade fertig :) Es gibt keine größeren Updates für fastText und die meisten Fehler in diesem Repository wurden behoben. Alle Funktionen sollten funktionieren. Wenn etwas nicht funktioniert, pingen Sie mich einfach mit einem Problem an und ich werde versuchen, mich bei Ihnen zu melden.
Die Bibliotheks-API orientiert sich eng an der FastText-Befehlszeilenschnittstelle, sodass Sie direkt loslegen können.
Der einfachste Anwendungsfall besteht darin, ein überwachtes Modell mit Standardparametern zu trainieren. Wir erstellen einen FastTextWrapper
und rufen Supervised()
auf.
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "cooking");
Beachten Sie die Argumente:
Wir geben eine Eingabedatei mit einem beschrifteten Beispiel pro Zeile an. Hier verwenden wir den Stack Overflow-Kochdatensatz von Facebook: https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz. Sie finden extrahierte Dateien, aufgeteilt in Trainings- und Validierungssätze, im UnitTests
-Verzeichnis in diesem Repository.
Ihr Modell wird in cooking.bin
gespeichert und cooking.vec
mit vorab trainierten Vektoren wird im selben Verzeichnis abgelegt.
Hier verwenden wir Supervised()
-Überladung mit 2 Argumenten. Das bedeutet, dass das Training mit Standardparametern durchgeführt wird. Dies ist ein guter Ausgangspunkt und entspricht dem Aufruf von fastText auf diese Weise:
./fasttext supervised -inputcooking.train.txt -outputcooking
Rufen Sie LoadModel()
auf und geben Sie den Pfad zur .bin
-Modelldatei an:
var fastText = new FastTextWrapper();fastText.LoadModel("model.bin");
Um vorab trainierte Vektoren für Ihr überwachtes Modell zu verwenden, erstellen Sie eine Instanz von SupervisedArgs
und passen Sie sie an:
Wichtig: Dies steht nirgendwo in der Originaldokumentation, aber Sie müssen vordefinierte Vektoren im Textformat (Dateierweiterung .vec
) und nicht im Binärformat verwenden. Wenn Sie versuchen, binäre Vektoren zu verwenden, erhalten Sie eine Fehlermeldung, dass Ihre Vektoren die Dimension 0 haben.
var fastText = new FastTextWrapper();var args = new SupervisedArgs{PretrainedVectors = "cooking.unsup.300.vec",dim = 300};fastText.Supervised("cooking.train.txt", "cooking", args);
Hier erhalten wir Standard-Trainingsargumente, geben einen Pfad zur vorab trainierten Vektordatei an und passen die Vektordimension entsprechend an.
Wichtig: Überprüfen Sie immer die Dimension Ihrer vorab trainierten Vektoren! Viele Vektoren im Internet haben die Dimension 300
, aber die Standarddimension für das überwachte FastText-Modelltraining ist 100
.
Jetzt können Sie ein überwachtes Modell ganz einfach anhand eines Validierungssatzes testen. Sie können auch unterschiedliche Werte für k
und threshlod
angeben.
var result = fastText.Test("cooking.valid.txt");
Sie erhalten eine Instanz von TestResult
, in der Sie aggregierte oder pro Label bezogene Metriken finden können:
Console.WriteLine($"Results:ntPrecision: {result.GlobalMetrics.GetPrecision()}" +$"ntRecall: {result.GlobalMetrics.GetRecall()}" +$"ntF1: {result.GlobalMetrics.GetF1()}" );
Sie können sogar eine Präzisions-Erinnerungskurve erhalten (aggregiert oder pro Etikett)! Hier ist ein Beispiel für den Export eines SVG-Plots mit der plattformübergreifenden OxyPlot-Bibliothek:
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));var plotModel = new PlotModel{Series = { 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(plotModel, stream, 600, 600, FALSCH);}
Sie können ein neues überwachtes Modell trainieren und es sofort quantisieren, indem Sie SupervisedArgs
durch QuantizedSupervisedArgs
ersetzen:
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "cooking", new QuantizedSupervisedArgs());
Sie können auch ein vorhandenes Modell laden und quantisieren:
var fastText = new FastTextWrapper();fastText.LoadModel("model.bin");fastText.Quantize();
Verwenden Sie die Methode Unsupervised()
und geben Sie den Modelltyp an: Skipgram oder Cbow:
var fastText = new FastTextWrapper();fastText.Unsupervised(UnsupervisedModel.SkipGram, "cooking.train.nolabels.txt", "cooking");
Sie können ein optionales UnsupervisedArgs
-Argument verwenden, um das Training anzupassen.
Sie können fastText Autotune verwenden, um eine automatische Hyperparametersuche durchzuführen.
Eine vollständige Parameterreferenz finden Sie unter https://github.com/facebookresearch/fastText/blob/master/docs/autotune.md.
Verwenden Sie AutotuneArgs
, um die Optimierung zu steuern:
var fastText = new FastTextWrapper();var autotuneArgs = new AutotuneArgs{Duration = 30, // in SekundenMetric = "precisionAtRecall:30", // unterstützt benutzerdefinierte MetrikenPredictions = 2, // Unterstützt @k PredictionsModelSize = "10M", // Legen Sie dies fest, um ein quantisiertes Modell zu trainieren und eine // zusätzliche Quantisierungs-Hyperparametersuche durchzuführen. Erfordert QuantizedSupervisedArgs.ValidationFile = "cooking.valid.txt" // ERFORDERLICH: Pfad zu einer Validierungsdatei};fastText.Supervised("cooking.train.txt", "cooking", new QuantizedSupervisedArgs(), autotuneArgs);
Sie können Fortschrittsrückrufe von der nativen Bibliothek erhalten. Fügen Sie dazu einen Handler zu (Un)SupervisedArgs.TrainProgressCallback
für einfaches Training oder zu AutotuneArgs.AutotuneProgressCallback
für die Optimierung von Hyperparametern hinzu.
Ein Beispiel für die Verwendung von Trainingsrückrufen mit ShellProgressBar
-Bibliothek finden Sie ConsoleTest
-Projekt:
using (var pBar = new ProgressBar(100, "Training")){var ftArgs = new SupervisedArgs{// ... Other argsverbose = 0,TrainProgressCallback = (progress, loss, wst, lr, eta) =>{pBar. Tick((int)Math.Ceiling(progress * 100), $"Loss: {loss}, Wörter/Thread/Sek: {wst}, LR: {lr}, ETA: {eta}");}};fastText.Supervised("cooking.train.txt", outPath, ftArgs);}
stderr
Ausgabe Die native FastText-Bibliothek meldet den Trainingsfortschritt standardmäßig an stderr
. Sie können diese Ausgabe deaktivieren, indem Sie (Un)SupervisedArgs.verbose = 0
für einfaches Training und AutotuneArgs.Verbose = 0
für die Optimierung von Hyperparametern festlegen.
FastTextWrapper
kann eine kleine Menge an Protokollen erstellen, die sich hauptsächlich auf die native Bibliotheksverwaltung beziehen. Sie können die Protokollierung aktivieren, indem Sie eine Instanz von Microsoft.Extensions.Logging.ILoggerFactory
bereitstellen. In diesem Beispiel verwenden wir Serilog mit Konsolensenke.
Sie können Ihre Standard IloggerFactory
auch über .NET Core DI injizieren.
// Fügen Sie Ihrem Projekt die folgenden Nuget-Pakete hinzu: // * Serilog.Sinks.Console// * Serilog.Extensions.LoggingLog.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.Console(theme: ConsoleTheme.None ).CreateLogger();var fastText = new FastTextWrapper(loggerFactory: new SerilogLoggerFactory());
In Version 1.1
habe ich eine viel bessere native Fehlerbehandlung hinzugefügt. Bei den meisten nativen Fehlern erhalten Sie nun eine schöne NativeLibraryException
, die Sie auf eine detaillierte Fehlerbeschreibung untersuchen können.
Da dieser Wrapper unter der Haube native C++-Binärdateien verwendet, muss Visual C++ Runtime Version 140 installiert sein, wenn er unter Windows ausgeführt wird. Besuchen Sie die MS-Downloads-Seite (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) und wählen Sie die entsprechende Weiterverbreitungsdatei aus.
Wenn Sie daran interessiert sind, FastText mit einer API im C-Stil zu verwenden, finden Sie hier meinen Zweig der offiziellen Bibliothek: https://github.com/olegtarasov/fastText.
1.3.1
Aktualisierte FastText-Binärdateien mit den neuesten Verbesserungen aus dem Facebook-Repo.
1.3.0
Native Bibliotheken werden jetzt explizit in das Zielprojekt einbezogen und in das Ausgabeverzeichnis kopiert. Hoffentlich löst dies einige Probleme mit dem vorherigen Ansatz, Bibliotheken dynamisch aus Ressourcen zu extrahieren.
1.2.5
Fortschrittsrückrufe für unbeaufsichtigtes Modelltraining behoben.
1.2.4
Fortschrittsrückrufe für Modelltraining und Autotuning hinzugefügt.
1.2.3
Überwachte Modellquantisierung mit Quantize
-Methode hinzugefügt.
Stabile Version veröffentlicht!
1.2.2-preview
#20 mit der neuen GetWordVector
-Methode zusammengeführt.
1.2.1-preview
Modell-Autotuning mit Quantisierungsunterstützung hinzugefügt.
Ein schrecklicher Fehler beim bool
-Marshalling wurde behoben.
1.2.0-preview
Version 1.2.0 führt einige wichtige Änderungen an der Bibliotheks-API ein. Wenn Sie nicht zur Migration bereit sind, verwenden Sie Version 1.1.2
.
Wichtige Änderung: Beide veralteten Train()
-Methoden wurden entfernt.
Wichtige Änderung: Veraltete SupervisedArgs
-Klasse entfernt.
Breaking Change: FastTextArgs.SupervisedDefaults()
wurde zugunsten des neuen SupervisedArgs
mit Standardkonstruktor entfernt.
Wichtige Änderung: FastTextArgs
-Klasse kann nicht direkt erstellt werden. Verwenden Sie die neuen SupervisedArgs
und UnsupervisedArgs
-Klassen.
Eine Unsupervised()
Methode zum Trainieren von Skipgram- oder Cbow-Modellen hinzugefügt.
1.1.2
Ein schrecklicher Fehler beim bool
-Marshalling in einem 1.1.*
-Zweig wurde behoben.
1.1.0
, 1.1.1
Im Rahmen der Optimierung der API wurde eine neue Supervised()
Methode hinzugefügt.
Neue Test()
-Methode zum Testen des überwachten Modells hinzugefügt.
Beide Train()
Methoden sind veraltet. Sie werden in Version 1.2.0
entfernt.
1.0.38
Ein schrecklicher Fehler beim bool
-Marshalling in einem 1.0.*
-Zweig wurde behoben.
1.2.0
Verwenden Sie anstelle der alten Train()
Methoden die Methoden Supervised()
und Unsupervised()
.
Verwenden Sie anstelle von FastTextArgs.SupervisedDefaults()
die Überladung SupervisedArgs
oder Supervised()
mit zwei Argumenten.