别再死记硬背Word2Vec公式了!用Gensim实战《人民的名义》人物关系分析,5分钟上手

张开发
2026/4/17 20:37:59 15 分钟阅读

分享文章

别再死记硬背Word2Vec公式了!用Gensim实战《人民的名义》人物关系分析,5分钟上手
用《人民的名义》剧本实战Word2Vec5步搞定人物关系图谱追剧时你是否好奇过——侯亮平和祁同伟在剧本中的互动模式有何不同李达康与高育良的台词风格谁更接近现实中的官员这些问题的答案其实藏在剧本的文字关系里。今天我们就用NLP领域的Word2Vec技术带你看懂《人民的名义》人物关系的数学表达。1. 准备工作从剧本到可分析文本首先需要获取《人民的名义》完整剧本文本。理想情况下应该获得带角色标注的台词本格式如[侯亮平]这件事必须查清楚但普通剧本文本也能满足基础分析。将文本保存为UTF-8编码的.txt文件建议命名为in_the_name_of_people.txt。关键预处理步骤import jieba # 添加角色名到分词词典 characters [侯亮平,李达康,高育良,祁同伟,沙瑞金,钟小艾] for name in characters: jieba.add_word(name) # 加载停用词表 with open(stopwords.txt,encodingutf-8) as f: stopwords set([line.strip() for line in f]) # 分词处理 with open(in_the_name_of_people.txt,encodingutf-8) as f: text f.read() words [word for word in jieba.cut(text) if word not in stopwords and len(word)1]提示中文停用词表应包含的、了等无实义词可从GitHub搜索中文停用词表获取2. 模型训练用Gensim生成词向量安装必要库后只需几行代码即可训练模型from gensim.models import Word2Vec # 配置模型参数 model Word2Vec( sentences[words], # 分词后的文本 vector_size100, # 向量维度 window5, # 上下文窗口 min_count3, # 忽略低频词 sg1, # 使用Skip-gram算法 hs0, # 使用负采样 negative5, # 负采样数 epochs10 # 训练轮次 ) # 保存模型备用 model.save(nom_model.bin)参数选择经验参数剧本类文本建议值说明vector_size50-200小文本选较小维度window3-8对话文本用较小窗口min_count2-5避免过滤角色名3. 人物关系探秘向量空间中的距离训练完成后我们可以用向量运算揭示人物关系# 查找与李达康最相似的人物 print(model.wv.most_similar(李达康, topn3)) # 计算两人物的相似度 print(model.wv.similarity(侯亮平, 祁同伟)) # 经典向量运算示例 result model.wv.most_similar( positive[侯亮平, 正义], negative[腐败] )执行后可能得到类似输出[(侯亮平, 0.92), (沙瑞金, 0.89), (陈岩石, 0.85)] 0.87 [(钟小艾, 0.91), (陆亦可, 0.88), (赵东来, 0.82)]4. 可视化呈现人物关系图谱将高维向量降维后可视化更直观import matplotlib.pyplot as plt from sklearn.manifold import TSNE # 提取主要人物向量 names [侯亮平,李达康,高育良,祁同伟,沙瑞金,赵瑞龙] vectors [model.wv[name] for name in names] # 降维到2D tsne TSNE(n_components2) points tsne.fit_transform(vectors) # 绘制散点图 plt.figure(figsize(10,8)) for i,name in enumerate(names): x,y points[i] plt.scatter(x,y) plt.text(x0.1,y0.1,name) plt.show()典型可视化结果会显示正面角色侯亮平、沙瑞金聚集在右侧反派角色祁同伟、赵瑞龙集中在左侧复杂角色李达康、高育良位于中间过渡区5. 进阶分析台词风格与派系识别通过分析人物关联词可以发现更多有趣模式# 查找每个人物的特征词 for name in [李达康,高育良]: print(f{name}的关联词) print(model.wv.most_similar(name, topn5)) # 派系聚类分析 from sklearn.cluster import KMeans all_names model.wv.index_to_key[:50] # 取前50个高频词 kmeans KMeans(n_clusters3).fit(model.wv.vectors) for i,cluster in enumerate(kmeans.labels_): if all_names[i] in characters: print(f{all_names[i]}属于派系{cluster})可能的发现包括李达康常与GDP、开发区等词关联高育良的关联词包含老师、政法系聚类结果显示三大派系检察系、汉大帮、秘书帮这种分析方法同样适用于小说角色关系分析影视剧本评估社交媒体人物画像历史文献人物研究下次看剧时不妨想想如果给剧本做个向量分析会揭示出哪些隐藏的人物关系或许你会发现编剧埋下的精妙伏笔。

更多文章