V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
andforce
V2EX  ›  程序员

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

  •  
  •   andforce · 64 天前 · 5462 次点击
    这是一个创建于 64 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    为什么要重新造轮子?

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

    192.36 GB 纯文本短信数据

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

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

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

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

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

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

    第 1 条附言  ·  64 天前
    刚刚进行精确统计了短信条数:718006912 ,7 亿条

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

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

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

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

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

    感觉训练数据样本再百万级别就已经很能打了
    guiyumin
        5
    guiyumin  
       64 天前   ❤️ 1
    有吧?那个熊猫吃短信
    andforce
        6
    andforce  
    OP
       64 天前 via iPhone
    @guiyumin 可能我表达不太严谨。我想要的是这个应用完全离线,连网络权限都不申请那种。

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

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

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

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

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

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

    这玩意是个体力活,有多少人工,就有多少智能
    bbxx11
        29
    bbxx11  
       64 天前
    zap 短信,不需要联网,有个本地小模型,一直在用 还可以
    lisongeee
        30
    lisongeee  
       64 天前
    不联网下还是有方式从网络传递数据哦

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

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

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

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

    Keychain 和 iOS AppGroup 互相通信,依赖同一个开发者的签名。
    wu67
        35
    wu67  
       64 天前
    大可不必这么麻烦.

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

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

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

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

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

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

    最简单的方法就是二分类+白名单关键词。
    aoguai
        43
    aoguai  
       64 天前   ❤️ 1
    一个简单的个人思路是:

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

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

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

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

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

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

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

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

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

    下班的时候插入差不多已经 3800 万条了,那看来得尽快更换数据库咯。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3086 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:48 · PVG 21:48 · LAX 05:48 · JFK 08:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.