Este é um wrapper .NET Standard multiplataforma para a biblioteca FastText do Facebook. O wrapper vem com binários nativos pré-compilados para todas as três plataformas: Windows, Linux e MacOs.
Basta adicioná-lo ao seu projeto e começar a usá-lo! Nenhuma configuração adicional necessária. Esta biblioteca irá descompactar e chamar o binário nativo apropriado dependendo da plataforma de destino.
Claro que não! Está simplesmente completo :) Não há grandes atualizações para fastText e a maioria dos bugs neste repositório foram corrigidos. Todos os recursos devem funcionar e, se algo não funcionar, envie-me um ping com um problema e tentarei entrar em contato com você.
A API da biblioteca segue de perto a interface de linha de comando fastText, para que você possa começar imediatamente.
O caso de uso mais simples é treinar um modelo supervisionado com parâmetros padrão. Criamos um FastTextWrapper
e chamamos Supervised()
.
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "cooking");
Observe os argumentos:
Especificamos um arquivo de entrada com um exemplo rotulado por linha. Aqui usamos o conjunto de dados de culinária Stack Overflow do Facebook: https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz. Você pode encontrar arquivos extraídos divididos em conjuntos de treinamento e validação no diretório UnitTests
neste repositório.
Seu modelo será salvo em cooking.bin
e cooking.vec
com vetores pré-treinados serão colocados no mesmo diretório.
Aqui usamos sobrecarga Supervised()
com 2 argumentos. Isso significa que o treinamento será feito com parâmetros padrão. É um bom ponto de partida e é o mesmo que chamar fastText desta forma:
./fasttext supervisionado -input Cooking.train.txt -output Cooking
Chame LoadModel()
e especifique o caminho para o arquivo de modelo .bin
:
var fastText = new FastTextWrapper();fastText.LoadModel("model.bin");
Para usar vetores pré-treinados para seu modelo supervisionado, crie uma instância de SupervisedArgs
e personalize-a:
Importante Não diz isso em nenhum lugar da documentação original, mas você deve usar vetores pré-definidos em formato de texto (extensão de arquivo .vec
) e não em formato binário. Se você tentar usar vetores binários, receberá um erro sobre seus vetores terem dimensão 0.
var fastText = new FastTextWrapper();var args = new SupervisedArgs{PretrainedVectors = "cooking.unsup.300.vec",dim = 300};fastText.Supervised("cooking.train.txt", "cooking", args);
Aqui obtemos argumentos de treinamento padrão, fornecemos um caminho para o arquivo de vetores pré-treinados e ajustamos a dimensão do vetor de acordo.
Importante Certifique-se de sempre verificar a dimensão dos seus vetores pré-treinados! Muitos vetores na Internet têm dimensão 300
, mas a dimensão padrão para treinamento de modelo supervisionado fastText é 100
.
Agora você pode testar facilmente um modelo supervisionado em relação a um conjunto de validação. Você também pode especificar valores diferentes para k
e threshlod
.
var resultado = fastText.Test("cooking.valid.txt");
Você obterá uma instância de TestResult
onde poderá encontrar métricas agregadas ou por rótulo:
Console.WriteLine($"Resultados:ntPrecision: {result.GlobalMetrics.GetPrecision()}" +$"ntRecall: {result.GlobalMetrics.GetRecall()}" +$"ntF1: {result.GlobalMetrics.GetF1()}" );
Você pode até obter uma curva de recuperação de precisão (agregada ou por rótulo)! Aqui está um exemplo de exportação de um gráfico SVG com a biblioteca OxyPlot de plataforma cruzada:
var resultado = 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{Série = {série },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, false);}
Você pode treinar um novo modelo supervisionado e quantizá-lo imediatamente substituindo SupervisedArgs
por QuantizedSupervisedArgs
:
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "cooking", new QuantizedSupervisedArgs());
Você também pode carregar um modelo existente e quantizá-lo:
var fastText = new FastTextWrapper();fastText.LoadModel("model.bin");fastText.Quantize();
Use o método Unsupervised()
especificando o tipo de modelo: Skipgram ou Cbow:
var fastText = new FastTextWrapper();fastText.Unsupervised(UnsupervisedModel.SkipGram, "cooking.train.nolabels.txt", "cooking");
Você pode usar um argumento UnsupervisedArgs
opcional para personalizar o treinamento.
Você pode usar o ajuste automático do fastText para fazer uma pesquisa automática de hiperparâmetros.
Consulte https://github.com/facebookresearch/fastText/blob/master/docs/autotune.md para referência completa dos parâmetros.
Use AutotuneArgs
para controlar o ajuste:
var fastText = new FastTextWrapper();var autotuneArgs = new AutotuneArgs{Duration = 30, // em segundosMetric = "precisionAtRecall:30", // suporta métricas personalizadasPredictions = 2, // Suporta @k previsõesModelSize = "10M", // Defina isso para treinar um modelo quantizado e fazer uma // pesquisa adicional de hiperparâmetros de quantização. Requer QuantizedSupervisedArgs.ValidationFile = "cooking.valid.txt" // OBRIGATÓRIO: caminho para um arquivo de validação};fastText.Supervised("cooking.train.txt", "cooking", new QuantizedSupervisedArgs(), autotuneArgs);
Você pode obter retornos de chamada de progresso na biblioteca nativa. Para fazer isso, adicione um manipulador a (Un)SupervisedArgs.TrainProgressCallback
para treinamento simples ou a AutotuneArgs.AutotuneProgressCallback
para ajuste de hiperparâmetros.
Consulte o projeto ConsoleTest
para obter um exemplo de uso de retornos de chamada de treinamento com a biblioteca ShellProgressBar
:
usando (var pBar = new ProgressBar(100, "Treinamento")){var ftArgs = new SupervisedArgs{// ... Outros argsverbose = 0,TrainProgressCallback = (progresso, perda, wst, lr, eta) =>{pBar. Tick((int)Math.Ceiling(progress * 100), $"Perda: {perda}, palavras/thread/seg: {wst}, LR: {lr}, ETA: {eta}");}};fastText.Supervised("cooking.train.txt", outPath, ftArgs);}
stderr
A biblioteca FastText nativa relata o progresso do treinamento para stderr
por padrão. Você pode desativar essa saída definindo (Un)SupervisedArgs.verbose = 0
para treinamento simples e AutotuneArgs.Verbose = 0
para ajuste de hiperparâmetros.
FastTextWrapper
pode produzir uma pequena quantidade de logs, principalmente relacionados ao gerenciamento de biblioteca nativa. Você pode ativar o log fornecendo uma instância de Microsoft.Extensions.Logging.ILoggerFactory
. Neste exemplo usamos Serilog com coletor de console.
Você também pode injetar seu IloggerFactory
padrão por meio do .NET Core DI.
// Adicione os seguintes pacotes Nuget ao seu projeto: // * Serilog.Sinks.Console// * Serilog.Extensions.LoggingLog.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.Console(theme: ConsoleTheme.None ).CreateLogger();var fastText = new FastTextWrapper(loggerFactory: new SerilogLoggerFactory());
Na versão 1.1
adicionei um tratamento de erros nativo muito melhor. Agora, no caso da maioria dos erros nativos, você obterá uma boa NativeLibraryException
que pode ser inspecionada para obter uma descrição detalhada do erro.
Como esse wrapper usa binários C++ nativos, você precisará ter o Visual C++ Runtime Versão 140 instalado ao executar no Windows. Visite a página de downloads do MS (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) e selecione o redistribuível apropriado.
Se você estiver interessado em usar FastText com API estilo C, aqui está meu fork da biblioteca oficial: https://github.com/olegtarasov/fastText.
1.3.1
Binários fastText atualizados com as melhorias mais recentes do repositório do Facebook.
1.3.0
As bibliotecas nativas agora são incluídas explicitamente no projeto de destino e copiadas para o diretório de saída. Esperamos que isso resolva alguns problemas com a abordagem anterior de extração dinâmica de bibliotecas de recursos.
1.2.5
Corrigidos retornos de chamada de progresso para treinamento de modelo não supervisionado.
1.2.4
Adicionados retornos de chamada de progresso para treinamento de modelo e ajuste automático.
1.2.3
Adicionada quantização de modelo supervisionado com método Quantize
.
Versão estável lançada!
1.2.2-preview
Mesclado #20 com o novo método GetWordVector
.
1.2.1-preview
Adicionado ajuste automático de modelo com suporte de quantização.
Corrigido um bug horrível com bool
marshalling.
1.2.0-preview
A versão 1.2.0 introduz algumas alterações importantes na API da biblioteca. Se você não estiver pronto para migrar, use a versão 1.1.2
.
Alteração significativa: ambos os métodos Train()
obsoletos foram removidos.
Alteração significativa: classe SupervisedArgs
obsoleta removida.
Alteração significativa: FastTextArgs.SupervisedDefaults()
removido em favor do novo SupervisedArgs
com construtor padrão.
Alteração significativa: a classe FastTextArgs
não pode ser construída diretamente, use as novas classes SupervisedArgs
e UnsupervisedArgs
.
Adicionado um método Unsupervised()
para treinar modelos Skipgram ou Cbow.
1.1.2
Corrigido um bug horrível com bool
marshalling em um branch 1.1.*
.
1.1.0
, 1.1.1
Adicionado novo método Supervised()
como parte da simplificação da API.
Adicionado novo método Test()
para testar o modelo supervisionado.
Ambos os métodos Train()
foram preteridos. Eles serão removidos na versão 1.2.0
.
1.0.38
Corrigido um bug horrível com bool
marshalling em um branch 1.0.*
.
1.2.0
Em vez dos métodos Train()
antigos, use os métodos Supervised()
e Unsupervised()
.
Em vez de FastTextArgs.SupervisedDefaults()
use sobrecarga SupervisedArgs
ou Supervised()
com 2 argumentos.