做电商网站,营销和销售的区别在哪里,人力资源外包灵活用工,.net网站内容管理系统本文字数#xff1a;7033字 预计阅读时间#xff1a;42分钟 一直想开发一个自己的短信过滤 APP#xff0c;但是一直没有具体实施#xff0c;现在终于静下心来#xff0c;边开发边记录下整体的开发过程。 01 垃圾短信样本 遇到的第一个问题是#xff0c;既然要过滤垃圾短信… 本文字数7033字 预计阅读时间42分钟 一直想开发一个自己的短信过滤 APP但是一直没有具体实施现在终于静下心来边开发边记录下整体的开发过程。 01 垃圾短信样本 遇到的第一个问题是既然要过滤垃圾短信那首先要识别哪些是垃圾短信如何识别呢 参考之前训练识别钢管计数的经验决定通过 CoreML 训练 Text 模型来识别那问题来了要训练模型的短信数据集怎么来 一开始打算网上找到垃圾短信样本但找了好久没找到于是就想到用自己和家人手机里的短信毕竟手机里短信一般不删除也有小几千条而且垃圾短信、推销、广告之类的应有尽有。 所以问题就变成了如何导出 iPhone 短信 这里笔者也查了好久找到的第三方软件基本都是需要收费最终发现了一个免费导出的方案。 首先不加密备份手机到电脑如下图选中Back up all the data on your iPhone to this Mac点击Back Up Now等待备份完成备份完成后再点击Manage Backups 备份界面 Manage Backups 点击后界面如下可以看到已备份的记录右键选择 Show In Finder在文件夹中打开 管理备份 然后可以看到备份所在目录已打开这时候需要找到文件名为 3d0d7e5fb2ce288813306e4d4636395e047a3d28的文件这个文件就是短信备份的数据库文件。然后问题来了怎么找呢看到备份目录一个个文件夹是不是懵这怎么找很简单搜索点击右上角的搜索直接把这个文件名输入即可注意搜索的范围是当前文件夹 备份文件夹 搜索结果如下 短信备份数据库文件 然后把这个文件单独拷贝到另一个地方比如桌面再用数据库软件打开比如SQLPro for SQLLite打开如下 短信数据库文件打开 然后观察这个文件后发现手机号和短信记录分布在不同表中需要写一个 SQL 查出需要的内容SQL 内容如下参考 SQL to extract messages from backup选中上图中Query输入命令如下 SELECT datetime(message.date, unixepoch, 31 years, -6 hours) as Timestamp, handle.id, message.text,case when message.is_from_me then From me else To me end as Sender
FROM message, handle WHERE message.handle_id handle.ROWID AND message.text NOT NULL; 然后点击右上角的执行, 可以看到把短信都筛选出来了 然后选中所有 row右键选择Export result set as 导出CSV即可导出 excel 格式的文件 导出短信 这样就获取到了所需的短信样本。 02 垃圾短信训练识别 有了样本之后再来看如何训练识别打算使用苹果的 CoreML识别那么如何使用样本格式的要求是什么样训练需要多久 先来看创建一个文字训练的CoreML工程选中 Xcode点击Open Developer Tool选中 CoreML 打开如下图 XcodeDevelperTool 然后选择文件夹并点击新建New Document, 如下 New Document 然后选中 Text Classification如下图 Text Classification 接着输入项目的名字和描述 项目描述 点击右下角创建进入主界面如下 主界面 点击 Traing Data 的详细说明可以看到 CoreML 要求的文字识别的格式支持 JSON 和 CSV 文件格式如下 格式 JSON 格式如下 // JSON file
[{text: The movie was fantastic!,label: positive}, {text: Very boring. Fell asleep.,label: negative}, {text: It was just OK.,label: neutral} ...
] 而 CSV 格式则是一列 text 一列 label textlabel这是一条普通短信label1这是一条垃圾短信label2 由于再前一步中已经将短信导出为 CSV 格式所以这里就需要把格式改为上图中格式即可只剩下一个问题需要解决即label 有哪些取值 要看 label 有哪些取值需要先看系统短信的过滤逻辑是什么样支持的过滤分类有哪些否则自己想实现的分类分组好了最后发现系统不支持就尴尬了。 03 短信过滤分类 系统短信的过滤逻辑 参考 SMS and MMS Message Filtering可以看到开发者是没有权限创建新分组的只能是针对收到未知联系人的 SMS 或者 MMS 拦截返回指定的分类。 这里需要注意的是根据文档的说法短信过滤不支持 iMessage 和通讯录中联系人短信的过滤仅支持未知联系人的 SMS 和 MMS。 短信过滤又分为本地判断过滤和服务端判断过滤示意图如下 短信本地过滤 短信服务端过滤 按照文档的说法即使是服务端过滤APP 也是不能直接访问网络的系统会和设置的服务器交互而且 App Extension 不能通过共享 Group 写数据故而短信仅能在 App Extension中获取到不能存储不能上传从而保证隐私和安全。关于服务端过滤更多的实现可以参考 Creating a Message Filter App Extension。 再来看支持的过滤类型ILMessageFilterAction大分类支持五种 none 没有足够信息不能判断会展示信息或进一步请求服务端判断过滤allow 正常展示信息junk 阻止正常展示信息显示在垃圾短信分类下promotion 阻止正常展示信息显示在推送信息分类下transation 阻止正常展示信息显示在交易信息分类下 而其中又可以细分子分类ILMessageFilterSubAction具体含义可以参考ILMessageFilterSubAction nonepromotion 支持的子分类有 othersofferscouponstransation 支持的子分类有 othersfinanceordersremindershealthweathercarrierrewardspublicServices 这里仅针对大分类做处理具体的子分类不做详细过滤所以需要训练的 label 有哪些取值就很明确了过滤垃圾短信、推广信息、交易信息至于 none 和 allow 不做区分统一处理为 allow所以总共需要训练的 label 取值有以下这些 allowjunkpromotiontransation 然后就是针对导出短信的 CSV 文件针对每条短信添加对应的 label这里只能手工样本的大小和 label 定义决定后续识别的准确度同时为了后续子分类的实现建议实事求是不要把比如 promotion 里的分到 junk 里。。。 每条短信样本都标记好了之后就可以导入Create ML来训练生成需要的模型步骤如下—— 首先导入数据集 导入数据集 然后点击左上角的 Train 训练Train 等训练好了之后可以点击 Preview 模拟短信文本看输出的预测如下图: 效果检测 最后导出模型供 APP 使用 导出模型 04 APP开发 新建项目然后使用 new bing生成图片 来设计 APPIcon再用 ChatGPT-4来生成 APP 名字。然后添加 Message Filter Extension Target如下图 Message Filter Extension Target 在 MessageFilterExtension.swift 中能看到苹果已经帮忙实现了基本的框架只需要在框架对应// TODO: 的地方加入对应的过滤逻辑即可。 然后导入训练结果集到项目中注意 Target 要勾选主工程和 Message Filter Extension 的 Target因为需要在这个 Target 中使用模型来实现过滤。 具体使用如下 import Foundation
import IdentityLookup
import CoreMLimport IdentityLookupenum SMSFilterActionType: String {case transationcase promotioncase allowcase junkfunc formatFilterAction() - ILMessageFilterAction {switch self {case .transation:return ILMessageFilterAction.transactioncase .promotion:return ILMessageFilterAction.promotioncase .allow:return ILMessageFilterAction.allowcase .junk:return ILMessageFilterAction.junk}}
}struct SMSFilterUtil {static func filter(with messageBody: String) - ILMessageFilterAction {var filterAction: ILMessageFilterAction .nonelet configuration MLModelConfiguration()do {let model try SmsClassifier(configuration: configuration)let resultLabel try model.prediction(text: messageBody).labelif let resultFilterAction SMSFilterActionType(rawValue: resultLabel)?.formatFilterAction() {filterAction resultFilterAction}} catch {print(error)}return filterAction}
} 然后在MessageFilterExtension.Swift 中 offlineAction(for queryRequest: ILMessageFilterQueryRequest) - (ILMessageFilterAction, ILMessageFilterSubAction) 方法调用如下 available(iOSApplicationExtension 16.0, *)private func offlineAction(for queryRequest: ILMessageFilterQueryRequest) - (ILMessageFilterAction, ILMessageFilterSubAction) {guard let messageBody queryRequest.messageBody else {return (.none, .none)}let action MWSMSFilterUtil.filter(with: messageBody)return (action, .none)} 这里需要注意下 APP 最低版本设置ILMessageFilterSubAction只有 iOS 16 以上的手机才支持而 ILMessageFilterSubAction 则是 iOS 14 以上。 如果想实现更精细的 SubAction 的过滤则上面短信数据集的 label需要改为更精细的 label然后训练出模型再用来判断。 另外ILMessageFilterQueryRequest 中可以获取到 sender 和 messageBody所以如果想实现自定义规则比如针对某个手机号设置对应的规则则需要从 APP 中设置对应的规则然后通过 Group 共享到 Extension 然后在上面的方法里通过规则匹配。 05 总结 相信通过上面的步骤大家都能开发出自己的短信过滤 APP。 上面的步骤是通过固定的训练模型来匹配的逻辑步骤是 获取短信数据集通过 CoreML 使用数据集训练并生成模型在项目中使用模型进行判断 这种方式生成的模型其数据固定每次更新模型需要重新训练并导入然后更新 APP。是否有更好的方式呢比如是否可以在 APP 中边训练边更新又或者是否可以通过本地规则加本地模型加网络模型这种方式 假设方案一 首先在 APP 中边训练边更新大概思路如下—— 更新模型需要知道一条数据的内容和数据的分类所以如果要在 APP 中训练模型就需要通过另外的办法获取到分类要不然用模型得到分类再回过头来训练模型意义不大。所以通过自定义规则获取到数据分类然后用数据和数据分类来更新模型这种方式应该是可行的。 假设方案二 然后来考虑更完善的一种方式即通过本地规则加本地模型加网络模型的方式 逻辑是首先通过本地规则匹配如果本地规则匹配不到则继续使用本地模型匹配如果本地模型也匹配不到则通过请求服务端服务端另有一套不断训练更新的模型来获取对应的分类最后每次更新时把服务端当前对应最新的模型更新到项目中。 假设方案三 方案二需要通过网络模型假设的前提是服务端有一套不断训练更新的模型那如果这个假设不存在只有本地规则和本地模型外加偶尔获取到的更新数据集是否有办法在线更新本地模型 目前本地模型是直接添加到APP 主 Bundle 中可以考虑在首次启动时拷贝到 APP 和Extension 的共享 Group 中每次打开 APP 时判断模型是否有更新有更新则下载替换这个目录下的模型文件。在 Extension 中通过 URL 获取这个目录下的模型文件来进行过滤。 几种方案流程图如下 短信 APP 过滤流程图 总结如下 短信过滤 APP 开发流程 参考 SQL to extract messages from backup https://apple.stackexchange.com/questions/300866/sql-to-extract-messages-from-backup) Creating a Text Classifier Model https://developer.apple.com/documentation/createml/creating-a-text-classifier-model SMS and MMS Message Filtering https://developer.apple.com/documentation/sms_and_call_reporting/sms_and_mms_message_filtering Creating a Message Filter App Extension https://developer.apple.com/documentation/sms_and_call_reporting/sms_and_mms_message_filtering/creating_a_message_filter_app_extension ILMessageFilterAction https://developer.apple.com/documentation/sms_and_call_reporting/ilmessagefilteraction