约 192GB 短信样本如何标记分类? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
andforce
V2EX    程序员

约 192GB 短信样本如何标记分类?

  •  
  •   andforce 2024-09-24 23:28:16 +08:00 6388 次点击
    这是一个创建于 382 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前开发了一个《垃圾短信过滤 App 》- 胖鱼信使

    为什么要重新造轮子?

    主要是 2 个原因: 1: 市面上没有完全不联网的垃圾短信过滤 App 2: 想学习一下人工智能分类

    192.36GB 纯文本短信数据

    上架研发初期,垃圾短信的训练样本都是来自互联网,然后加上自己和家人的几百条数据,

    偶尔有用户会给我回馈几条,还能处理。

    后来想更提高一把模型准确性,想多搞点样本,有个用户提供了这些个短信数据。

    192,184,722,019字节(磁盘上的 192.36GB )

    纯文本数据,这也太多了。。。。

    有什么工具能对其进行批量标注吗?

    第 1 条附言    2024-09-25 09:53:19 +08:00
    刚刚进行精确统计了短信条数:718006912 ,7 亿条

    目前打算先清洗数据,这些数据存放到多个 json 文件中,每个文件中大约有 3-4 千万个数据,

    感觉要先存到数据库中?然后在数据库中去重?大家针对去重有啥好的建议吗?
    65 条回复    2024-09-27 00:31:29 +08:00
    raycool
        1
    raycool  
       2024-09-24 23:36:41 +08:00
    部署个 qwen2.5 最新开源的大模型
    使用大模型快速标注
    andforce
        2
    andforce  
    OP
       2024-09-25 00:00:28 +08:00 via iPhone
    @raycool 我粗略估算了一下,按照 utf8 编码,汉字大约占用 3 个字节。那么就是约 640 亿个汉字,假设每条短信按 30 个汉字算,大约有 21 亿条。
    如果考虑到去重,就算 80%是重复的,那么还得有 4 亿条。。。。

    由于大模型思考需要时间,就算 1 秒条,全部标注完也得 10 万小时起步了。。。
    lozzow
        3
    lozzow  
       2024-09-25 00:04:41 +08:00
    可以简单的使用文本正则处理一次,然后用这些基于正则的数据跑一个分类模型出来,再用这个分类模型(需要适当的调整下输入的数据)去处理剩余的数据,如果是我的话会这么处理,或者第一步用正则处理出来的数据+用大模型处理的一些数据来做
    andforce
        4
    andforce  
    OP
       2024-09-25 00:13:30 +08:00 via iPhone
    @lozzow 经过 2 楼的数据量估算,数据量太大了。

    数据条数都按亿为单位了,突然觉得没有必要全部都参与训练。

    感觉可以从中根据关键字主动选取垃圾短信,和正常短信。

    感觉训练数据样本再百万级别就已经很能打了
    guiyumin
        5
    guiyumin  
       2024-09-25 00:17:33 +08:00   1
    有吧?那个熊猫吃短信
    andforce
       
    andforce  
    OP
       2024-09-25 00:27:32 +08:00 via iPhone
    @guiyumin 可能我表达不太严谨。我想要的是这个应用完全离线,连网络权限都不申请那种。

    熊猫我记得提交反馈的时候会有网络权限申请
    noqwerty
        7
    noqwerty  
       2024-09-25 00:33:38 +08:00 via iPhone
    @andforce 不联网怎么提交反馈呢
    rechardwong0522
        8
    rechardwong0522  
       2024-09-25 00:34:28 +08:00
    可以先用聚类试着清理掉重复度高的样本,然后选出一部分来训练就可以了。
    syaoranex
        9
    syaoranex  
       2024-09-25 02:17:50 +08:00   6
    没必要所有的短信都拿来训练,同意楼上所说,可以先聚类再挑选聚类中心的一部分短信来用于训练。没有被挑中的就拿来当测试集就 OK 了。因为聚成一类的大多数都是重复的模式。

    聚类的时候,可以先用正则等文本匹配来识别短信发送源,例如 [XX 应用] 之类的,然后在每个发送源下,使用文本嵌入模型转换向量,之后对向量进行聚类,建议聚多个类,挑选多个聚类中心的前 3~5%的短信来训练。足够有代表性。这一步可以很快,因为文本嵌入模型一般不大,运行速度尚可接受。至此筛选出 2-3kW 条典型短信。

    如果还想更快,可以使用分词+词表统计的方法统计词频生成稀疏向量再聚类的办法,这种方法也许更适合,如果数据集中同一来源的大多数短信是套取模板(比如运营商的话费流量短信)生成的,那么可以针对模板类短信取其中千分之一的样本,模板类短信之外的取较大比例的样本,覆盖度更好。

    之后就是用 LLM 来进行文本分类了,文本分类任务上,再优秀的传统模型的效果可能才刚好够上最烂的大模型。至于速度问题,可以搭配提示工程尝试效果不错的小模型,或者使用 Groq 等平台,它们提供了吞吐速度较快的大模型,分类任务足够了;而且可以搭配工程实现的优化:对于同一个聚类样本,例如 2K 条样本,如果在分类过程中前 1K 条样本有 95%以上都被判定为垃圾短信,那么可以将后 1K 条样本直接划为垃圾短信,这样做可以节省大量时间。同时也可以考虑多个平台多个账号并发处理,我认为资金充足的情况下,1 秒 10 个的处理速度还是可以达到的。按照这个速度,一个月可以弄完 2.5 kW 条样本的分类。
    R4rvZ6agNVWr56V0
        10
    R4rvZ6agNVWr56V0  
       2024-09-25 06:05:51 +08:00
    andforce
        11
    andforce  
    OP
       2024-09-25 07:49:13 +08:00   3
    @noqwerty #7 我的 app 的做法是:点击反馈跳转到网页,在网页里让用户主动粘贴。

    其实 App 有了联网权限,就有了把短信自动上传的可能性,当然如果你 100%信任作者或者不关心“可能短信会被收集”这件事,就无所谓了
    andforce
        12
    andforce  
    OP
       2024-09-25 07:51:52 +08:00
    @syaoranex #9 感谢,不过“使用文本嵌入模型转换向量”这听起来好像有点过于专业了,不太会实际操作。
    murmur
        13
    murmur  
       2024-09-25 08:37:11 +08:00
    短信现在感觉没有分类的意义了,长文本才有分类的意义,因为短文本本身就表意不明,长语句现在更倾向于微信说话

    最后分类出来要么是验证码要么是广告
    ibazhx
        14
    ibazhx  
       2024-09-25 08:49:14 +08:00
    可以使用智谱的 batch api
    Pteromyini
        15
    Pteromyini  
       2024-09-25 09:01:23 +08:00
    简单聚类然后抽出一部分样本做分类
    weofuh
        16
    weofuh  
       2024-09-25 09:18:13 +08:00
    是不是可以先从这 192G 文件里提取 1 ~ 100M 出来,分析下热点词什么的,再看有什么规律、共性
    securityCoding
        17
    securityCoding  
       2024-09-25 09:21:03 +08:00 via Android
    按我做推荐工程给算法同学打工的经验,第一步一定是洗数据
    sxfscool
        18
    sxfscool  
       2024-09-25 09:22:42 +08:00
    这个方向不太建议,现在基本不会有人安装非系统自带的短信 app 了吧
    dhb233
        19
    dhb233  
       2024-09-25 09:24:18 +08:00
    技术相关的不太懂,个人使用上来说,除了验证码,都是垃圾短信。。。
    AP8QxuXTV0E46687     20
    AP8QxuXTV0E46687  
       2024-09-25 09:30:59 +08:00
    autodl 租个 4090 跑起来
    andforce
        21
    andforce  
    OP
       2024-09-25 09:32:06 +08:00
    @ibazhx #14 https://open.bigmodel.cn/dev/howuse/batchapi 原来还有这种服务,学习了,不过第一件事确实得先选一下样本
    me1onsoda
        22
    me1onsoda  
       2024-09-25 09:32:39 +08:00
    @andforce #12 gpt 就有这个 api ,用就是了
    andforce
        23
    andforce  
    OP
       2024-09-25 09:33:25 +08:00
    @TimeStudy #20 4090 我家里就有,但具体怎么跑呢?
    yushi17
        24
    yushi17  
       2024-09-25 09:41:24 +08:00
    fasttext 啊
    zoharSoul
        25
    zoharSoul  
       2024-09-25 09:44:07 +08:00
    @andforce #2 你并发 1w 个协程不就好了...
    magicZ
        26
    magicZ  
       2024-09-25 09:46:39 +08:00
    @zoharSoul 哥们,瓶颈在算力啊,一台 4090 部署 Qwen2.5 也就同时处理几十个请求。
    zoharSoul
        27
    zoharSoul  
       2024-09-25 09:48:54 +08:00
    @magicZ #26 他 2L 说的请求 chatgpt 啊. 那样评价就是网络 io 了
    keakon
        28
    keakon  
       2024-09-25 09:58:13 +08:00
    先用 LLM 标注一部分,比如 1 万条,人工校对一下。然后用 bert 类的模型,例如 roberta 加几层预测标签来训练。

    这玩意是个体力活,有多少人工,就有多少智能
    bbxx11
        29
    bbxx11  
       2024-09-25 10:00:46 +08:00
    zap 短信,不需要联网,有个本地小模型,一直在用 还可以
    lisongeee
        30
    lisongeee  
       2024-09-25 10:01:17 +08:00
    不联网下还是有方式从网络传递数据哦

    https://github.com/orgs/gkd-kit/discussions/199
    andforce
        31
    andforce  
    OP
       2024-09-25 10:46:56 +08:00
    @lisongeee #30
    哈?
    在 iOS 系统下,
    不声明且不请求网络权限,不声明文件读写权限,
    有且只有读取短信的权限的前提下,
    请问如果做到不联网,且把数据通过网络传递出去呢?
    lisongeee
        32
    lisongeee  
       2024-09-25 11:09:35 +08:00
    在 Android 上,APP1 有网络权限,APP2 无网络文件权限,APP2 可以通过和 APP1 进程通信或者数据共享来间接获取网络数据而无需任何权限

    我没有 iOS 开发经验,不过假设 iOS 存在两个 APP 通信的机制且不能被用户权限控制,那就可以做到

    我搜索了一下,Keychain 和 iOS AppGroup 具有类似的功能,但是不知道对不对

    如果确实不存在那就是我说错了
    xing7673
        33
    xing7673  
       2024-09-25 11:12:08 +08:00
    @noqwerty 提交反馈在 app store 上直接提交或者调用邮箱或者跳转到 github 提 issue 都可以,直接 app 内置反馈组件我觉得费事费力又不讨好用户
    andforce
        34
    andforce  
    OP
       2024-09-25 11:31:49 +08:00
    @lisongeee #32 从这个角度看,在 iOS 系统中,只安装这个开发者的“1 个 App”即可。

    Keychain 和 iOS AppGroup 互相通信,依赖同一个开发者的签名。
    wu67
        35
    wu67  
       2024-09-25 11:43:13 +08:00
    大可不必这么麻烦.

    正常来说, 短信过滤只需要两道工序, 1 是用关键词黑名单直接 ban, 2 是用关键词白名单把步骤 1 筛出来的恢复正常. 能解决绝大部分辣鸡短信. 搞什么模型、AI 来处理, 有点杀鸡用牛刀的感觉了
    naclfish2333
        36
    naclfish2333  
       2024-09-25 12:47:17 +08:00 via iPhone
    使用大模型并没有 op 想象的那么久,我之前才用 vllm 部署 glm-4 ,用 3090 一个下午就把整个中文维基的标题分类完了。那个数量差不多也是几百万条。

    注意,一定是用 vllm 部署,这个框架的并发能力强的可怕。部署完就 python 写个脚本,并发写到 500 干他就完了。
    enrolls
        37
    enrolls  
       2024-09-25 16:15:28 +08:00
    数据抄送一份给我吧。我用最简单的分类就行。蚂蚁搬家不是常见的思维咩?
    bthulu
        38
    bthulu  
       2024-09-25 17:07:30 +08:00
    租用云算力, 只要舍得花钱, 很快就算完了
    yuxizhe
        39
    yuxizhe  
       2024-09-25 17:16:44 +08:00
    @naclfish2333 单卡 3090 能运行 glm-4 么?效果咋样
    Cola90
        40
    Cola90  
       2024-09-25 17:28:25 +08:00
    能分享吗这个数据集
    paopjian
        41
    paopjian  
       2024-09-25 17:46:23 +08:00
    先用小模型洗数据呗,白嫖 aistudio 啥的,用百度的模型先把营销短信洗出来,其他的再慢慢打标签, 全给 LLM 跑消耗太高了
    aoguai
        42
    aoguai  
       2024-09-25 19:36:56 +08:00
    hrwhisper/SpamMessage: 中文垃圾短信识别(手写分类器)
    https://github.com/hrwhisper/SpamMessage

    junxincai/ChineseTextClassification: 自然语言处理之中文文本分类(以垃圾短信识别为例)
    https://github.com/junxincai/ChineseTextClassification

    单纯要识别垃圾短信/正常短信,就是个二分类的问题,使用传统方法即可。

    如果要多标签的话就是个体力活了,因为您这个应该是没有任何标签的。你首先需要分类打标签,才能使用机器学习也好大模型也好才能训练。

    或者干脆分类也交给机器学习(AI)来搞定,这种情况下建议像楼上说的那样先聚类,挑选聚类中心的一部分短信来用于训练识别某类短信,然后再用训练好的模型重新给短信打标签,再训练。

    最简单的方法就是二分类+白名单关键词。
    aoguai
        43
    aoguai  
       2024-09-25 19:41:17 +08:00   1
    一个简单的个人思路是:

    如果使用二分类方案的话,用白名单关键词+自己整理一些特定的正则表达式匹配。对上即是正样本。
    跑一遍没对上的,全归为负样本。
    然后就可以用传统方法开始训练了,传统方法对硬件要求不高,没 GPU 都没问题。

    然后拿模型开始验证即可,效果不好就调参,漫长的调参,调整白名单关键词+自己整理一些特定的正则表达式匹配,直到满意为止。

    (另外同求数据集
    yuchting
        44
    yuchting  
       2024-09-25 19:43:33 +08:00
    把大象装进冰箱需要几步?
    4BVL25L90W260T9U
        45
    4BVL25L90W260T9U  
       2024-09-25 19:53:10 +08:00
    程序员真的是,就关心技术问题。这么多个人隐私数据,就是个烫手山芋,你先看下是否合规吧,别把自己弄进去了
    4BVL25L90W260T9U
        46
    4BVL25L90W260T9U  
       2024-09-25 19:53:53 +08:00
    还有求分享的,你真不怕是钓鱼么……
    yuchting
        47
    yuchting  
       2024-09-25 20:01:32 +08:00   1
    把大象装进冰箱需要几步?
    0 、如何吧文本词条化?然后把词条变成向量,然后吧每个短信的词条向量算出来。中文词汇五万六千余条,每个短信词汇大概在 5-10 。
    1 、如何合理的抽样数据?大样本太多,需要降低样本。可以用随机抽样?
    2 、对降低的样本进行人工标记。标记种类,比如骚扰、乱码文字、京东、淘宝、诈骗、淫秽等等。
    3 、对标记样本的词汇向量机器监督学习( CNN ,RNN ,KNN 等)。分为两拨,一波学习一波测试。
    4 、学习完成之后,再抽样大样本数据进行评价(样本数据划分词条,然后使用词条作为输入,标签作为输出)。
    5 、评价结果如果和人的评价结果一基本一致的话,表示这个模型就很好了。
    CapNemo
        48
    CapNemo  
       2024-09-25 20:14:38 +08:00
    最近正好在搞类似工作,有个很有意思的框架叫 TnT-LLM 可以借鉴一下。大体思路是让模型去概括信息、提炼分类、标注样本,然后训练小模型去实际分类。
    lyhiving
        49
    lyhiving  
       2024-09-25 20:38:56 +08:00
    @CapNemo 这个 TnT 很 cool
    thevita
        50
    thevita  
       2024-09-25 21:55:44 +08:00
    得看具体数据分布,大体思路可以先用人工筛选规则降量,再用其他手段( LLM 等)处理长尾

    assumption: 有大量同一类型、具备明确模式的数据

    没处理过垃圾短信,但处理过其他类型的短信数据,不一定有用
    512357301
        51
    512357301  
       2024-09-25 23:50:11 +08:00 via Android   1
    对标注不太懂,但这个数据量,处理起来确实比较麻烦,可以考虑 clickhouse 或者 duckdb
    前者是数据库,比较重。
    后者是单文件,轻量级一些,建议用后者。
    先把原始文件切割成小份的,csv 格式最佳,然后用 duckdb 把 csv 清洗压缩成 parquet 格式,压缩率极高,性能也极好。
    推荐阅读: https://mp.weixin.qq.com/s/z-_ixPeksB_PjFMNL7NA8Q
    andforce
        52
    andforce  
    OP
       2024-09-26 07:25:30 +08:00 via iPhone
    @512357301 这个太好了,我现在正在我的 Mac 上一条一条往 MySQL 里导入。
    我都不确定 MySql 能不能处理 7 亿条数据

    数据清理还真的依赖一个牛逼的数据库才行
    andforce
        53
    andforce  
    OP
       2024-09-26 07:29:29 +08:00 via iPhone
    @CapNemo 这个不知道最终的效果如何,如果我只想进行二元标注,就是分垃圾短信和正常短信,一旦标注出错,训练出来的模型感觉效果就差一些。
    chempotato
        54
    chempotato  
       2024-09-26 08:05:34 +08:00 via Android
    @ospider mega 网盘分享 应该不会出问题
    yuankui
        55
    yuankui  
       2024-09-26 08:11:43 +08:00
    大数据,spark ,hadoop 了解下
    dode
        56
    dode  
       2024-09-26 08:50:30 +08:00
    有些比较长的是商业合规短信,各种乱码超短短信铁定是垃圾短信
    naclfish2333
        57
    naclfish2333  
       2024-09-26 09:20:28 +08:00 via iPhone
    @yuxizhe 能不能跑起来主要看显存,glm-4 是 9B 的模型,全精度大概要占用到 17G 左右的显存。3090 单卡好像是 25G 左右,是足够了,但是 vllm 这个框架的策略是尽量占满显存的。

    至于效果,只能是差强人意,我是要求模型分析词语和某个领域的相关性。直接输出输出一个 1 到 5 的数字,代表这个词和这个领域的相关性。

    最后确实是可以正确分类,但是可能是 prompt 没写好或者分类的颗粒度分得太细了,导致分类的结果不是很一致。比如“电阻”模型会给出“5”,但是“电容”又会给出“4”。
    locoz
        58
    locoz  
       2024-09-26 09:26:53 +08:00 via Android
    7 亿条里大概率有极其大量的重复内容,先去重、人工标记把一些一眼就能分类的都筛掉,应该会少很多
    cocogovern
        59
    cocogovern  
       2024-09-26 11:30:02 +08:00
    先通过一个规模模型来做筛选,然后你再通过人工智能来分类不能完成的部分。
    realpg
        60
    realpg  
    PRO
       2024-09-26 14:11:24 +08:00
    会不会源文件 192GB 去掉包含"验证码"三个字的还剩 36MB
    andforce
        61
    andforce  
    OP
       2024-09-26 14:26:09 +08:00
    @realpg #60 哈哈哈,不至于。。。刚看了一下,1000 万条中,验证码大约是 70 万条。

    目前还在苦苦的导入的 MySQL 中,如果 MySQL 实在撑不住再说了。。。。
    unco020511
        62
    unco020511  
       2024-09-26 14:58:18 +08:00
    @andforce #12 其实就是 API,听起来高大上而已
    naoying
        63
    naoying  
       2024-09-26 15:20:09 +08:00
    集成端侧离线小模型
    512357301
        64
    512357301  
       2024-09-27 00:21:51 +08:00 via Android
    @andforce #52 mysql 不行,7000 万都吃力,你这是数据分析与处理,属于 OLAP ,需要列式数据库( clickhouse )或者本地数据库( duckdb 、sqlite )。
    MySQL 是行式数据库,适合处理单条数据的读写,不适合批量数据处理。7 亿条更是妄想了。
    andforce
        65
    andforce  
    OP
       2024-09-27 00:31:29 +08:00 via iPhone
    @512357301 我还纳闷了,昨天跑了 2 次都异常退出了,我还还怀疑是我的插入代码写的有问题,今天我还特意改成一个文件一个文件单独插入。一个文件差不多 3800 万条。

    下班的时候插入差不多已经 3800 万条了,那看来得尽快更换数据库咯。。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     923 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 19:15 PVG 03:15 LAX 12:15 JFK 15:15
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86