数据集 | 使用1000w条豆瓣影评训练Word2Vec

大邓和他的Python

共 12045字,需浏览 25分钟

 · 2024-04-17

本文内容

  1. 介绍豆瓣影评数据集
  2. 构造语料训练Word2Vec模型
  3. 获取数据&cntext&Word2Vec模型文件



一、豆瓣影评数据集

1.1 数据集介绍

数据集: douba-movie-1000w

数据源: 豆瓣电影
   
记录数:
   - 电影 10269 部
   - 影评 10310989 条
   
体积: 1.35G 

该数据集正好弥补下国内公开电影数据集的空缺, 数据已经过初步清洗,可用于推荐系统、情感分析、知识图谱、新闻传播学、社会学文化变迁等多个领域(或主题)。


1.2 读取数据

下载 douba-movie-1000w.zip 解压后,可以看到数据集中有一个 all_movies_with_id.csv 文件。

import pandas as pd

df = pd.read_csv('all_movies_with_id.csv')
df


1.3 所含字段

for col in df.columns:
    print(f' - {col}')

Run

 - ID
 - Movie_Name  电影名
 - Score  豆瓣电影评分(1-10)
 - Review_People  评论者人数
 - Star_Distribution  评论评分分布(1-5, 含多个数值,数值以%间隔)
 - Craw_Date 爬虫运行日期
 - Username 豆瓣评论者用户名
 - Date 影评日期
 - Star  影评评分(1-5)
 - Comment 影评内容
 - Comment_Distribution 影评评分分布
 - Like 影评获得的喜欢数



二、 构造语料&训练Word2Vec

2.1 构造语料

将字段 Comment 中所有文本汇总到 douban-movie-1000w.txt,

with open('douban-movie-1000w.txt''w', encoding='utf-8'as f:
    text = ''.join(df['Comment'].values)
    f.write(text)

2.2 配置cntext2.1.1

cntext-2.1.1-py3-none-any.whl 放置于桌面,打开 cmd  (苹果电脑打开terminal), 输入cd desktop

cd desktop

之后在 cmd  (苹果电脑打开terminal) 中使用 pip3 安装

pip3 install distinctiveness
pip3 install cntext-2.1.1-py3-none-any.whl

文末有 cntext-2.1.1-py3-none-any.whl 获取方式


2.3 训练Word2Vec

#cntext为2.1.1
import cntext as ct

w2v_model = ct.W2VModel(corpus_file='douban-movie-1000w.txt',
                        lang='chinese')

w2v_model.train(vector_size=200, window_size=6)

Run

Starting Preprocessing Corpus ...
Starting Training! This may take a while.Please be patient...
Traning word2vec model took 3965 seconds
Note: The Word2Vec model hase saved to output/Word2Vec


经过大概一个小时的训练, 得到模型文件 douban-movie-1000w.200.6.bin 及相关文件, 注意不要删掉哦。已训练好的模型,可以自己用, 也可分享给其他人使用。



四、使用Word2Vec

4.1 导入Word2Vec模型文件

import cntext as ct
 
#导入模型,请注意路径。
# 【当前代码】 与 【Word2Vec文件夹】 同处于一个文件夹内
dm_w2v = ct.load_w2v('Word2Vec/douban-movie-1000w.200.6.bin')
dm_w2v

Run

Loading word2vec model...
<gensim.models.word2vec.Word2Vec at 0x10cb02090>

4.2 常用函数

  • dm_w2v.wv.get_vector(key) 获取key的词向量

  • dm_w2v.most_similar_to_given(key1, keys_list) 从 keys_list 中获取与 key1 最相似的词

  • dm_w2v.n_similarity(ws1, ws2)  两组词ws1, ws2 的相似度

  • dm_w2v.closer_than(key1, key2)  更接近于key1的词向量(相比于key2)

  • dm_w2v.most_similar(positive, negative)  找出与positive同方向,与negative反向相反的词。


4.2.1 get_vector(key)

使用词向量查看某

dm_w2v.wv.get_vector('给力')

Run

array([-3.55084002e-01-1.22685611e+00-8.48365605e-01,  1.23056602e+00,
        1.35057056e+00,  1.65976137e-02-1.26512849e+00,  1.47152972e+00,
        9.99028236e-03-1.00873756e+00,  1.05153358e+00-1.39181948e+00,
        6.02373898e-01-1.00308895e+00,  2.33978868e-01-1.83010173e+00,
       -9.67333555e-01,  3.04877937e-01-6.59058094e-01,  3.19660306e+00,
       -1.21165246e-01-3.68000716e-01-2.36653373e-01-6.83727741e-01,
      ......
      ......
       -1.23901594e+00,  5.07202707e-02,  8.75848413e-01-4.31963325e-01,
        1.31377324e-01-1.19606090e+00,  1.68391216e+00-6.27069890e-01,
       -7.37121344e-01,  2.49946609e-01,  1.47220814e+00-1.33507824e+00,
        2.97913142e-02-4.91593599e-01,  5.83192170e-01-8.48378658e-01,
       -3.30877733e+00,  2.17747837e-01,  2.22701088e-01-1.00758147e+00,
        3.41430195e-02-7.27023900e-01-7.94953525e-01-1.03226733e+00,
       -4.55965906e-01,  1.66779244e+00,  1.16857982e+00-1.02211344e+00,
        4.11061406e-01,  8.95921767e-01-9.48565483e-01-1.48802996e-01,
        9.36261594e-01,  3.98367733e-01,  3.12385857e-01-8.67059827e-01],
      dtype=float32)

4.2.2 most_similar_to_given(key1, keys_list)

从 keys_list 中获取与 key1 最相似的词。例如在 1000w 影评中,从'爱情', '悬疑', '飞船', '历史', '战争'找出最接近'太空',最后返回'飞船'

#从 `keys_list` 中获取与 `key1` 最相似的 `key`。
dm_w2v.wv.most_similar_to_given(key1='太空'
                                keys_list=['爱情''悬疑''飞船''历史''战争'])

Run

'飞船'

4.2.3 w2v_model.n_similarity(ws1, ws2)

两组词ws1, ws2 的相似度。注意相似值更多的是体现了语义的相关性, 并不能准确反映语义的远近。

from sklearn.metrics.pairwise import cosine_similarity

cosine_similarity([dm_w2v.wv.get_vector('理想')],  
                  [dm_w2v.wv.get_vector('现实')])[0][0]

Run

0.4698379

#cosine算法
dm_w2v.wv.n_similarity(['理想'], 
                       ['现实'])

Run

0.4698379

#计算两组键之间的余弦相似度。
dm_w2v.wv.n_similarity(['给力''精彩''赞''推荐'], 
                       ['无聊''尴尬''垃圾'])

Run

0.109311774

dm_w2v.wv.n_similarity(['理想''梦想'], 
                       ['现实''生活'])

Run

0.48020104

4.2.4 closer_than(key1, key2)

更接近于key1的词向量(相比于key2)

#获取所有更接近 `key1` 的键,而不是 `key2` 。
dm_w2v.wv.closer_than(key1='理想'
                      key2='现实')

Run

['梦想',
 '追求',
 '实现',
 '向往',
 '信念',
 '妥协',
 '奋斗',
 '乌托邦',

 ......
 ......

 '梦想追逐',
 '崇高理想',
 '爱与梦想',
 '梦想放弃',
 '自由理想',
 '远大理想',
 '革命理想',
 '勇于追求',
 '世俗成功']

4.2.5 most_similar(positive, negative)

找出与positive同方向,与negative反向相反的词。

dm_w2v.wv.most_similar(positive=['给力''精彩''过瘾'],
                       negative=['垃圾'],
                       topn=10)

Run

[('看得过瘾', 0.7470669746398926),
 ('相当精彩', 0.7082503437995911),
 ('带劲', 0.6865044236183167),
 ('非常过瘾', 0.6556571125984192),
 ('非常精彩', 0.6555824875831604),
 ('够劲', 0.6424692869186401),
 ('太精彩', 0.6424689292907715),
 ('十分精彩', 0.6388185024261475),
 ('足够精彩', 0.6384131908416748),
 ('十分过瘾', 0.6383010745048523)]

4.3 类比king-man+woman~queen

每个词是高维向量空间中的一个点, 两个点可以组成有方向的向量,而向量可以比较方向。

这里是推理过程,受限于数据,公式不一定完全成立, 但是思维可以类比。

king-queen-formular.png)

这两个词相减,按感觉应该得到的是性别方向,雄性->雌性。

gender_direction_1 = vector(man)-vector(woman)

gender_direction_2 = vector(king)-vector(queen)

那两个性别方向应该近似,假设这里将其 gender_direction_1=gender_direction_2 ,则对于公式中任意一个词,都可以由等式中的其他三个词经过运算得到。例如

vector(queen) = vector(king)-vector(man)+vector(woman)

这里构造了一个 北京a - 中国b~= 巴黎c - 某国d 的公式,计算如下

# 北京a - 中国b~=  巴黎c - 某国d
a = dm_w2v.wv.get_vector('北京')
b = dm_w2v.wv.get_vector('中国')
c = dm_w2v.wv.get_vector('巴黎')

#d = b-a+c
dm_w2v.wv.similar_by_vector(b-a+c)

Run

[('中国', 0.6384854912757874),
 ('法国', 0.599371612071991),
 ('欧洲', 0.5970593094825745),
 ('法国人', 0.5338885188102722),
 ('欧洲人', 0.5236572027206421),
 ('意大利', 0.5203548669815063),
 ('西方', 0.4940629303455353),
 ('亚洲', 0.4907427728176117),
 ('美国', 0.490087628364563),
 ('欧美', 0.48989546298980713)]

大概是跑出了我们预期的 法国, 但不够Perfect, 有些遗憾。毕竟语料是影评,且讨论环境不够正式, 豆瓣用户没那么多心思研究地理和政治,所以网络记忆不全不准。



五、获取数据

5.1 获取影评数据

除了本文介绍的这个 1000w 条影评数据集, 大邓还有2个类似的豆瓣影评数据集,影评记录量 212w和442 w 条。两个数据集下载链接我都公开,感兴趣的可以都下载下来。

  • douba-movie-1000w 链接: https://pan.baidu.com/s/1NHttdosb0VZUQV7Tg7MHXw?pwd=rndk 提取码: rndk

  • douban-movie-442w 链接: https://pan.baidu.com/s/10KK5FrGL0ZHx4wiuhlvuXw?pwd=db7m 提取码: db7m

【douban-movie-442w介绍】

采集时间: 
   - 电影&明星 2019年8月上旬
   - 影评(用户、评分、评论) 2019年9月初

记录数:
   - 电影 140502 部
   - 演员 72959 人
   - 影评 4428475 条
   - 评分 4169420 条
  • douban-movie-212w 链接: https://pan.baidu.com/s/1iCKGu_6zTe6ZhlB_9Bf1HA?pwd=cv2p 提取码: cv2p



5.2 cntext2.1.1

cntext2.1.1 是非公开内容, 100元  可得 cntext-2.1.1-py3-none-any.whl  , 加微信 372335839, 备注「姓名-学校-专业」


5.3 Word2Vec模型文件

  • douba-movie-1000w.200.6.bin 链接: https://pan.baidu.com/s/1ahbYq2IOqUA_AE0T3XIb9g?pwd=su1y 提取码: su1y
  • douban-movie-442w.200.6.bin  链接: https://pan.baidu.com/s/181eVuM0qldUJ53i7u1a5vA?pwd=uarj 提取码: uarj
  • douban-movie-212w200.6.bin 链接: https://pan.baidu.com/s/1bvIZAM4zqX_35WHrBJSFUg?pwd=mf9u 提取码: mf9u


精选内容

LIST | 社科(经管)可用数据集列表
LIST | 文本分析代码列表
LIST | 社科(经管)文本挖掘文献列表
管理科学学报 | 使用「软余弦相似度」测量业绩说明会「答非所问程度」
数据集 | 众筹金融投资平台kiva借贷数据
数据集(更新) | 372w政府采购合同公告明细数据(2024.03)
数据集  | 人民网政府留言板原始文本(2011-2023.12)
数据集  |  人民日报/经济日报/光明日报 等 7 家新闻数据集
可视化 | 人民日报语料反映七十年文化演变
数据集 | 2024年中国全国5级行政区划(省、市、县、镇、村)
数据集 | 三板上市公司年报2002-2023.12
数据集 | 人民网地方领导留言板原始文本(2011-2023.12)
数据集 | 3571万条专利申请数据集(1985-2022年)
数据集 |  专利转让数据集(1985-2021)
数据集 | 用来练习pandas的招聘数据
代码 | 使用 3571w 专利申请数据集构造面板数据
代码 | 使用「新闻数据集」计算 「经济政策不确定性」指数
数据集 | 国省市三级gov工作报告文本
代码 | 使用「新闻数据」生成概念词频「面板数据」
代码 | 使用 3571w 专利申请数据集构造面板数据
代码 | 使用gov工作报告生成数字化词频「面板数据」
Polars库 | 最强 Pandas 平替来了
cpca库 | 中国省、市区划匹配库
opencc | 中文简体、繁体转换库
可视化 | 使用 DataMapPlot 绘制数据地图

浏览 125
10点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
10点赞
评论
收藏
分享

手机扫一扫分享

举报