NLPHelper - 自然语言处理模型训练数据采集专用插件
-
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
,即导出jsontype
String 导出类型 默认为 json
,目前仅支持json
和gpt2
注意:
本命令仅支持控制台使用。
所有sql输入均未作判断和处理直接执行,如有语法问题会catch并报错。其余指令存在sql注入风险,但没必要,因为你可以直接使用execute
。导出样例
__
json
gpt2
注意:
若追求更好的效果,仍需再进一步过滤噪声数据表
表名为
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
- 收集指定群里的聊天数据 (仅支持
-
祝Mirai论坛的各位中秋节快乐。
其实是因为colab跑模型又被制裁了闲来无事才来写插件的,不算难,但是平时不会直接接触到数据库这么低层(mmkv yyds!),完全是摸着脑袋来的。
至于后续的训练方式,等我有空了会写一个colab notebook,在另一个板块进行介绍,但是只能说不一定有办法接入。如果感兴趣的话可以点帖子右上角的铃铛关注一下帖子, 开始提前收集数据了……。
还有就是gpt2样例演示那图确实不妥,截图的时候没看清楚(我只是因为莫名其妙的bug急了!我平时很文明的千万要相信我!),等我找到代替的就换。
-
-
太棒了 期待后续
-
太棒了!
-
期待
-
关于训练方法,大概要下周就好了。
最近在训练其他模型和准备其他模型的数据集,可能没那么有空。
正好也给你们一段时间收集数据,大概收集到两千条就可以比较还原了。 -
过滤和收集是同时进行的吗,还有如何一键导入违禁词
-
@damemod 是的,如果检测到内容中有设定的过滤词的话则不会收集该聊天的内容(但导出时不会进行过滤)。
一键导入过滤词目前并没有很好的方法,你可以将过滤词拼在一起写成一个正则表达式,或是使用一键替换来格式化之后复制到Config中,或是在导出数据后使用程序再次过滤。 -
刚刚编辑了帖子,增加了关于过滤词的描述和两条新的SQL用例(LIKE、LIMIT和ORDER BY),并纠正了某个用例的错误(未经验证就写出来十分抱歉!现已标注错误)
-
差点白收集了
-
@damemod 数据保存在数据库 (在目录下的NLPH.db文件)
一般来说只要不在execute或其余地方使用DELETE的sql命令的话是不会影响到数据的,在导出的时候其实也可以用sql命令再次过滤。 -
为啥不推荐和其他插件一起使用
-
@cssxsh 不推荐只是为了不影响语料内容,因为我个人不希望训练数据中有与机器人交互的内容,而过滤起来略有麻烦。
但是实际应该并不影响和其他插件一同使用,没测试过依赖会不会冲突。 -
@Mitr-yuzr
看了一下你的项目
打包没必要用 shadowmirai-console 有自己的打包方式
mirai:buildPlugin
另外也没必要用 jackson ,
mirai-console 本身有 kotlinx.serialization-json 作为 json 序列化支持 -
@Mitr-yuzr
也许可以过滤掉 机器人发言时间 临近的发言
虽然有误伤,但会好一些那你这个不能和其他插件一起用描述就有点问题
应该是 为了避免其他插件的功能引发的对话文本 污染样本池,请避免在同一个群里同时使用本插件和其他插件 -
@cssxsh 项目是使用
buildPlugin
打包的,但我实在摸不清楚这种打包方式是否包括了依赖库所以留着了。
关于jackson,原本是因为Ktorm在官方文档中说支持jackson模块方便序列化才使用的,但实际上无法使用,所以也留着了。
确实在依赖这一块还有很大优化空间。 -
@cssxsh 确实是我的描述有问题,非常好的建议,已经修改了,非常感谢!
-
@Mitr-yuzr
导出 json 的基本格式是啥
我之前写过前置插件
https://github.com/cssxsh/mirai-hibernate-plugin这个内置有消息记录器
随便写写就能加上新功能导出你想要的 nlp 数据 -
@cssxsh 看到过,而且是等我写完这个插件才看到的(悲)。
不过想着化简配置和专门支持,其实也不差。 -
@Mitr-yuzr
我那个是前置插件
可以另外写个依赖它的mirai-hibernate-nlp
去过滤和输出