นี่คือ wrapper .NET Standard ข้ามแพลตฟอร์มสำหรับไลบรารี FastText ของ Facebook Wrapper มาพร้อมกับไบนารีเนทีฟที่คอมไพล์แล้วสำหรับทั้งสามแพลตฟอร์ม: Windows, Linux และ MacO
เพียงเพิ่มลงในโปรเจ็กต์ของคุณแล้วเริ่มใช้งาน! ไม่จำเป็นต้องตั้งค่าเพิ่มเติม ไลบรารีนี้จะแตกไฟล์และเรียกไบนารีเนทีฟที่เหมาะสมโดยขึ้นอยู่กับแพลตฟอร์มเป้าหมาย
ไม่แน่นอน! เสร็จสมบูรณ์แล้ว :) ไม่มีการอัปเดตที่สำคัญสำหรับ fastText และข้อบกพร่องส่วนใหญ่ในพื้นที่เก็บข้อมูลนี้ได้รับการแก้ไขแล้ว ฟีเจอร์ทั้งหมดควรใช้งานได้และหากมีบางอย่างไม่ทำงาน เพียงแค่แจ้งปัญหามาให้ฉันแล้วเราจะพยายามติดต่อกลับ
Library API ติดตามอินเทอร์เฟซบรรทัดคำสั่ง fastText อย่างใกล้ชิด ดังนั้นคุณจึงสามารถข้ามได้ทันที
กรณีการใช้งานที่ง่ายที่สุดคือการฝึกโมเดลภายใต้การดูแลด้วยพารามิเตอร์เริ่มต้น เราสร้าง FastTextWrapper และเรียก Supervised()
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "ทำอาหาร");สังเกตข้อโต้แย้ง:
เราระบุไฟล์อินพุตด้วยตัวอย่างที่มีป้ายกำกับหนึ่งตัวอย่างต่อบรรทัด ที่นี่เราใช้ชุดข้อมูลการทำอาหาร Stack Overflow จาก Facebook: https://dl.fbaipublicfiles.com/fasttext/data/cooking.stackexchange.tar.gz คุณสามารถค้นหาไฟล์ที่แยกออกมาซึ่งแบ่งออกเป็นชุดการฝึกอบรมและการตรวจสอบความถูกต้องในไดเรกทอรี UnitTests ในที่เก็บนี้
โมเดลของคุณจะถูกบันทึกลงใน cooking.bin และ cooking.vec พร้อมด้วยเวกเตอร์ที่ฝึกไว้แล้วจะถูกวางไว้หากอยู่ในไดเร็กทอรีเดียวกัน
ที่นี่เราใช้ Supervised() โอเวอร์โหลดกับ 2 อาร์กิวเมนต์ ซึ่งหมายความว่าการฝึกอบรมจะดำเนินการโดยใช้พารามิเตอร์เริ่มต้น เป็นจุดเริ่มต้นที่ดีและเหมือนกับการเรียก fastText ด้วยวิธีนี้:
./fasttext ดูแล -input Cooking.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 = 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 => ใหม่ DataPoint(x.recall, x.precision)).OrderBy(x => xX));var plotModel = new PlotModel{Series = { ซีรี่ส์ },Axes ={LinearAxis ใหม่ {Position = AxisPosition.Bottom, Title = "Recall"},LinearAxis ใหม่ {Position = AxisPosition.Left, Title = "Precision"}}}; การใช้ (var stream = new FileStream("precision- Recall.svg", FileMode.Create, FileAccess.Write)){SvgExporter.Export (plotModel, สตรีม, 600, 600, เท็จ);} 
คุณสามารถฝึกโมเดลภายใต้การดูแลใหม่และวัดปริมาณได้ทันทีโดยแทนที่ SupervisedArgs ด้วย QuantizedSupervisedArgs :
var fastText = new FastTextWrapper();fastText.Supervised("cooking.train.txt", "cooking", ใหม่ 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, // in secondsMetric = "precisionAtRecall:30", // รองรับ metricsPredictions แบบกำหนดเอง = 2, // รองรับ @kการคาดการณ์ ModelSize = "10M", // ตั้งค่านี้เพื่อฝึกโมเดลเชิงปริมาณและทำ // ค้นหาไฮเปอร์พารามิเตอร์เชิงปริมาณเพิ่มเติม Requires QuantizedSupervisedArgs.ValidationFile = "cooking.valid.txt" // REQUIRED: path to a validation file};fastText.Supervised("cooking.train.txt", "cooking", new QuantizedSupervisedArgs(), autotuneArgs); คุณสามารถรับการเรียกกลับความคืบหน้าได้จากไลบรารีดั้งเดิม ในการทำเช่นนั้น ให้เพิ่มตัวจัดการไปที่ (Un)SupervisedArgs.TrainProgressCallback สำหรับการฝึกแบบง่ายๆ หรือไปที่ AutotuneArgs.AutotuneProgressCallback สำหรับการปรับแต่งไฮเปอร์พารามิเตอร์
ดูโปรเจ็กต์ ConsoleTest สำหรับตัวอย่างการใช้การฝึกอบรมการโทรกลับกับไลบรารี ShellProgressBar :
การใช้ (var pBar = new ProgressBar(100, "Training")){var ftArgs = new SupervisedArgs{// ... Other argsverbose = 0,TrainProgressCallback = (ความคืบหน้า, การสูญเสีย, wst, lr, eta) =>{pBar. ติ๊ก((int)Math.Ceiling(ความคืบหน้า * 100), $"ขาดทุน: {loss}, คำ/เธรด/วินาที: {wst}, LR: {lr}, การทางพิเศษแห่งประเทศไทย: {eta}");}};fastText.Supervised("cooking.train.txt", outPath, ftArgs);} 
stderr ไลบรารี Native 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 = new FastTextWrapper(loggerFactory: new SerilogLoggerFactory());
ในเวอร์ชัน 1.1 ฉันได้เพิ่มการจัดการข้อผิดพลาดดั้งเดิมที่ดีขึ้นมาก ในกรณีของข้อผิดพลาดเนทิฟส่วนใหญ่ คุณจะได้รับ NativeLibraryException ที่ดี ซึ่งคุณสามารถตรวจสอบคำอธิบายข้อผิดพลาดโดยละเอียดได้
เนื่องจาก Wrapper นี้ใช้ไบนารี C++ ดั้งเดิมภายใต้ประทุน คุณจึงต้องติดตั้ง Visual C++ Runtime เวอร์ชัน 140 เมื่อทำงานภายใต้ Windows ไปที่หน้าดาวน์โหลด MS (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) และเลือกแจกจ่ายต่อที่เหมาะสม
หากคุณสนใจที่จะใช้ FastText กับ C-style API นี่คือทางแยกของไลบรารีอย่างเป็นทางการของฉัน: https://github.com/olegtarasov/fastText
1.3.1อัปเดตไบนารี fastText ด้วยการปรับปรุงล่าสุดจาก repo ของ 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 marshalling
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 marshalling ในสาขา 1.1.*
1.1.0 , 1.1.1 เพิ่มวิธี Supervised() ใหม่ซึ่งเป็นส่วนหนึ่งของการปรับปรุง API
เพิ่มวิธี Test() ใหม่สำหรับการทดสอบโมเดลภายใต้การดูแล
เลิกใช้ทั้งสองวิธี Train() พวกเขาจะถูกลบออกในเวอร์ชัน 1.2.0
1.0.38 แก้ไขข้อผิดพลาดอันน่าสยดสยองด้วย bool marshalling ในสาขา 1.0.*
1.2.0 แทนที่จะใช้วิธี Train() แบบเก่า ให้ใช้วิธีการ Supervised() และ Unsupervised()
แทนที่จะใช้ FastTextArgs.SupervisedDefaults() ให้ใช้ SupervisedArgs หรือ Supervised() โอเวอร์โหลดด้วย 2 อาร์กิวเมนต์