利用word2vec创建中文主题词典——以网络暴力关键词为例
本文主要是记录一下自己过滤分类信息的一个步骤。主要目的是从爬取的素材中得到一个集中、有效的、有关网络暴力的中文词库。主要思路是将已分词的素材 source.txt通过 word2vec 训练出一个模型 vectors.bin,再把人工挑选的种子库 feed.txt 中的种子输入模型,得到相似的词,最后获得词库。目录文本预处理准备语料构建种子库Word2vec模拟Linux环境(Cygwin)wor
- 本文主要是记录一下自己过滤分类信息的一个步骤。
- 主要目的是从爬取的素材中得到一个集中、有效的、有关网络暴力的中文词库。
- 主要思路是将已分词的素材 source.txt 通过 word2vec 训练出一个模型 vectors.bin,再把人工挑选的种子库 feed.txt 中的种子输入模型,得到相似的词,最后获得词库。
文本预处理
我在本篇文章中使用的是从新浪微博中爬取的网友有关网暴态度倾向的材料,总数约有90万条记录,包括用户名、微博内容、发布时间等属性(UTF-8编码)。
文本的预处理主要包括:
- 语料的初步过滤、去除特殊字符、特殊表情文本化和分词;
- 种子库的人工采集和同义联想。
准备语料
我使用的Excel表格来存放素材,具体结构如下:
来源/用户名 | 内容 |
---|---|
罗百辉:从0到1直播带货,从1到100打好营销这张牌 | 给到观众的体验会更好,其次就是直播支架和补光灯,这是必备的配置。常用设备:手机、支架、补光灯、背景、T台、礼品桌、笔记本电脑、网络、挂通、熨烫机等4产品选款产品可以是新款上市、季末清仓、反季促销,根据 |
许可馨还要点脸吗?为啥十年教育出一个“人渣” | 更是坑自己。许可馨最后会有怎样的结局,目前她的微博已经被“查封”,她的父母也被很多的网友“人肉”搜索,今后会何去何从,我们根本不关心。但不过她再次给我们提出了思考,这些孩子为何会这么优越呢?在个 |
肖战风波后首度发博翻车?后援会凌晨声明,谴责黑粉引导舆论骂战 | 明粉丝,却有人长期冒充他的粉丝蓄意发布恶意言论,以博取关注从中获利,也再次呼吁大家抵制这种行为,勿被恶意人士利用,但也有网友觉得后援会此番是在洗白,称长期有人这么做,是想把227事件甩锅到黑粉 |
…… | …… |
根据肉眼判断一些结构化的短语,如一些粉丝的反黑站微博会固定带有【网暴举报+拉黑+禁止人身攻击】类似的内容,但是实质内容与网暴无关。所以我们利用excel的筛选功能过滤这些无效内容。
由于excel处理文本速度很慢(尤其是这种几十万的数据),所以我们将【内容】复制到记事本中处理,得到 pre_source.txt 文件。
可以去除无关的标点符号、表情符号等,对于有特定表达形式和含义的表情(如🐴、🐶、🐔、👴等)可以用其对应的文本代替。
最后我们利用 python 中的 jieba 来对文本进行分词处理。
具体代码如下:
import jieba
fR = open('pre_ource.txt', 'r', encoding='UTF-8')
sent = fR.read()
sent_list = jieba.cut(sent)
fW = open('source.txt', 'w', encoding='UTF-8')//将分词结果输出到"source.txt"中
fW.write(' '.join(sent_list))
fR.close()
fW.close()
最后的效果大概如下:
source.txt
给 到 观众 的 体验 会 更好 其次 就是 直播 支架 和 补 光灯 这是 必备 的 配置 常用 设备 手机 支架 补 光灯 背景 T台 礼品 桌 笔记本电脑 网络 挂通 熨烫 机等 产品 选款 产品 可以 是 新款 上市 季末 清仓 反季 促销 根据
更是 坑 自己 许可 馨 最后 会 有 怎样 的 结局 目前 她 的 微博 已经 被 查封 她 的 父母 也 被 很多 的 网友 人 肉 搜索 今后 会 何去何从 我们 根本 不 关心 但 不过 她 再次 给 我们 提出 了 思考 这些 孩子 为何 会 这么 优越 呢 在 个
非常 多 的 女生 也 非常 喜欢 他 可是 人红 是非 多猎 鞠婧 祎 曾经 被 曝光 不止 一 莆次 在 现场 耍 匝 大牌 不 知道 为什么 总有 黑粉 和 营销 兜 号 组团 来 黑手 他 可能 真的 虑 是因为 车基恃于
……
构建种子库
种子库的构建很简单,就是人工观察内容中与网暴有关的记录,并从中确定出能最大程度还原网暴记录且带来噪声较少的关键词。
种子数量大概几十个左右,将来用于从种子得到更多的相似词语,所以各种子间要确保一定的独立性,当然也要考虑词语的不同形式(如“脑瘫”、“nt”、“NT”)。
最后,我们得到了种子库 feed.txt 。
feed.txt
人肉(?)
黑粉
人身攻击
网络暴力
喷子
键盘侠
……
- 文件中“人肉”特殊标记,是因为“人肉”会带来较大的噪声,但是它又是网络暴力的重要形式之一,所以针对这个种子的衍生需要进一步的探究。
Word2vec
模拟Linux环境(Cygwin)
因为word2vec需要在Linux环境下运行,所以在Windows系统中,我们需要模拟出Linux的操作环境。其中,Cygwin是最常用的模拟软件之一。
在Cygwin的安装过程中,注意在【选择要安装的包】步骤中,选择Devel与Utils模块。如下图所示:
安装完毕后,进入 Cygwin 的安装目录,点开 /home/ 可以看到自己系统名称的文件夹,在其中可以存放 word2vec 和素材文件,对应在 linux 的默认路径下。
word2vec模型训练
下载C语言版的 word2vec,地址:https://github.com/svn2github/word2vec
下载解压后把文件夹复制到 Cygwin 相关目录下,如上图。再将分词后的素材文件 source.txt 复制到 word2vec-master 文件夹下。
打开 Cygwin,输入命令,打开 word2vec 文件夹。
SHTR@LAPTOP-0QSOUKLB ~
$ cd word2vec-master/
配置 word2vec
SHTR@LAPTOP-0QSOUKLB ~/word2vec-master
$ make
make: 对“all”无需做任何事。
(可能大家的提示和我不一样,建议先忽略报错,继续做下去)
开始训练模型
SHTR@LAPTOP-0QSOUKLB ~/word2vec-master
$ ./word2vec -train source.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1
随即,word2vec 开始模型训练。
训练结束后结果显示如下:
Starting training using file source.txt
Vocab size: 146678
Words in train file: 42853097
Alpha: 0.000006 Progress: 99.99% Words/thread/sec: 39.73k
real 38m4.640s
user 269m47.171s
sys 0m20.186s
最后,加载训练好的模型 vectors.bin
SHTR@LAPTOP-0QSOUKLB ~/word2vec-master
$ ./distance vectors.bin
加载后,出现以下提示,输入种子词,即可得到相似的词。
Enter word or sentence (EXIT to break): sb
Word: sb Position in vocabulary: 2923
Word Cosine distance
------------------------------------------------------------------------
煞笔 0.669515
憨批 0.651499
智障 0.608910
玩意 0.575425
tm 0.566943
妈 0.551868
傻批 0.548631
神经病 0.546263
傻 0.539214
弱智 0.533152
玩意儿 0.532617
没脑子 0.521820
恶心 0.509597
tmd 0.507793
md 0.506143
有病 0.500755
傻狗 0.499303
脑残 0.497105
真服了 0.491169
沙币 0.484326
无语 0.472168
天天 0.471431
ctm 0.470460
尼玛 0.469824
死妈 0.468571
辣鸡 0.467711
nmsl 0.466579
老子 0.459713
fw 0.459623
没妈养 0.458109
sl 0.457547
随主 0.457141
TM 0.456615
脑瘫 0.455201
cnm 0.454635
TMD 0.451271
他妈 0.450716
母狗 0.449706
孤儿 0.448423
垃圾 0.448065
Enter word or sentence (EXIT to break): 网络
Word: 网络 Position in vocabulary: 13
Word Cosine distance
------------------------------------------------------------------------
暴力 0.802902
校园 0.577842
施暴者 0.529357
互联网 0.511295
网路 0.477932
舆论 0.477668
霸凌 0.475106
受害者 0.465842
可怕 0.465204
网暴 0.459172
社会舆论 0.449941
网民 0.434657
伤害 0.427830
网上 0.425253
抑郁症 0.420694
欺凌 0.417121
抑郁 0.416275
施加 0.412934
以暴制暴 0.412061
暴力事件 0.411169
家庭暴力 0.411111
恐怖 0.408639
社会 0.403121
恶评 0.402864
无形之中 0.397039
遭受 0.394655
狂欢 0.392182
语言 0.391798
无辜 0.390650
谩骂 0.390484
虚拟世界 0.390321
事件 0.389930
何时休 0.388254
始作俑者 0.385578
行为 0.381619
实施者 0.380958
无休止 0.380143
加害者 0.378034
讨伐 0.374142
帮凶 0.373178
由此,就可以获得相近词,从而拓展词库了。
当然最后可以通过脚本或者代码来实现对种子库文件 feed.txt 的读取来批量得到对应的相似词,从而避免人工一个一个词查询。
更多推荐
所有评论(0)