catalyst 是一个用 C# 构建的自然语言处理库,追求速度。受 spaCy的设计 启发,它提供了预训练的模型、开箱即用的词和文档嵌入训练支持,以及灵活的实体识别模型。
⚡ 特性
- 现代的、纯 C# 编写的快速 NLP 库,支持 .NET 标准 2.0
- 跨平台,支持运行在 .NET core 的任意地方 - Windows、Linux、macOS 甚至 ARM
- 非破坏性的 词元化,>99.9% 无正则表达式的 RegEx-free,在现代 CPU 上每秒处理 >1M 个词元
- 命名实体识别(词典,基于规则 和 基于感知器)
- 基于 Universal Dependencies 项目的预训练模型
- 自定义模型学习 缩略语 和 意义
- 开箱即用的 FastText 和 StarSpace 嵌入训练支持(预训练模型即将推出)
- 词性标注
- 使用 FastText 或 cld3 的语言检测
- 基于 MessagePack 的高效二进制序列化
- 为 语言包 提供的预构建模型 ✨
- 词形还原 ✨(使用从 spaCy 移植的查找表)
语言包 ✨
所有语言特定的数据和模型作为 NuGet 包提供,您可以在 这里 找到所有包。
新模型基于最新发布的 Universal Dependencies v2.7 进行训练。
我们还添加了使用流来存储和加载模型的选项:
// 创建并存储模型
var isApattern = new PatternSpotter(Language.English, 0, tag: "is-a-pattern", captureTag: "IsA");
isApattern.NewPattern(
"Is+Noun",
mp => mp.Add(
new PatternUnit(P.Single().WithToken("is").WithPOS(PartOfSpeech.VERB)),
new PatternUnit(P.Multiple().WithPOS(PartOfSpeech.NOUN, PartOfSpeech.PROPN, PartOfSpeech.AUX, PartOfSpeech.DET, PartOfSpeech.ADJ))
));
using(var f = File.OpenWrite("my-pattern-spotter.bin"))
{
await isApattern.StoreAsync(f);
}
// 从磁盘加载模型
var isApattern2 = new PatternSpotter(Language.English, 0, tag: "is-a-pattern", captureTag: "IsA");
using(var f = File.OpenRead("my-pattern-spotter.bin"))
{
await isApattern2.LoadAsync(f);
}
✨ 快速入门
使用 catalyst 就像安装其 NuGet 包 一样简单,并将存储设置为使用我们的在线仓库。这样,模型将懒加载,无论是从磁盘还是从我们的在线仓库下载。也可以查看一些 示例项目 以获取更多关于如何使用 catalyst 的例子。
Catalyst.Models.English.Register(); // 您需要预先注册每种语言(并安装相应的 NuGet 包)
Storage.Current = new DiskStorage("catalyst-models");
var nlp = await Pipeline.ForAsync(Language.English);
var doc = new Document("The quick brown fox jumps over the lazy dog", Language.English);
nlp.ProcessSingle(doc);
Console.WriteLine(doc.ToJson());
您还可以利用 C# 的懒汉求值和本地多线程支持并行处理大量文档:
var docs = GetDocuments();
var parsed = nlp.Process(docs);
DoSomething(parsed);
IEnumerable<IDocument> GetDocuments()
{
// 生成一些文档,以展示多线程和懒汉求值
for(int i = 0; i < 1000; i++)
{
yield return new Document("The quick brown fox jumps over the lazy dog", Language.English);
}
}
void DoSomething(IEnumerable<IDocument> docs)
{
foreach(var doc in docs)
{
Console.WriteLine(doc.ToJson());
}
}
训练一个新的 FastText word2vec 嵌入模型就像这样简单:
var nlp = await Pipeline.ForAsync(Language.English);
var ft = new FastText(Language.English, 0, "wiki-word2vec");
ft.Data.Type = FastText.ModelType.CBow;
ft.Data.Loss = FastText.LossType.NegativeSampling;
ft.Train(nlp.Process(GetDocs()));
ft.StoreAsync();
为了快速嵌入搜索,我们还在 NuGet 上发布了基于我们分支的微软 HNSW.Net 的 "Hierarchical Navigable Small World" (HNSW) 算法的 C# 版本。我们还在 GitHub 和 NuGet 上发布了“统一流形近似和投影”(UMAP)算法的 C# 版本用于降维。