V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Yinz
V2EX  ›  程序员

使用卷积神经网络与代理服务器实现骂人弹幕的自动屏蔽

  Yinz ·
Yinzo · 2017-02-06 15:09:31 +08:00 · 11978 次点击
这是一个创建于 2878 天前的主题,其中的信息可能已经有所发展或是发生改变。

https://yinzo.github.io/14863637393852.html

使用的是 TensorFlow 后端的 keras , 3000 条弹幕的识别时间在 5s 左右(指的是 model.predict 的单句计时 5s 左右),可能是 model 隐层节点太多了?不知道前辈们有没有一些提高速度的方法呢,如果能帮我指一下方向那将会非常有帮助:D

接下来准备继续学 RNN 以及 LSTM 来继续优化这个玩具分类器:D

另外后排继续寻找广州的机器学习实习岗,希望有 dalao 收留简历在这里

80 条回复    2017-02-08 09:46:53 +08:00
cnallenzhao
    1
cnallenzhao  
   2017-02-06 15:15:16 +08:00
朱芳芳迷弟路过
Yinz
    2
Yinz  
OP
   2017-02-06 15:17:46 +08:00
@cnallenzhao 2333 我也!
Livid
    3
Livid  
MOD
   2017-02-06 15:23:57 +08:00   ❤️ 1
很有意思。

话说我在想,我们也需要类似的技术来识别水贴……

赠送你 1 个小时的置顶 :)
Yinz
    4
Yinz  
OP
   2017-02-06 15:26:04 +08:00
@Livid 这个鼓励非常大 XD 这次实现觉得最困难在于样本获取,我是日思夜想怎么弄到 B 站举报弹幕的数据,相信 Livid 作为站长应该是不存在这个问题的 :D
winkidney
    5
winkidney  
   2017-02-06 15:42:51 +08:00
默默支持 LZ ,武运昌隆 23333
Yinz
    6
Yinz  
OP
   2017-02-06 15:45:35 +08:00
@winkidney hhhhh 给阿毛拜个晚年
DlYgod
    7
DlYgod  
   2017-02-06 15:47:16 +08:00
朱芳芳女粉路过
popil1987
    8
popil1987  
   2017-02-06 15:51:04 +08:00
光用 gensim 不也行吗? svm 训练好,分类就是毫秒之间
knva
    9
knva  
   2017-02-06 15:52:09 +08:00
电竞恶霸朱芳芳,等一个开黑 你被强化了啦#5167
Yinz
    10
Yinz  
OP
   2017-02-06 15:56:39 +08:00
@popil1987 svm 确实没有尝试过,效率这么高吗,我觉得我可以去尝试一下,因为这边 CNN 效率算下来也是 1.7 毫秒 /条
jzp113
    11
jzp113  
   2017-02-06 15:56:44 +08:00
只要样本多。用朴素贝叶斯也可以啊
Yinz
    12
Yinz  
OP
   2017-02-06 15:58:59 +08:00
@jzp113 2333 对的,我之前用的贝叶斯分类器写过,但是就是训练数据必须得符合现实分布,样本收集起来就很麻烦。而这里我是通过搜索关键词收集的骂人弹幕,所以就方便一点。
lan894734188
    13
lan894734188  
   2017-02-06 16:08:46 +08:00 via Android
厉害了 同求广州地区网工运维职位
qq316107934
    14
qq316107934  
   2017-02-06 16:10:17 +08:00 via Android
直播官方没法屏蔽弹幕拉黑人真的是硬伤。。。
之前做了个 js 版熊猫 tv 弹幕的 filter ,只能屏蔽指定关键字,结合这个后端就方便多了,支持下。
另外要不要稍微改下变成反代版的?这样改 hosts 就行了,不影响正常上网。
gejigeji
    15
gejigeji  
   2017-02-06 16:12:42 +08:00
请问深圳的岗位考虑吗?
Yinz
    16
Yinz  
OP
   2017-02-06 16:14:17 +08:00
@qq316107934 原本我也是想着通过 host 来解决的,不过想起 Surge 有 URL Rewrite 就直接用了 XD ,我想大概改 host 也能直接生效?
Yinz
    17
Yinz  
OP
   2017-02-06 16:18:59 +08:00
@gejigeji 深圳也是可以考虑的,不过可能就是需要很适合我才会去的了,因为下学期还有两门课可能需要我来回两头跑

说得比较直接,望见谅 :D
wb14123
    18
wb14123  
   2017-02-06 16:19:45 +08:00
记得 keras 代码里面的一个例子就是用 RNN 做分类器,可以试试。
Yinz
    19
Yinz  
OP
   2017-02-06 16:20:07 +08:00
@wb14123 感谢,我可以参考一下:D
Yinz
    20
Yinz  
OP
   2017-02-06 16:24:45 +08:00
@gejigeji 当然,鹅厂的话我觉得是值得我两头跑的 :D
enenaaa
    21
enenaaa  
   2017-02-06 16:30:14 +08:00
@Livid 如果从自然语义上着手, 窃以为 word2vec 实现词汇聚类后,用 dnn 做分类, 也许有效果。
gejigeji
    22
gejigeji  
   2017-02-06 16:30:32 +08:00
@Yinz 给你发了邮件 麻烦查收下哈
jiangzhuo
    23
jiangzhuo  
   2017-02-06 16:35:03 +08:00
@qq316107934 训练好的模型做成 chrome 插件就好了
Yinz
    24
Yinz  
OP
   2017-02-06 16:39:34 +08:00
@jiangzhuo 主要这些弹幕播放器都是多平台的, chrome 插件不方便 app 等其他平台的直接套用 XD
Hstar
    25
Hstar  
   2017-02-06 16:46:40 +08:00   ❤️ 2
如果能自动骂人,我觉得这项目的关注度会上一个台阶.(认真脸) (逃
Yinz
    26
Yinz  
OP
   2017-02-06 16:53:57 +08:00   ❤️ 1
@Hstar hhhhhh 好主意,可以顺便拿收集到的数据用 RNN 训练个 language model 来自动骂人 (逃
Izual_Yang
    27
Izual_Yang  
   2017-02-06 17:35:14 +08:00 via Android
@Yinz
果然战争和黑产永远是技术发展和应用的最大推动力
regicide
    28
regicide  
   2017-02-06 17:49:02 +08:00
@Yinz 可以多抓取几次 看哪些弹幕没有了啊
Yinz
    29
Yinz  
OP
   2017-02-06 18:05:38 +08:00
@regicide 思考了一下,有点难,毕竟举报处理是 up 主负责的,处理的速度也很慢,跟不上弹幕的增加速度,一般换弹幕池了举报都没解决呢...
Necromancia
    30
Necromancia  
   2017-02-06 19:34:24 +08:00 via Android   ❤️ 1
晕咗迷弟前来参拜;D
romantic1412
    31
romantic1412  
   2017-02-06 19:51:19 +08:00   ❤️ 1
可以考虑一下 GAN
这样子你还能够顺便获得一个骂人水平很高的发帖机器 233
Yinz
    32
Yinz  
OP
   2017-02-06 20:21:46 +08:00
@romantic1412 GAN 指的是 Generative Adversarial Networks 吗,是个没了解过的网络呢 :D
不过通过生成样本来提高样本量这个思路好像在哪篇论文里看到过 XD 我找时间深入了解下看看 XD
binux
    33
binux  
   2017-02-06 20:32:58 +08:00
模型看起来不错,你不是分了 validate 数据吗?准确率多少?
R18
    34
R18  
   2017-02-06 20:35:25 +08:00 via Android
很不错!膜下
Yinz
    35
Yinz  
OP
   2017-02-06 20:39:26 +08:00
@binux 最终这个模型我测试了 20 次迭代,最后选的是第三次迭代的, Validation Accuracy 是 97.060%,训练部分的详细数据可以看这篇文章 :D
https://yinzo.github.io/14863637259966.html
wjm2038
    36
wjm2038  
   2017-02-06 21:41:00 +08:00   ❤️ 1
建议跟官方反映一下,我觉得 b 站应该是很乐意看到这些东西的,顺便一提要是想要高质量的骂人弹幕请去乐视,腾讯网的弹幕抓取。。。 70%都是喷子
xuboying
    37
xuboying  
   2017-02-06 21:44:39 +08:00 via Android
这个可以学习一下。
nbndco
    38
nbndco  
   2017-02-06 22:02:45 +08:00   ❤️ 4
还是有不少可以改进的。
看了你的模型
1. 这么少的数据,其实 dropout 是很重要的,但是没做
2. 最后一个 sigmoid 就好了,二分类不要 softmax ,白白浪费空间
3. 其实这个应用最有效的是关键词过滤,其他的都没用,你用什么方法最后其实内部都成为某种意义的关键词查找而已。虽然理解你想用 deep learning ,但是其实有的时候并不是最复杂的方法就最好用的。

另外简历里面用 python 居然没有用 numpy 为何还要写出来自曝其短。
nicksite
    39
nicksite  
   2017-02-06 22:06:42 +08:00 via Android
监督学习速度快很多啊
Yinz
    40
Yinz  
OP
   2017-02-06 22:16:18 +08:00
@nbndco 首先感谢建议:D

关于关键词过滤我是有这样的想法的,我平时过滤弹幕的做法通常都是看到某些弹幕后才寻找关键词加入屏蔽列表,但是长期下来总是有许多新的关键词出现,正是这些层出不穷的漏网之鱼(词)使我产生了使用机器学习来屏蔽的想法的。

我使用神经网络,是希望它能够在大量的骂人弹幕中,寻找出一些相对明显的,人工注意不到的特征(当然这些特征里面很可能也包括关键词特征),这也是我使用 CNN 而不是普通 MLP 的原因:)

如果单从识别并找出最佳的屏蔽关键词的角度来说的话,我觉得决策树可能是一个非常合适的选择

另外我是有使用 numpy 的,包括这个项目,只不过并不算非常熟练我也不太好意思写出来献丑了:D
wjm2038
    41
wjm2038  
   2017-02-06 22:20:35 +08:00 via Android
@Yinz 其实你的想法很好,但是由于人脑和中文的神奇性,中文的骂人话(写出来的(包括垃圾弹幕))会比你想象的要多,同音字,拆字,谐音字,等等,人工都不一定屏蔽的完,机器的话一定会有很多误杀,就比如垃圾弹幕中最明显的一个刷颜色。
Yinz
    42
Yinz  
OP
   2017-02-06 22:26:19 +08:00
@wjm2038 其实你所说的同音字,拆字,谐音字等问题,按我的理解,在 word2vec model 上就已经解决掉了, word2vec 一定程度上解决了自动识别语义相近的词语的问题 :O
nbndco
    43
nbndco  
   2017-02-06 22:28:45 +08:00
@Yinz 其实关键词不一定是以列表形式存在的,一个 bow+svm 其实也是关键词。
yexm0
    44
yexm0  
   2017-02-06 22:37:03 +08:00
@wjm2038 话说 B 站好像现在也在测试一种有可能会减少低素质弹幕的功能..不过默认情况下没有开启.要自己手动开.
Yinz
    45
Yinz  
OP
   2017-02-06 22:42:55 +08:00
@yexm0 2333 这个功能我有注意,我原本还尝试通过求这两个模式下的差集来快速获得屏蔽弹幕呢,但是当我求完差集出来一看,这个过滤效果更像是大规模无差别灭杀 2333 ,不排除可能是通过筛选节操值小于特定阈值的用户弹幕产生的弹幕池 XD
yexm0
    46
yexm0  
   2017-02-06 22:46:37 +08:00
@Yinz 你不妨试试发邮件给 B 站推荐下 :-)
wenymedia
    47
wenymedia  
   2017-02-06 22:49:45 +08:00 via Android   ❤️ 1
不过我之前看到猪场有类似基于机器学习类似的识别垃圾信息的产品 有兴趣可以去交流交流?
wjm2038
    48
wjm2038  
   2017-02-06 22:53:54 +08:00 via Android
@yexm0 你想多了。。这个只是 UP 主屏蔽的别名。。 @Yinz
yexm0
    49
yexm0  
   2017-02-06 23:01:02 +08:00
@wjm2038 这功能开启后很多视频里的弹幕数直接少一大半.目测应该不是对应的 UP 主屏蔽.
wjm2038
    50
wjm2038  
   2017-02-06 23:04:23 +08:00 via Android
@yexm0 是的。是整合了很多的 up 屏蔽的,我记得没错的话是关键字加 uid
yexm0
    51
yexm0  
   2017-02-06 23:07:44 +08:00
@wjm2038 同意.
Yinz
    52
Yinz  
OP
   2017-02-06 23:10:27 +08:00
@wjm2038 并不是 up 主屏蔽 XD 你可以观察一下开关这个选项前后的弹幕池,开选项之前是 http://comment.bilibili.com/13769505.xml , 开启之后变成了 http://comment.bilibili.com/rc/13769505.xml

另外 up 主屏蔽的 api 是这样的 http://comment.bilibili.com/cloud/filter/8376267.json
XD
gladuo
    53
gladuo  
   2017-02-06 23:22:49 +08:00   ❤️ 1
1. 只用 Word2vec 加关键词即可, CNN 应该并不能明显提升 acc
2. 训练数据太少
Yinz
    54
Yinz  
OP
   2017-02-06 23:30:23 +08:00
@gladuo 请问第一点能否展开一点说呢:D

因为我的目标是能够识别出包括无脏字的反讽弹幕,这一定程度上涉及了语义的问题,我思考了一段时间,还是没有想到关键词如何实现这样的目标,希望能够获得进一步的指点 :O
yujia
    55
yujia  
   2017-02-07 02:39:05 +08:00 via iPhone   ❤️ 1
这种识别 spam 的 naive bayes 真的很好用
am241
    56
am241  
   2017-02-07 03:25:00 +08:00   ❤️ 1
加 L1 正则会不会好点?
zgqq
    57
zgqq  
   2017-02-07 09:54:33 +08:00 via Android
@Yinz 如果一个人在直播打游戏,打得很垃圾,然后弹幕有人说你好厉害哦,这情况应该属于反讽了吧,首先你要知道那个人打得拉不垃圾,垃圾的标准是什么,真不知道你们搞机器学习怎么办到的
madao
    58
madao  
   2017-02-07 11:01:30 +08:00
哈哈,你的文章的视频例子是泡泡爆炸后 carry 的那一个吧。 @Yinz
skyduy
    59
skyduy  
   2017-02-07 11:04:34 +08:00   ❤️ 1
支持一下,最近我也在搞类似的分类器~
plqws
    60
plqws  
   2017-02-07 12:30:10 +08:00   ❤️ 1
有没有屏蔽空耳的。。。。
Yinz
    61
Yinz  
OP
   2017-02-07 12:54:26 +08:00
@am241 感谢提醒!确实没在 loss function 上做太多的优化,我后续会尝试加入一些 regularization 来看看效果的 :D
Yinz
    62
Yinz  
OP
   2017-02-07 12:57:29 +08:00   ❤️ 1
@zgqq 其实不必要把目光只放在单条弹幕上,比如说我们可以通过同时分析最近的所有弹幕,若所有弹幕都在说垃圾,只有一条在叫好,那么这也是一个比较明显的特征。若加上一些其他的特征作为辅助,可能就能实现识别反讽的这一目标了。
Yinz
    63
Yinz  
OP
   2017-02-07 12:58:08 +08:00
@madao 哈哈哈哈对的,心疼泡泡被带一下午节奏
Yinz
    64
Yinz  
OP
   2017-02-07 13:01:00 +08:00
@plqws 你这么一说,好像空耳还真的挺难识别的。。不过一般空耳的句子流畅度、语义一致性和弹幕长度等特征应该会和普通弹幕有所区别,说不定也是可以做到的,这个得下手试过才能知道了
chipmuck
    65
chipmuck  
   2017-02-07 13:09:21 +08:00   ❤️ 1
听说 twitch.tv 就是这么屏蔽脏弹幕的
menc
    66
menc  
   2017-02-07 14:04:09 +08:00
@Livid 需要技术支持么, AI 从业人员可以无偿提供相关支持
menc
    67
menc  
   2017-02-07 14:05:00 +08:00
@Yinz 别闹,朴素贝叶斯和其他分类器比最大的特点就是对数据分布没有要求
menc
    68
menc  
   2017-02-07 14:09:07 +08:00
@Yinz char level cnn 最大的作用在于经过混淆的没有语义含义的语句,比如 anti spam :“激.情|裸一聊一加 v : xxx ”
这种,对于弹幕识别, char cnn 不是合适的应用场景。
RNN 和 LSTM 更是了,弹幕没有 context ,你要 memory 有什么用?

这个场景最适合的方法还是传统机器学习方法。这不是一个复杂的 task 。
menc
    69
menc  
   2017-02-07 14:12:08 +08:00
@Yinz 。。。正则是训练一个分类器首先想到的东西,必须加在 loss 里面,没有正则的 NN 几乎是必然过拟合的
menc
    70
menc  
   2017-02-07 14:24:25 +08:00
文本是 linear separatable 很强的东西,单在 text classification 方面,用 linear kernel 的 svm 是非常好的做法。
Yinz
    71
Yinz  
OP
   2017-02-07 14:36:15 +08:00
@menc 之前的贝叶斯是我按照自己的理解写的,我对朴素贝叶斯的理解可能存在问题,我是这么理解的:

通过独立同分布的训练集,估计出每一类的先验概率 P(c) ,然后再估计出每个属性(词)的条件概率 P(x|c),由此计算出每个词对应的 P(c|x)
这里提到了同分布,如果分布不同,如何能估计出正确的 P(c) 呢

关于 context ,我是打算要把整个视频的弹幕作为 context 的,当然,我还没有实际学习过这两个模型,并没有什么明确的观点。

『没有正则的 NN 几乎是必然过拟合』这个观点请问是你的经验吗,因为在这个项目里我是通过人工观察 train acc 和 validation acc 来选择的模型,相当于人肉 early stopping ,不知道这样的模型是否也是过拟合的呢?

不过看来 bow+svm 确实是个好模型,我需要尝试一下了
menc
    72
menc  
   2017-02-07 17:49:32 +08:00
@Yinz 不是你找到好的 round 停下就没有过拟合的。参数爆炸带来的过拟合是没法避免的,即使在 loss 最低点也是过拟合状态。
menc
    73
menc  
   2017-02-07 17:51:29 +08:00
RNN 系列 NN 的重要假设就是, t-k 状态对 t 状态的 label 是有影响的,不是自己强行组合一个 context 就能套用 RNN 。
woniu127
    74
woniu127  
   2017-02-07 17:55:48 +08:00
隔壁院所的来支持一下,学习机器学习中
Yinz
    75
Yinz  
OP
   2017-02-07 18:08:53 +08:00
@menc 感谢指导:D
我还没有了解过参数爆炸这个概念,还是有很长的路要走。 RNN 这边还没有深入学习,等我学习过后或许提出的观点会更可行一点吧 :D

另外关于贝叶斯的样本分布问题还请赐教 :D
pandachow
    76
pandachow  
   2017-02-07 22:02:46 +08:00 via iPhone   ❤️ 1
最好的效果应该从弹幕本身出发,更多地挖掘弹幕自身的特征。

general 来说,朴素贝叶斯应该是性价比最高的算法。
zgqq
    77
zgqq  
   2017-02-07 22:11:23 +08:00
@Livid 好像有看到一个项目是识别标题党的
emric
    78
emric  
   2017-02-07 22:37:54 +08:00
@plqws 我这里有份过滤表列。大概能过滤 70% 左右空耳。
我最近也在做一个大概有点像 AdBlock 这样的东西过滤 B 站弹幕,以后订阅一下就好。
嗯.... 按照目前的进度... 明年吧...

https://gist.github.com/17/ec36f4923c74cec10d2de2ab4e425154
pandazxx
    79
pandazxx  
   2017-02-08 09:41:07 +08:00   ❤️ 1
楼主方便留个联系方式不,推荐个实习岗位
pandazxx
    80
pandazxx  
   2017-02-08 09:46:53 +08:00
可以加我 qq 63600154
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5686 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 01:39 · PVG 09:39 · LAX 17:39 · JFK 20:39
Developed with CodeLauncher
♥ Do have faith in what you're doing.