MLKitEntityExtractor 拓展
从一段文本里自动找出地址、日期时间、电话、邮箱、网址、金额、快递单号、航班号、 ISBN、IBAN、银行卡号,并给出每一项在原文中的位置(可用来做高亮)。
为什么选它:
- 抽取在设备本地完成,文本不上传。
- 只要一个「抽取」块:模型没下载会自动先下载再抽取。
- 实体类型给可读名称(
PHONE、DATE_TIME)而不是数字编号。 - 支持 15 种语言,默认中文。
常用场景:从短信/聊天记录里自动识别快递单号和验证码、把一段话里的时间地点变成日程、 从名片文字里提取电话邮箱。
限制:语言模型需联网从 Google 服务器下载(下载后永久离线可用)。 国内网络可能失败,此时触发
ModelDownloadFailed。这是 ML Kit 的 beta 功能。
- .aix 拓展下载:
cn.fun123.MLKit.EntityExtractor.aix
快速上手
一、从一段话里抽取信息
when 按钮_抽取.Click() {
标签1.Text = "抽取中…"
EntityExtractor1.Extract(文本输入框_输入.Text)
}
when EntityExtractor1.GotEntities(count, resultJson) {
标签1.Text = join("找到 ", count, " 项")
标签_原始结果.Text = resultJson
}
when EntityExtractor1.NoEntityFound(text) {
标签1.Text = "这段文字里没有可识别的信息"
}
when EntityExtractor1.ModelDownloadFailed(errorMessage) {
标签1.Text = errorMessage
}
when EntityExtractor1.ExtractFailed(operation, errorMessage) {
标签1.Text = errorMessage
}
resultJson 的形状(用「JSON 文本解码」块解析):
[{"text":"13800138000","start":3,"end":14,
"entities":[{"type":8,"name":"PHONE"}]},
{"text":"明天下午三点","start":20,"end":26,
"entities":[{"type":2,"name":"DATE_TIME"}]}]
start/end— 在原文里的字符位置,可以用来做高亮entities是数组 —— 同一段文字可能同时匹配多个类型(如一串数字既像电话又像单号)
二、切换语言
when 按钮_英文.Click() {
EntityExtractor1.Language = "english"
标签_当前模式.Text = "当前:英文"
}
when 按钮_中文.Click() {
EntityExtractor1.Language = "chinese"
标签_当前模式.Text = "当前:中文"
}
三、启动时提前下好模型
when Screen1.Initialize() {
标签1.Text = "正在准备模型…"
EntityExtractor1.DownloadModel()
}
when EntityExtractor1.ModelDownloaded() {
标签1.Text = "准备好了,可以开始了"
}
四、把支持的语言做成下拉框
when Screen1.Initialize() {
列表选择器_语言.ElementsFromString = EntityExtractor1.SupportedLanguages
}
when 列表选择器_语言.AfterPicking() {
EntityExtractor1.Language = 列表选择器_语言.Selection
}
能抽取的 11 种实体
| 名称 | 含义 |
|---|---|
ADDRESS |
地址 |
DATE_TIME |
日期时间(含「明天下午三点」这类相对表述) |
EMAIL |
电子邮箱 |
FLIGHT_NUMBER |
航班号 |
IBAN |
国际银行账号 |
ISBN |
书号 |
PAYMENT_CARD |
银行卡号 |
PHONE |
电话号码 |
TRACKING_NUMBER |
快递单号 |
URL |
网址 |
MONEY |
金额 |
属性
- Language
- 文本语言,决定用哪个模型。默认
chinese。可选:chinese、english、japanese、korean、french、german、spanish、italian、portuguese、dutch、polish、russian、arabic、thai、turkish。 填了不支持的值会在抽取时报错并提示可用列表。改这个属性会重建抽取器。 - SupportedLanguages
- 只读。支持的语言,英文逗号分隔,可直接喂给列表选择框。
- Busy
- 只读。是否正在抽取或下载模型。
事件
- GotEntities(count,resultJson)
- 抽取出实体。
resultJson含每项的文字、在原文的起止位置、以及匹配到的类型(见示例一)。 - NoEntityFound(text)
- 文本里没找到任何实体。这不是错误。
- ModelDownloaded()
- 模型下载完成(自动下载和手动下载都会触发)。
- ModelDownloadFailed(errorMessage)
- 模型下载失败。最常见的原因是网络无法访问 Google 服务器。
- ExtractFailed(operation,errorMessage)
- 抽取失败。也包括「文本为空」「语言不支持」这类用法问题。
方法
- Extract(text)
- 从文本里抽取实体。模型没下载会自动先下载再抽取。
- DownloadModel()
- 手动下载当前语言的模型。一般不用单独调,可用于启动时预下载。
- TypeName(type)
- 把实体类型编号转成可读名称(如 8 →
PHONE)。一般用不到 —— 返回的 JSON 里已经带了名称。
常见问题
一直触发 ModelDownloadFailed。
模型连不上 Google 服务器 —— 网络问题,不是拓展的问题。
引导用户在能访问 Google 服务的网络下完成一次下载,之后永久离线可用。
中文的日期时间抽不出来。
确认 语言 属性是 chinese(默认就是)。另外模型对「2026年1月1日」这类规范写法效果最好,
口语化表述(「下下周三」)识别率会下降。
同一段文字返回了多个类型。
这是正常的 —— 一串数字可能既像电话又像快递单号,模型会把可能的类型都列出来,
由你的应用逻辑决定取哪个。所以 entities 是数组而不是单个值。
能抽取人名、公司名吗?
不能。ML Kit 实体抽取只支持上表那 11 种格式化信息,不做通用命名实体识别(NER)。
要认人名/机构名请用大模型(本仓库的 LLMAI2Ext 拓展)。
扫码添加客服咨询