MiraiForum

    • Register
    • Login
    • Search
    • Popular
    • Recent
    • Unsolved
    • Tags
    • Groups
    • 友情链接

    NLPHelper - 自然语言处理模型训练数据采集专用插件

    插件发布
    7
    33
    4323
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Mitr-yuzr
      Mitr-yuzr 摸鱼 last edited by Mitr-yuzr

      NLP Helper


      适用于 Mirai 的用于收集NLP语言训练数据的插件。

      Github Project

      Release

      介绍


      什么是NLP?

      以下内容摘自百度百科

      自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分 [1] 。
      自然语言处理主要应用于机器翻译、舆情监测、自动摘要、观点提取、文本分类、问题回答、文本语义对比、语音识别、中文OCR等方面 [2] 。

      起因

      我前一段时间发布的帖子: 关于将QQ机器人与深度学习NLP结合的可能性

      目的

      制作一个专用于收集NLP语言模型训练数据、方便查询和导出数据的插件。

      功能


      • 收集指定群里的聊天数据 (仅支持 PlainText)
      • 自动过滤emoji,并支持在配置中通过正则表达式进行简单过滤
      • 支持导出JSON格式的数据
      • 支持直接导出模型需要的训练数据的格式 (目前暂时仅支持 GPT2-Chinese 模型)
      • 完全隐蔽式收集数据,聊天环境下所有命令均无回应
      • 数据库安全,相关命令仅限控制台

      声明


      本插件开发目的为学习,在开始采集数据前请先告知群成员,采集所得数据必须保证只在机器学习上使用。严禁用于任何侵犯他人隐私和过度滥用的行为,若因此出现问题本人概不负责。

      快速使用


      • 从 Release 下载本插件并放置于mcl的plugins目录下
      • 登录机器人后,在控制台输入以下命令开始采集数据
        /NLPHelper addGroup 你需要采集数据的群
        
      • 采集数据 (这通常需要花上数周甚至数月)
      • 在控制台输入以下命令导出gpt2数据
        /NLPHelper export gpt2
        
      • 前往 mcl根目录\NLPH\out\ 找到刚才导出的数据
      • 进行模型训练 (这一部分的教程会在之后补充)

      命令


      注意:
      为避免其他插件的功能引发的对话文本污染样本池,请避免在同一个群里同时使用本插件和其他插件。
      如果同时使用 Chat-Command 等其他插件,请注意在过滤词中确保过滤了触发命令的前缀 (如/或#)

      命令均为 /NLPHelper <子命令> [参数...]或使用缩写别名 /nlph <子命令> [参数...] 。

      配置修改命令

      命令 描述
      /NLPHelper addGroup <group> 添加收集数据的群
      /NLPHelper removeGroup <group> 移除群
      /NLPHelper outDir <path> 修改默认输出位置
      /NLPHelper defaultFileName <fileName> 修改默认输出文件名
      /NLPHelper addFilter <filter> 添加过滤词
      /NLPHelper removeFilter <filter> 移除过滤词
      /NLPHelper addConfig <name> <sql> [type] 新建导出配置
      /NLPHelper removeConfig <name> 删除导出配置
      参数 类型 描述 备注
      group Long 启用或移除的群号
      path String 默认导出数据的位置 mcl根目录,默认为./NLPH/out/
      fileName String 默认导出的文件名 默认为NLPHExport_{model}_{count}.json
      filter String 需要过滤的字符 支持正则表达式
      name String 导出配置的名字 大小写敏感,自带三个导出配置 default、json和gpt2

      fileName 文件名变量

      变量 描述
      {model} 选择导出的方式,如: json
      {count} 导出数据数量,如: 114514
      {date} 导出的日期 (yyyyMMdd),如: 20220910
      {time} 导出的时间 (HHmm),如:0930
      {datetime} 导出的日期和时间 (yyyyMMddHHmm),如: 202209100930

      注意:
      若要在聊天环境中使用,需要授予相关权限。

      filter 的过滤是在收集数据时进行的,生效后当检测到消息内容包含过滤词时就不会收集该消息,导出时不会进行过滤!

      请在开始收集前配置好过滤词,否则后续添加的过滤词对此前已经收集的内容不生效,届时可能需要借助辅助程序将导出内容再次过滤。

      数据库相关命令

      命令 描述
      /NLPHelper query [sql] 查询
      /NLPHelper execute <sql> 执行sql语句
      /NLPHelper export [config] [outDir] [fileName] 使用导出配置进行导出
      /NLPHelper exportByConfig [config] [outDir] [fileName] 使用导出配置进行导出
      /NLPHelper exportBySQL [sql] [type] [outDir] [fileName] 使用sql语句进行导出
      参数 类型 描述 备注
      sql String SQL语句 默认为SELECT * FROM NLPH;
      config String 导出配置的名字 默认为default,即导出json
      type String 导出类型 默认为json,目前仅支持json和gpt2

      注意:
      本命令仅支持控制台使用。
      所有sql输入均未作判断和处理直接执行,如有语法问题会catch并报错。其余指令存在sql注入风险,但没必要,因为你可以直接使用execute。

      导出样例

      __

      json

      demo_json.png

      gpt2

      demo_gpt2.png

      注意:
      若追求更好的效果,仍需再进一步过滤噪声

      数据表


      表名为 NLPH

      参数 类型 描述
      sender Long 发送者QQ号
      group Long 消息所在群QQ号
      bot Long 相关机器人QQ号
      content String 消息内容
      size Int 消息长度
      date LocalDate 消息发送日期

      用例

      #查询 123456 发送的消息
      /NLPHelper query "SELECT * FROM NLPH WHERE sender=123456;"
      
      #以json格式导出群 456789 的消息
      /NLPHelper exportBySQL "SELECT * FROM NLPH WHERE group=456789;" json
      
      #以gpt2格式导出 100 字以内的消息
      /NLPHelper exportBySQL "SELECT * FROM NLPH WHERE size<=100;" gpt2
      
      #以gpt2格式导出比较文明的消息
      /NLPHelper exportBySQL "SELECT * FROM NLPH WHERE content NOT LIKE '%妈%';" gpt2
      
      #以json格式导出最新的 100 条消息
      /NLPHelper exportBySQL "SELECT * FROM NLPH ORDER BY date DESC LIMIT 100;" json
      
      #以json格式导出日期在 2022年8月1日-2022年9月1日 且属于机器人 114514 的消息,且仅导出发送人和消息内容
      #/NLPHelper exportBySQL "SELECT sender,content FROM NLPH WHERE (date BETWEEN 20220801 AND 20220901) AND bot=114514;" json
      #经测试发现date实际上仍是时间戳,所以此用例的日期部分不可用,其余部分可以参考
      

      更多高级的使用方法请自行去学习 SQLite

      插件配置


      位于\config\net.reincarnatey.NLPHelper\NLPHConfig.yml

      # 要开启记录消息的群
      group:
        - 123456
      # 当检测到以下内容时不记录该消息,支持正则表达式
      filter:
        - '/'
        - '#'
        - http
      # sql查询语句的配置,数据表详细与简单的sql教程在README.md
      config:
        default:
          sql: 'SELECT * FROM NLPH;'
          type: json
        json:
          sql: 'SELECT * FROM NLPH;'
          type: json
        gpt2:
          sql: 'SELECT * FROM NLPH;'
          type: gpt2
      # 默认导出数据的位置
      outDir: './NLPH/out/'
      # 存放数据库的位置,更改后记得移动NLPH.db至新的位置,重启生效
      dbDir: './NLPH/data/'
      # 默认文件名,模板参数请读README.md
      defaultFileName: 'NLPHExport_{model}_{count}.json'
      

      再次声明


      本开源插件仅为个人使用而编写,遵循Apache Licence2.0开源协议,发布至 MiraiForum ,禁止用于任何违法法律法规、社区规定、网站规则的行为,若出现问题本人概不负责。

      qwq


      后续如果有空大概会发布如何使用导出来的数据训练。

      下一个支持直接导出的模型可能是 GPT2-chitchat
      有需要的话也可以自行修改源码实现 (不过这一部分源码的方法并不友好,本来想尝试使用泛型接口但以失败告终)

      如果有bug的话可以回复或者提issue

      1 Reply Last reply Reply Quote 2
      • Mitr-yuzr
        Mitr-yuzr 摸鱼 last edited by

        祝Mirai论坛的各位中秋节快乐。

        其实是因为colab跑模型又被制裁了闲来无事才来写插件的,不算难,但是平时不会直接接触到数据库这么低层(mmkv yyds!),完全是摸着脑袋来的。

        至于后续的训练方式,等我有空了会写一个colab notebook,在另一个板块进行介绍,但是只能说不一定有办法接入。如果感兴趣的话可以点帖子右上角的铃铛关注一下帖子, 开始提前收集数据了……。

        还有就是gpt2样例演示那图确实不妥,截图的时候没看清楚(我只是因为莫名其妙的bug急了!我平时很文明的千万要相信我!),等我找到代替的就换。

        1 Reply Last reply Reply Quote 5
        • Referenced by  Mitr-yuzr Mitr-yuzr 
        • 南栀沁寒
          南栀沁寒 last edited by

          太棒了 期待后续

          1 Reply Last reply Reply Quote 0
          • D
            damemod last edited by

            太棒了!

            1 Reply Last reply Reply Quote 0
            • Koreyoshi
              Koreyoshi last edited by

              期待

              1 Reply Last reply Reply Quote 0
              • Mitr-yuzr
                Mitr-yuzr 摸鱼 last edited by

                关于训练方法,大概要下周就好了。
                最近在训练其他模型和准备其他模型的数据集,可能没那么有空。
                正好也给你们一段时间收集数据,大概收集到两千条就可以比较还原了。

                1 Reply Last reply Reply Quote 0
                • D
                  damemod last edited by

                  过滤和收集是同时进行的吗,还有如何一键导入违禁词

                  Mitr-yuzr 1 Reply Last reply Reply Quote 0
                  • Mitr-yuzr
                    Mitr-yuzr 摸鱼 @damemod last edited by

                    @damemod 是的,如果检测到内容中有设定的过滤词的话则不会收集该聊天的内容(但导出时不会进行过滤)。
                    一键导入过滤词目前并没有很好的方法,你可以将过滤词拼在一起写成一个正则表达式,或是使用一键替换来格式化之后复制到Config中,或是在导出数据后使用程序再次过滤。

                    D 1 Reply Last reply Reply Quote 0
                    • Mitr-yuzr
                      Mitr-yuzr 摸鱼 last edited by

                      刚刚编辑了帖子,增加了关于过滤词的描述和两条新的SQL用例(LIKE、LIMIT和ORDER BY),并纠正了某个用例的错误(未经验证就写出来十分抱歉!现已标注错误)

                      1 Reply Last reply Reply Quote 0
                      • D
                        damemod @Mitr-yuzr last edited by

                        差点白收集了

                        Mitr-yuzr 1 Reply Last reply Reply Quote 0
                        • Mitr-yuzr
                          Mitr-yuzr 摸鱼 @damemod last edited by

                          @damemod 数据保存在数据库 (在目录下的NLPH.db文件)
                          一般来说只要不在execute或其余地方使用DELETE的sql命令的话是不会影响到数据的,在导出的时候其实也可以用sql命令再次过滤。

                          1 Reply Last reply Reply Quote 0
                          • cssxsh
                            cssxsh last edited by

                            为啥不推荐和其他插件一起使用

                            Mitr-yuzr 1 Reply Last reply Reply Quote 0
                            • Mitr-yuzr
                              Mitr-yuzr 摸鱼 @cssxsh last edited by

                              @cssxsh 不推荐只是为了不影响语料内容,因为我个人不希望训练数据中有与机器人交互的内容,而过滤起来略有麻烦。
                              但是实际应该并不影响和其他插件一同使用,没测试过依赖会不会冲突。

                              cssxsh 2 Replies Last reply Reply Quote 0
                              • cssxsh
                                cssxsh @Mitr-yuzr last edited by

                                @Mitr-yuzr
                                看了一下你的项目
                                打包没必要用 shadow

                                mirai-console 有自己的打包方式

                                mirai:buildPlugin

                                另外也没必要用 jackson ,
                                mirai-console 本身有 kotlinx.serialization-json 作为 json 序列化支持

                                Mitr-yuzr 1 Reply Last reply Reply Quote 0
                                • cssxsh
                                  cssxsh @Mitr-yuzr last edited by

                                  @Mitr-yuzr
                                  也许可以过滤掉 机器人发言时间 临近的发言
                                  虽然有误伤,但会好一些

                                  那你这个不能和其他插件一起用描述就有点问题
                                  应该是 为了避免其他插件的功能引发的对话文本 污染样本池,请避免在同一个群里同时使用本插件和其他插件

                                  Mitr-yuzr 1 Reply Last reply Reply Quote 0
                                  • Mitr-yuzr
                                    Mitr-yuzr 摸鱼 @cssxsh last edited by

                                    @cssxsh 项目是使用 buildPlugin 打包的,但我实在摸不清楚这种打包方式是否包括了依赖库所以留着了。
                                    关于jackson,原本是因为Ktorm在官方文档中说支持jackson模块方便序列化才使用的,但实际上无法使用,所以也留着了。
                                    确实在依赖这一块还有很大优化空间。

                                    1 Reply Last reply Reply Quote 0
                                    • Mitr-yuzr
                                      Mitr-yuzr 摸鱼 @cssxsh last edited by

                                      @cssxsh 确实是我的描述有问题,非常好的建议,已经修改了,非常感谢!

                                      cssxsh 1 Reply Last reply Reply Quote 0
                                      • cssxsh
                                        cssxsh @Mitr-yuzr last edited by

                                        @Mitr-yuzr
                                        导出 json 的基本格式是啥
                                        我之前写过前置插件
                                        https://github.com/cssxsh/mirai-hibernate-plugin

                                        这个内置有消息记录器
                                        随便写写就能加上新功能导出你想要的 nlp 数据

                                        Mitr-yuzr 1 Reply Last reply Reply Quote 0
                                        • Mitr-yuzr
                                          Mitr-yuzr 摸鱼 @cssxsh last edited by

                                          @cssxsh 看到过,而且是等我写完这个插件才看到的(悲)。
                                          不过想着化简配置和专门支持,其实也不差。

                                          cssxsh 2 Replies Last reply Reply Quote 0
                                          • cssxsh
                                            cssxsh @Mitr-yuzr last edited by

                                            @Mitr-yuzr
                                            我那个是前置插件
                                            可以另外写个依赖它的 mirai-hibernate-nlp 去过滤和输出

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 1 / 2
                                            • First post
                                              Last post
                                            Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact