一、简介

Stanford GloVe(Global Vectors for Word Representation)算法作为一种融合全局统计信息与局部上下文窗口的词嵌入模型,相较于Word2Vec仅依赖局部上下文,GloVe利用全局统计信息,能更精准地反映词频分布特征。例如,在高维词向量(如200D)中,GloVe在词语类比任务中准确率达75%,并在命名实体识别任务中优于其他词嵌入模型。因其高效的语义表征能力,在社会学、管理学等领域展现出广泛的应用价值。 相关词嵌入文献资料可阅读



二、环境准备

cntext2.x 内置了 GloVe 训练所需的环境,支持 win 和 mac。

获取cntext2.x 的安装文件 cntext-2.1.5-py3-none-any.whl,并将该whl文件放置于桌面。执行以下安装命令

cd desktop
pip install cntext-2.1.5-py3-none-any.whl

ct.GloVe(corpus_file, lang='chinese', dict_file=None, stopwords_file=None, vector_size=100, window_size=15, min_count=5, max_memory=4.0, max_iter=15, x_max=10)
  • corpus_file: 输入语料文件路径(文本格式)。该文件为分词后的语料文件。
  • lang: 语料文件的语言类型,默认为 ‘chinese’。
  • dict_file: 自定义词典txt文件路径,默认为None。utf-8编码。
  • stopwords_file: 停用词文件路径,默认为 None。utf-8编码。
  • vector_size: 词向量维度,默认 100。
  • window_size: 上下文窗口大小,默认 15。
  • min_count: 忽略出现次数低于此值的单词,默认 5。
  • max_memory: 可供使用的最大内存大小,单位为GB,默认 4; 该参数越大,训练越快。
  • max_iter: 训练的最大迭代次数,默认 15。
  • x_max: 共现矩阵中元素的最大计数值,默认 10。



三、训练中文GloVe

我们其实只需要设置 corpus_filelang, 但为了让大家知道

  • 上下文的窗口大小 window_size
  • 训练出模型词语的维度数 vector_size
import cntext as ct

# 简化版调用。训练window_size=100维, vector_size=15
# glove_wv = ct.GloVe(corpus_file='data/三体.txt', lang='chinese')

# 正常调用。训练window_size=15维, vector_size=50
glove_wv = ct.GloVe(corpus_file='data/三体.txt', 
                    lang='chinese',
                    vector_size=50,
                    window_size=15,
                    only_binary=False) # 同时保存txt和bin两种格式的模型文件

glove_wv

Run

Mac(Linux) System, Enable Parallel Processing
Cache output/三体_cache.txt Not Found or Empty, Preprocessing Corpus
Start Training GloVe
BUILDING VOCABULARY
Using vocabulary of size 6975.

COUNTING COOCCURRENCES
Merging cooccurrence files: processed 2106999 lines.

Using random seed 1743474106
SHUFFLING COOCCURRENCES
Merging temp files: processed 2106999 lines.

TRAINING MODEL
Read 2106999 lines.
Using random seed 1743474106
04/01/25 - 10:21.46AM, iter: 001, cost: 0.055981
04/01/25 - 10:21.46AM, iter: 002, cost: 0.050632
......
04/01/25 - 10:21.48AM, iter: 014, cost: 0.030047
04/01/25 - 10:21.48AM, iter: 015, cost: 0.029100

GloVe Training Cost 9 s. 
Output Saved To: output/三体-GloVe.50.15.txt
Output Saved To: output/三体-GloVe.50.15.bin
<gensim.models.keyedvectors.KeyedVectors at 0x331517440>


四、使用中文GloVe模型

4.1 加载模型

import cntext as ct

# 加载word2vec模型.txt文件
wv_model = ct.load_w2v('output/三体-GloVe.50.15.bin')
wv_model

Run

<gensim.models.keyedvectors.KeyedVectors at 0x336ff8dd0>

4.2 KeyedVectors的操作方法(或属性)

方法 描述
KeyedVectors.index_to_key 获取词汇表中的所有单词。
KeyedVectors.key_to_index 获取单词到索引的映射。
KeyedVectors.vector_size 获取GloVe模型中任意词向量的维度。
KeyedVectors.get_vector(word) 获取给定单词的词向量。
KeyedVectors.similar_by_word(word, topn=10) 获取某词语最相似的10个近义词。
KeyedVectors.similar_by_vector(vector, topn=10) 获取词向量最相似的10个近义词。

4.2.1 词表


wv_model.index_to_key

Run

['的',
 '了',
 '在',
...
 '引力',
 '所说',
 '星际',
 ...]


4.2.2 词表映射

wv_model.key_to_index

Run

{'的': 0,
 '了': 1,
 '在': 2,
...
 '引力': 997,
 '所说': 998,
 '星际': 999,
 ...}

4.2.3 向量维度数

print(f'词表有 {len(wv_model.key_to_index)} 个词')
print(f'向量是 {wv_model.vector_size} 维')

Run

词表有 4365 个词
向量是 50 维

4.2.4 获取词向量

# 查看「降临」的词向量
wv.get_vector('降临')

Run

array([ 0.672314,  0.020081,  0.653733,  0.598732, -0.680517, -0.049689,
       -0.16845 , -0.06759 , -0.147955,  0.024006,  0.264551, -0.050127,
        0.252063, -0.475633,  0.103722, -0.012481,  0.040755,  1.154912,
        0.742695,  0.048619, -0.514424, -1.184054,  0.515892, -0.1034  ,
        0.368755, -0.690357, -0.784287, -0.505814,  0.035807, -0.166354,
       -0.26149 ,  0.015089,  0.10626 , -0.215666, -0.374001, -0.123558,
        0.422617, -0.075277, -0.316387, -0.484295,  0.059687,  0.132621,
        0.192094, -0.591919,  0.236281,  0.164198, -0.058724,  1.285457,
        0.905606, -0.52032 ], dtype=float32)

4.2.5 近义词

wv.similar_by_word('三体', topn=10)

Run

[('叛军', 0.7699569463729858),
 ('更新', 0.7687217593193054),
 ('地球', 0.760529100894928),
 ('全集', 0.7575182914733887),
 ('最快', 0.7426372170448303),
 ('世界', 0.7262137532234192),
 ('最新', 0.7219281792640686),
 ('游戏', 0.7180070877075195),
 ('危机', 0.7020451426506042),
 ('教', 0.7012627720832825)]

4.2.6 计算多个词的中心向量

我们可以计算「三体」、「降临」、「组织」、「拯救」的中心向量eto_vector。 并试图寻找中心向量eto_vector的最相似的10个词。

eto_vector = ct.semantic_centroid(wv=wv, words=['三体', '降临', '组织', '拯救'])

print(eto_vector)
# 寻找 eto_vector 语义最相似的10个词
wv.similar_by_vector(eto_vector, topn=10)

Run

[ 0.6267875   0.08975425  0.48438451  0.405128   -0.49928901  0.11347825
 -0.90057975  0.11877625 -0.27053049  0.344603    0.4368495  -0.3839495
  0.02633176 -0.138534    0.2531555  -0.0060905  -0.48776849  0.75548999
  0.72575876 -0.446079   -0.30361701 -1.039792    0.457687   -0.4286315
  0.44577325 -0.39119426 -0.4783935  -0.2596135  -0.32513325 -0.10315975
 -0.42880575 -0.48328425  0.129438   -0.17085625 -0.13454625 -0.070053
  0.68060375  0.16736924 -0.15664874 -0.20528575  0.385481    0.206432
  0.18913225 -0.93453825  0.58597099  0.60727924  0.009064    0.87661726
  0.65814423 -0.356567  ]

[('降临', 0.8707027435302734),
 ('组织', 0.8625670671463013),
 ('三体', 0.8621653914451599),
 ('派', 0.8343338966369629),
 ('拯救', 0.8301094174385071),
 ('叛军', 0.784512460231781),
 ('地球', 0.7536635398864746),
 ('世界', 0.7245718836784363),
 ('外部', 0.7078365087509155),
 ('入侵', 0.6962169408798218)]

熟悉三体的朋友应该能联想到背叛人类的ETO(地球三体组织)有两个派别,分别是拯救派和降临派。

ETO开发了一款虚拟现实游戏,它向参与者展示了三体世界的真实情况,包括其恶劣的自然条件、三体文明的历史及其科技水平等。通过参与这个游戏,玩家们能够逐渐了解三体世界的真相,并最终决定是否要加入到支持三体文明入侵地球的行列中来。

这个游戏不仅充当了信息传递的媒介,也是甄别志同道合者的工具,让那些对人类社会现状不满、渴望变革的人们找到了组织,进而成为了背叛人类的叛军一员。在这个过程中,“三体游戏”起到了关键的作用,是连接地球人与三体世界的重要桥梁。



相关内容