一、用户签名

1 亿 B 站用户群体十分庞大,文本中蕴含着这个群体的认知信息(如兴趣、身份、座右铭等),如果能用签名训练 word2vec 词向量模型,说不定就有利用这个模型,对每个用户签名进行量化, 对用户进行分类。 本文要解决

  • 构建语料训练出模型
  • 简单看看模型训练效果



二、准备语料

Kaggle 网有 1 亿 B 站用户数据集,下载地址

https://www.kaggle.com/datasets/beats0/bilibili-user

之前分享过 数据集 | 哔哩哔哩 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



相关内容