本文内容

  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

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

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

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

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 条。 两个数据集下载链接我都公开,感兴趣的可以都下载下来。

【douban-movie-442w介绍】

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

记录数:
   - 电影 140502 部
   - 演员 72959 人
   - 影评 4428475 条
   - 评分 4169420 条



5.2 cntext2.1.1

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


5.3 Word2Vec模型文件



相关内容



广而告之