一、用户签名
1 亿 B 站用户群体十分庞大,文本中蕴含着这个群体的认知信息(如兴趣、身份、座右铭等),如果能用签名训练 word2vec 词向量模型,说不定就有利用这个模型,对每个用户签名进行量化, 对用户进行分类。 本文要解决
- 构建语料训练出模型
- 简单看看模型训练效果
二、准备语料
Kaggle 网有 1 亿 B 站用户数据集,下载地址
之前分享过 数据集 | 哔哩哔哩 1 亿用户数据 , 阅读此文可以熟悉 pandas 的一些基本操作,如数据读取、文本操作等。
# 从kaggle下载B站1亿用户数据
import pandas as pd
# 查看前5行
df = pd.read_csv('User.csv', nrows=5)
df
Run
将 9093092 个非空签名汇总到 B 站用户签名语料.txt
with open('B站签名.txt', 'w', encoding='utf-8') as f:
raw_text = '\n'.join(df['sign'].fillna(''))
f.write(raw_text)
代码运行后,得到 320M 的 B 站签名.txt 。
三、训练 Word2Vec
我使用的自己 未公开 的 cntext 2.1.6 版本, Bug 频出,等调整好了再公开。
3.1 安装 cntext
将 cntext-2.1.6-py3-none-any.whl 放置于桌面,打开 cmd (苹果电脑打开 terminal), 输入 cd desktop
cd desktop
之后在 cmd (苹果电脑打开 terminal) 中使用 pip3 安装
pip3 install cntext-2.1.6-py3-none-any.whl
文末有 **_cntext-2.1.6-py3-none-any.whl _**获取方式
3.2 训练 word2vec
cntext 训练时候 Word2Vec 模型参数
- corpus_file 语料 txt 文件路径; 刚刚准备的 B 站用户签名语料.txt
- window_size 上下文窗口大小(上下文语义)
- vector_size 向量维度数
- chunksize 每次语料 txt 文件中读取的行数
- lang 语言的语言
# cntext2.1.6未公开,获取2.1.6请阅读文末获取方式
import cntext as ct
model = ct.Word2Vec(corpus_file='B站用户签名语料.txt',
window = 15,
vector_size = 200,
window_size = 15
lang='chinese')
Run
Mac(Linux) System, Enable Parallel Processing
Cache output/B站签名_cache.txt Not Found or Empty, Preprocessing Corpus
Reading Preprocessed Corpus from output/B站签名_cache.txt
Start Training Word2Vec
Word2Vec Training Cost 275 s.
Output Saved To: output/B站签名-Word2Vec.200.15.bin
耗时 275s, 模型训练完成!需要注意, output 文件夹内有
- B 站签名-Word2Vec.200.15.bin 模型文件
- B 站签名_cache.txt 训练缓存文件
3.3 评估模型
使用近义法和类比法, 判断模型的表现。详情可查看文档
ct.evaluate_similarity(model)
ct.evaluate_analogy(model)
Run
近义测试: similarity.txt
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/cntext/model/evaluate_data/similarity.txt
评估结果:
+----------+------------+----------------------------+
| 发现词语 | 未发现词语 | Spearman's Rank Coeficient |
+----------+------------+----------------------------+
| 434 | 103 | 0.34 |
+----------+------------+----------------------------+
类比测试: analogy.txt
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/cntext/model/evaluate_data/analogy.txt
Processing Analogy Test: 100%|██████████████| 1198/1198 [00:11<00:00, 99.91it/s]
评估结果:
+--------------------+----------+------------+------------+----------+
| Category | 发现词语 | 未发现词语 | 准确率 (%) | 平均排名 |
+--------------------+----------+------------+------------+----------+
| CapitalOfCountries | 360 | 317 | 25.56 | 4.02 |
| CityInProvince | 175 | 0 | 33.71 | 4.64 |
| FamilyRelationship | 240 | 32 | 44.17 | 1.93 |
| SocialScience | 2 | 68 | 0.00 | NaN |
+--------------------+----------+------------+------------+----------+
近义测试: Spearman’s Rank Coeficient 系数取值[-1, 1], 取值越大, 说明模型表现越好。
类比测试:
- CapitalOfCountries B 站用户签名语料在此项表现大于 0,说明很多签名里会出现国家首都这类信息。
- CityInProvince B 站用户签名语料在此项表现大于 0,说明很多签名里会出现省份省会这类信息。考虑到用户几乎全为中国人,所以此项准确率高于 CapitalOfCountries。
- FamilyRelationship B 站用户签名语料体现的是一个个鲜活的中国人,签名中必然含有更多的人际关系, 所以此项准确率是四个项目中最高的。
- SocialScience B 站用户签名语料在此项表现最差, 应该是语料中常见的社会科学词语提及很少。
整体而言,模型效果一般,但是不是算法代码问题,而是语料出的问题。毕竟每个用户的签名一般都是一句话,太短,信息太少。
四、使用 word2vec
4.1 读取模型
使用 gensim 录入模型 B 站用户签名语料-Word2Vec.100.15.bin ,
from gensim.models import KeyedVectors
import cntext as ct
w2v = ct.load_w2v('output/B站签名-Word2Vec.200.15.bin')
print('模型词汇量: ', len(w2v))
Run
模型词汇量: 244491
4.2 查询某词的词向量
w2v['高冷']
Run
array([ 1.05914783e+00, 4.51383203e-01, -1.34764791e+00, -9.42894161e-01,
5.28594255e-01, 8.05936933e-01, -1.59555584e-01, 2.42719814e-01,
-6.04722261e-01, -9.25606042e-02, 9.69056904e-01, 8.85407850e-02,
-1.67851341e+00, 3.26303959e-01, 6.52321458e-01, 5.77043407e-02,
-4.24268842e-02, -2.64299393e-01, 5.24512887e-01, 2.15208486e-01,
-2.09263057e-01, -4.55661058e-01, 8.78976703e-01, -1.24363959e+00,
-1.71196852e-02, -9.03965294e-01, -6.52690083e-02, 2.47650072e-02,
-2.82155067e-01, 9.09134224e-02, 9.13890541e-01, -1.40862179e+00,
-1.31956196e+00, -5.29659569e-01, 1.23605825e-01, -4.00647372e-01,
4.94630456e-01, 2.81695575e-01, 1.71391249e-01, 1.23341233e-01,
-7.70617545e-01, 5.81079908e-02, -4.89788234e-01, 2.14924827e-01,
-7.73121595e-01, -6.66803181e-01, -1.31617844e+00, 1.18301921e-01,
6.22543573e-01, -8.07524860e-01, -4.36694354e-01, 2.95946062e-01,
3.10503364e-01, -4.93252903e-01, 1.27962172e-01, 1.97043195e-01,
6.61175609e-01, -1.80842638e-01, 1.13270843e+00, -5.34760773e-01,
9.13145125e-01, 5.48191011e-01, 7.68198539e-03, 1.17955339e+00,
-1.96015276e-02, 9.14144278e-01, -9.06695664e-01, 4.39731702e-02,
-3.87832075e-01, 4.72544342e-01, 4.95476156e-01, -1.21628530e-01,
-4.41256445e-03, 1.82375580e-01, -7.00045705e-01, 4.34259921e-01,
2.00862193e+00, -5.61490715e-01, -7.67120644e-02, 5.78972995e-01,
-7.80492842e-01, -5.01321375e-01, -5.50926566e-01, -8.99926543e-01,
-1.66289490e-02, 1.77679747e-01, 4.23889339e-01, 1.40111005e+00,
-7.63866380e-02, -8.86032939e-01, -1.08106744e+00, 3.31989765e-01,
3.78885448e-01, -1.23718023e+00, 2.09680721e-01, 2.39727721e-01,
2.46049106e-01, 2.32866824e-01, -6.65583909e-02, 1.09542537e+00,
-5.44713318e-01, 7.68220305e-01, -1.56612769e-02, 3.48719925e-01,
2.91741371e-01, 1.88722059e-01, -2.12467611e-01, 8.20825279e-01,
-1.74725935e-01, -8.05535197e-01, -1.41250715e-01, -7.84179568e-01,
-8.00660312e-01, -1.12991728e-01, -2.16052849e-02, -1.07448053e+00,
2.53552765e-01, -1.28611282e-01, -1.16868567e+00, -6.08788371e-01,
4.30017859e-02, -5.11076570e-01, 6.43583059e-01, 3.11966389e-01,
-1.63116843e-01, 3.58751595e-01, 5.16831456e-03, 5.09353161e-01,
1.61675465e+00, 6.42039478e-01, -1.07160270e+00, -2.34255135e-01,
-7.27983773e-01, 1.20267116e-01, -1.11912894e+00, 1.49096262e+00,
-1.48015752e-01, 6.85670376e-02, -1.70197403e+00, 2.16349974e-01,
1.32302952e+00, 5.39037228e-01, -8.35760951e-01, -7.43441284e-01,
6.55625939e-01, -5.07541537e-01, -5.40877655e-02, -5.38533449e-01,
-2.57937461e-01, 8.67499232e-01, -6.53150141e-01, -1.32043970e+00,
-5.84588587e-01, 1.24599323e-01, -8.35753500e-01, -2.68954426e-01,
3.67542468e-02, 1.61010170e+00, 7.27127492e-01, 1.35515738e+00,
-2.76694775e-01, 2.69006938e-01, 4.81265247e-01, -6.30314708e-01,
-3.66074532e-01, 3.03934813e-01, 1.92417920e+00, 4.67498928e-01,
-1.83004290e-01, 1.01947844e+00, -5.52489638e-01, 1.59275869e-03,
4.84914184e-01, 1.33545566e+00, -9.75372076e-01, 2.25273356e-01,
6.02540433e-01, 7.07564950e-01, 1.36330187e-01, -4.34346311e-02,
4.53452200e-01, 1.58401883e+00, -6.68083191e-01, -1.30876124e+00,
-1.19713686e-01, -9.80615169e-02, -2.04207993e+00, 8.29822361e-01,
-4.08902228e-01, -4.70339246e-02, 1.00982547e+00, 1.64084151e-01,
4.62104648e-01, -2.28677273e-01, -5.95047355e-01, -2.71069705e-01,
6.27930462e-01, -8.85554433e-01, -1.79520398e-01, -3.44800770e-01],
dtype=float32)
4.3 查看近义词
通过给定词语,查看其近义词,可以了解模型训练的好坏。语义捕捉的合理,说明语料合理,模型训练的好。
# 列表中可以传入任意多个词,这里大邓偷懒,都只传入了一两个词
w2v.most_similar(['女汉纸'], topn=20)
Run
[('汉纸', 0.8672055602073669),
('腹黑', 0.8662189841270447),
('文艺清新', 0.849425733089447),
('闷骚', 0.8427557945251465),
('神经大条', 0.8329920768737793),
('汉子', 0.8232208490371704),
('宅基', 0.8224843144416809),
('猥琐大叔', 0.8214939832687378),
('偶是', 0.8164061307907104),
('腐宅', 0.8117423057556152),
('宅女腐女', 0.8073472380638123),
('软妹', 0.7999386787414551),
('萌妹', 0.7999064326286316),
('小女生', 0.7998836040496826),
('天蝎女', 0.7971166372299194),
('傲娇受', 0.7964810132980347),
('天蝎', 0.7957624197006226),
('天蝎座', 0.7915034890174866),
('女纸', 0.7912994623184204),
('双鱼座', 0.7900263667106628)]
w2v.most_similar(['犯二'], topn=20)
Run
[('脱线', 0.8355404734611511),
('神经质', 0.8035165667533875),
('神经大条', 0.7816897630691528),
('发神经', 0.780509352684021),
('人来疯', 0.7794896960258484),
('精分', 0.7705598473548889),
('毒舌', 0.7692195773124695),
('犯病', 0.7659722566604614),
('闷骚', 0.7620697617530823),
('迷糊', 0.7608135342597961),
('智商在线', 0.7525709867477417),
('抽疯', 0.7491970658302307),
('欢脱', 0.7444456219673157),
('深井', 0.7416326403617859),
('抽风', 0.7321327924728394),
('精分患者', 0.7319940328598022),
('装嫩', 0.7267141342163086),
('蒙圈', 0.7262043952941895),
('神经', 0.7257982492446899),
('假正经', 0.7215201258659363)]
w2v.most_similar(['内向'], topn=20)
Run
[('外向', 0.8474423885345459),
('慢热', 0.8272333741188049),
('不爱说话', 0.8249834775924683),
('不善言辞', 0.80635666847229),
('腼腆', 0.7940059304237366),
('孤僻', 0.7929618954658508),
('开朗', 0.7585728168487549),
('闷骚', 0.745791494846344),
('神经质', 0.7454176545143127),
('多愁善感', 0.7348753809928894),
('胆小', 0.7213962078094482),
('沉默寡言', 0.7145323157310486),
('随和', 0.7115553617477417),
('敏感', 0.7103193402290344),
('水瓶座', 0.7092751264572144),
('大大咧咧', 0.7085798382759094),
('高冷', 0.7084994912147522),
('性格开朗', 0.7064590454101562),
('耿直', 0.7048951983451843),
('做作', 0.704330325126648)]
五、获取资源
内容整理不易, 本文内容分免费和付费部分。 免费部分可以直接下载数据、构建语料、使用 word2vec 模型。
付费部分主要是 cntext,用于训练 word2vec 模型。 如果对本文感兴趣,可加微信 372335839, 备注「姓名-学校-专业」
- 免费 1亿用户数据集 https://www.kaggle.com/datasets/beats0/bilibili-user
- 免费 B站签名-Word2Vec.200.15.bin 链接: https://pan.baidu.com/s/1ILVwu6gGGGP0IHv-vsjgvw?pwd=em99 提取码: em99
- 100元 获得cntext-2.1.6-py3-none-any.whl