跳转到主要内容

基于快速有限状态机的NLP库的Python包装器。

项目描述

Bling Fire

简介

嗨,我们是在微软的Bling团队(超越语言理解),我们帮助Bing变得更聪明。在这里,我们想与大家分享我们的有限状态机(FIRE)和正则表达式操作库(FIRE)。我们在Bing内部使用Fire进行许多语言操作,例如分词、多词表达式匹配、未知词猜测、词干提取/词元化等。

Bling Fire分词器概述

Bling Fire分词器为自然语言文本分词提供了最先进的功能。Bling Fire支持以下分词算法

  1. 基于模式的分词
  2. WordPiece 分词
  3. SentencePiece 单词模型
  4. SentencePiece BPE
  5. 诱导/学习到的音节化模式(在标记内识别可能的连字符点)

Bling Fire为所有四种算法提供统一的接口,因此客户端使用tokenizer时对XLNET、BERT或自定义模型没有区别。

模型文件描述了它们所构建的算法,并且可以从外部文件按需加载。还有两个默认模型用于NLTK风格的分词和句子分割,不需要加载。默认分词模型遵循NLTK的逻辑,除了连字符单词被分割和修复了一些“错误”。

可以将归一化添加到每个模型中,但这不是必需的。

算法之间的差异总结如下:

Bling Fire Tokenizer 的高级API设计得非常简单,它不需要最小或没有配置、初始化或额外的文件,并且对Python、Ruby、Rust、C#、JavaScript(通过WASM)等语言的使用非常友好。

我们预编译了一些流行的模型,并在下面的源代码引用中列出。

文件名 应使用的模型 算法 源代码
wbd.bin 默认分词模型 基于模式 src
sbd.bin 默认句子分割模型 基于模式 src
bert_base_tok.bin BERT Base/Large WordPiece src
bert_base_cased_tok.bin BERT Base/Large Cased WordPiece src
bert_chinese.bin BERT Chinese WordPiece src
bert_multi_cased.bin BERT 多语言 Cased WordPiece src
xlnet.bin XLNET 分词模型 一元语言模型 src
xlnet_nonorm.bin XLNET 分词模型 /无归一化 一元语言模型 src
bpe_example.bin 用于测试BPE分词的模型 BPE src
xlm_roberta_base.bin XLM Roberta 分词 一元语言模型 src
laser(100k|250k|500k).bin 在80+种语言的WikiMatrix语料库上进行平衡训练 一元语言模型 src
uri(100k|250k|500k).bin 在来自网络的大量随机URL上训练的URL分词模型 一元语言模型 src
gpt2.bin GPT-2的Byte-BPE分词模型 byte BPE src
roberta.bin Roberta模型的Byte-BPE分词模型 byte BPE src
syllab.bin 用于识别单词内部允许的连字符点的多语言模型。 W2H src

是的,它也是最快的!我们对Bling Fire与Hugging Face的分词器进行了比较,Bling Fire比Hugging Face分词器快4-5倍,详见[Bling Fire与Hugging Face Tokenizers性能比较](https://github.com/Microsoft/BlingFire/wiki/Comparing-performance-of-Bling-Fire-and-Hugging-Face-Tokenizers),还可以参考[Bing博客文章](https://blogs.bing.com/Developers-Blog/march-2020/Bling-FIRE-Tokenizer-for-BERT)。我们对Bling Fire一元语言模型和BPE实现与SentencePiece库中的相同实现进行了比较,我们的实现快约2倍,详见XLNET基准测试BPE基准测试。此外,我们的默认模型比SpaCy中相同功能的实现快10倍,详见基准测试指南和这篇Bing博客文章

所以,如果您需要低延迟推理,那么您必须尝试Bling Fire!

Python API说明

如果您只想在Python中使用它,您可以使用pip安装最新版本。

pip install -U blingfire

示例

1. Python示例,使用默认的模式分词器

from blingfire import *

text = 'After reading this post, you will know: What "natural language" is and how it is different from other types of data. What makes working with natural language so challenging. [1]'

print(text_to_sentences(text))
print(text_to_words(text))

预期输出

After reading this post, you will know: What "natural language" is and how it is different from other types of data.
What makes working with natural language so challenging. [1]
After reading this post , you will know : What " natural language " is and how it is different from other types of data . What makes working with natural language so challenging . [ 1 ]

2. Python示例,加载自定义的模式分词器模型

from blingfire import *

# load a custom model from file
h = load_model("./wbd_chuni.bin")

text = 'This is the Bling-Fire tokenizer. 2007年9月日历表_2007年9月农历阳历一览表-万年历'

# custom model output
print(text_to_words_with_model(h, text))

# default model output
print(text_to_words(text))

free_model(h)

预期输出

This is the Bling - Fire tokenizer . 2007 年 9 月 日 历 表 _2007 年 9 月 农 历 阳 历 一 览 表 - 万 年 历
This is the Bling - Fire tokenizer . 2007年9月日历表_2007年9月农历阳历一览表 - 万年历

3. Python示例,调用BERT BASE分词器

在一个线程上,它比用Python编写的原始BERT分词器快14倍。由于这段代码是用C++编写的,因此可以从多个线程调用它而不会阻塞全局解释器锁,从而在批量模式下实现更高的速度提升。

import os
import blingfire

s = "Эpple pie. How do I renew my virtual smart card?: /Microsoft IT/ 'virtual' smart card certificates for DirectAccess are valid for one year. In order to get to microsoft.com we need to type pi@1.2.1.2."

# one time load the model (we are using the one that comes with the package)
h = blingfire.load_model(os.path.join(os.path.dirname(blingfire.__file__), "bert_base_tok.bin"))
print("Model Handle: %s" % h)

# use the model from one or more threads
print(s)
ids = blingfire.text_to_ids(h, s, 128, 100)  # sequence length: 128, oov id: 100
print(ids)                                   # returns a numpy array of length 128 (padded or trimmed)

# free the model at the end
blingfire.free_model(h)
print("Model Freed")

预期输出

Model Handle: 2854016629088
Эpple pie. How do I renew my virtual smart card?: /Microsoft IT/ 'virtual' smart card certificates for DirectAccess are valid for one year. In order to get to microsoft.com we need to type pi@1.2.1.2.
[ 1208  9397  2571 11345  1012  2129  2079  1045 20687  2026  7484  6047
  4003  1029  1024  1013  7513  2009  1013  1005  7484  1005  6047  4003
 17987  2005  3622  6305  9623  2015  2024  9398  2005  2028  2095  1012
  1999  2344  2000  2131  2000  7513  1012  4012  2057  2342  2000  2828
 14255  1030  1015  1012  1016  1012  1015  1012  1016  1012     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0]
Model Freed

支持的平台

支持Bling Fire在Windows、Linux和Mac上运行(感谢Andrew Kane!)

贡献

本项目欢迎贡献和建议。大多数贡献都需要您同意一份贡献者许可协议(CLA),声明您有权并且确实授予我们使用您的贡献的权利。有关详细信息,请访问https://cla.microsoft.com

在您提交拉取请求时,CLA机器人会自动判断您是否需要提供CLA,并相应地装饰PR(例如,标签,注释)。只需遵循机器人提供的说明即可。您只需在整个使用我们CLA的所有仓库中这样做一次。

本项目已采用Microsoft开源代码行为准则。更多信息请参阅行为准则FAQ或通过opencode@microsoft.com联系以获取任何额外的问题或评论。

工作分支

要直接向代码库贡献,您应该创建一个个人分支,并在需要时在那里创建功能分支。这可以使主仓库保持清洁,并且您的个人工作流程保持隐蔽。

拉取请求

在我们能够接受您提交的拉取请求之前,您需要签署一份贡献者许可协议(CLA)。这是一个自动化的过程,您只需这样做一次。

但是,您不必预先这样做。您可以直接克隆、分支,并像往常一样提交您的拉取请求。当您的拉取请求创建后,它将被CLA机器人分类。如果更改是微不足道的(即您只是修复了一个拼写错误),则PR将被标记为cla-not-required。否则,它将分类为cla-required。在这种情况下,系统还会告诉您如何签署CLA。一旦您签署了CLA,当前和未来的所有拉取请求都将标记为cla-signed

为了使我们能够快速审查和接受您的拉取请求,请始终为每个问题创建一个拉取请求,并在可能的情况下在拉取请求中链接问题。除非它们有相同的原因,否则不要将多个请求合并为一个。此外,尽量保持代码更改尽可能小,并避免对未更改的代码进行纯格式更改。

反馈

报告安全问题

安全问题和bug应通过电子邮件私下报告给微软安全响应中心(MSRC),邮箱为secure@microsoft.com。您应在24小时内收到回复。如果由于某些原因您没有收到回复,请通过电子邮件跟进以确保我们已经收到了您的原始消息。更多信息,包括MSRC PGP密钥,可以在安全技术中心找到。

许可证

版权(c)微软公司。保留所有权利。

MIT许可下发布。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码发行版

blingfire-0.1.8.tar.gz (41.9 MB 查看哈希值)

上传时间 源代码

构建发行版

blingfire-0.1.8-py3-none-any.whl (42.1 MB 查看哈希值)

上传时间 Python 3

由以下支持