Это кроссплатформенная оболочка .NET Standard для библиотеки Facebook FastText. Оболочка поставляется с предварительно скомпилированными собственными двоичными файлами для всех трех платформ: Windows, Linux и MacOs.
Просто добавьте его в свой проект и начните использовать! Никакой дополнительной настройки не требуется. Эта библиотека распакует и вызовет соответствующий собственный двоичный файл в зависимости от целевой платформы.
Конечно, нет! Он просто готов :) Для fastText нет серьезных обновлений, и большинство ошибок в этом репозитории исправлено. Все функции должны работать, а если что-то не работает, просто сообщите мне о проблеме, и я постараюсь ответить вам.
API библиотеки точно соответствует интерфейсу командной строки fastText, поэтому вы можете сразу приступить к работе.
Самый простой вариант использования — обучение контролируемой модели с параметрами по умолчанию. Мы создаем FastTextWrapper
и вызываем Supervised()
.
var fastText = новый FastTextWrapper();fastText.Supervised("cooking.train.txt", "cooking");
Обратите внимание на аргументы:
Мы указываем входной файл с одним помеченным примером в строке. Здесь мы используем набор кулинарных данных Stack Overflow из Facebook: https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz. Вы можете найти извлеченные файлы, разделенные на наборы обучения и проверки, в каталоге UnitTests
этого репозитория.
Ваша модель будет сохранена в cooking.bin
и cooking.vec
с предварительно обученными векторами, если они будут помещены в тот же каталог.
Здесь мы используем перегрузку Supervised()
с двумя аргументами. Это означает, что обучение будет проводиться с параметрами по умолчанию. Это хорошая отправная точка, и она аналогична вызову fastText следующим образом:
./fasttext контролируемое -входное приготовление.train.txt -выходное приготовление
Вызовите LoadModel()
и укажите путь к файлу модели .bin
:
var fastText = новый 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($"Results:ntPrecision: {result.GlobalMetrics.GetPrecision()}" +$"ntRecall: {result.GlobalMetrics.GetRecall()}" +$"ntF1: {result.GlobalMetrics.GetF1()}" );
Вы даже можете получить кривую точного отзыва (агрегированную или по каждой метке)! Вот пример экспорта графика SVG с помощью кроссплатформенной библиотеки OxyPlot:
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 = { series}, Axes = {new LinearAxis {Position = AxisPosition.Bottom, Title = "Recall"}, new LinearAxis {Position = AxisPosition.Left, Title = "Precision"}}}; using (varstream = новый FileStream("precision-recall.svg", FileMode.Create, FileAccess.Write)){SvgExporter.Export(plotModel, поток, 600, 600, false);}
Вы можете обучить новую контролируемую модель и немедленно ее квантовать, заменив SupervisedArgs
на QuantizedSupervisedArgs
:
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "cooking", new QuantizedSupervisedArgs());
Вы также можете загрузить существующую модель и квантовать ее:
вар fastText = новый FastTextWrapper();fastText.LoadModel("model.bin");fastText.Quantize();
Используйте метод Unsupervised()
, указав тип модели: Skipgram или Cbow:
var fastText = новый 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
для настройки гиперпараметров.
См. проект ConsoleTest
для примера использования обучающих обратных вызовов с библиотекой ShellProgressBar
:
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}, слов/поток/сек: {wst}, LR: {lr}, ETA: {eta}");}};fastText.Supervised("cooking.train.txt", outPath, ftArgs);}
stderr
Встроенная библиотека FastText по умолчанию сообщает о ходе обучения в stderr
. Вы можете отключить этот вывод, установив (Un)SupervisedArgs.verbose = 0
для простого обучения и AutotuneArgs.Verbose = 0
для настройки гиперпараметров.
FastTextWrapper
может создавать небольшое количество журналов, в основном касающихся управления собственной библиотекой. Вы можете включить вход в систему, предоставив экземпляр Microsoft.Extensions.Logging.ILoggerFactory
. В этом примере мы используем Serilog с консольным приемником.
Вы также можете внедрить стандартную IloggerFactory
через .NET Core DI.
// Добавьте в свой проект следующие пакеты Nuget:// * Serilog.Sinks.Console// * Serilog.Extensions.LoggingLog.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.Console(theme: ConsoleTheme.None ).CreateLogger();var fastText = новый FastTextWrapper(loggerFactory: new SerilogLoggerFactory());
В версии 1.1
я добавил гораздо лучшую встроенную обработку ошибок. Теперь в случае большинства собственных ошибок вы получите хорошее NativeLibraryException
, которое вы можете проверить для получения подробного описания ошибки.
Поскольку эта оболочка использует собственные двоичные файлы C++, вам потребуется установить среду выполнения Visual C++ версии 140 при работе под Windows. Посетите страницу загрузок MS (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) и выберите соответствующий распространяемый файл.
Если вы заинтересованы в использовании FastText с API в стиле C, вот моя вилка официальной библиотеки: https://github.com/olegtarasov/fastText.
1.3.1
Обновлены двоичные файлы fastText с учетом последних улучшений из репозитория Facebook.
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 библиотеки. Если вы не готовы к миграции, используйте версию 1.1.2
.
Критическое изменение: удалены оба устаревших метода Train()
.
Критическое изменение: удален устаревший класс SupervisedArgs
.
Критическое изменение: удален FastTextArgs.SupervisedDefaults()
в пользу нового SupervisedArgs
с конструктором по умолчанию.
Критическое изменение: класс FastTextArgs
нельзя создать напрямую, используйте новые классы SupervisedArgs
и UnsupervisedArgs
.
Добавлен метод Unsupervised()
для обучения моделей Skipgram или Cbow.
1.1.2
Исправлена ужасная ошибка с маршалингом bool
в ветке 1.1.*
.
1.1.0
, 1.1.1
Добавлен новый метод Supervised()
в рамках оптимизации API.
Добавлен новый метод Test()
для тестирования контролируемой модели.
Устарели оба метода Train()
. Они будут удалены в версии 1.2.0
.
1.0.38
Исправлена ужасная ошибка с маршалингом bool
в ветке 1.0.*
.
1.2.0
Вместо старых методов Train()
используйте методы Supervised()
и Unsupervised()
.
Вместо FastTextArgs.SupervisedDefaults()
используйте перегрузку SupervisedArgs
или Supervised()
с двумя аргументами.