1. 实验目的
通过内部及外部评价,客观比较不同词向量的质量,以及不同词语初始化对NLP任务的影响,理解神经网络模型用于NLP的第一步。
2. 实验平台
操作系统:Windows 2000/ XP/7/8/10/11 或者 Linux
框架:keras/tensorflow/ pytorch
3. 实验内容
【词向量】
(1)给定的100维glove词向量(glove100)
(2)给定的100维腾讯英文词向量(tenct100)
或者其他的预训练词向量,维度建议100以上
注:两份词向量的词表规模可能不同,会影响测试效果
【实验内容】
一、类比推理任务
测试三份不同的词向量,根据词向量的线性加减,回答:least-little+many=? went-go+drink =?
请给出每一个问题的top 5回答。
词向量 | least-little+many = | went-go+drink = |
glove100 | ||
tenct100 |
二、词语相关度计算
给定数据集wordsim353(实际包含348个词对),每一条数据包含两个词语以及人工打出的平均相关度得分。使用2个词语向量的余弦相似度计算得到相关性得分,与人工打分相比较,使用Spearman秩相关系数作为评价指标,计算方法见课件。
词向量 | ρs |
glove100 | |
tenct100 |
随机取10个词对,展示glove100计算的相关度得分和真实得分。
词对 | 真实相关度 | 计算相关度 |
… | ||
… | ||
… |
三、文本主题分类
- 数据集:AG_NEWS新闻主题分类数据集(部分),包含4类,分别为World、Sports、Business、Sci/Tech,在文件中分别以0、1、2、3作为类别label。训练集train.csv,每类各1000条。测试集test.csv。第一列是类别label,第二列是新闻文本。
reader = csv.reader(open(f_path, 'r'))
for line in in reader:
# read data
可以对数据进行一些预处理,比如忽略无意义的“\\”、“<”、“>”等片段,大小写转换、删除多余的空格、忽略“NEW YORK (Reuters)”、“LONDON (Reuters)”、“Canadian Press - TORONTO (CP)”等新闻出版社名称。
- 模型:单隐藏层的前馈神经网络。
模型定义为一个继承nn.Module的类(同实验二)。
输入层是文本的预训练词向量的拼接,由于模型要求对所有样本输入层神经元数量相等,选择一个最大长度maxlen,如果文本长度(词语个数)小于maxlen,则在拼接向量后补零,否则进行截断,可以自行选择取前maxlen个或者后maxlen个,即输入层的输入维度=maxlen*100(词向量维度)。输入层的输出维度=hidden_size。
隐藏层激活函数选择tanh,输入维度和输出维度=hidden size。
输出层输入维度= hidden size,使用softmax输出单元,输出维度=4(类别数)。
损失函数使用交叉熵。
使用两种不同的词向量进行实验,并使hidden_size、maxlen、dim、batch_size、epoch、优化器、学习率等参数相同。
每次训练可以随机打乱(shuffle)训练数据。
(1)请说明所有实验中的以上具体参数设置,并选择glove或fasttext词向量。另外,通过正态分布生成100维词向量(random100)e.g. 使用numpy产生正态分布数组 w = np.random.normal(0, 0.1, 100)
(2)统计每次实验的准确率(accuracy)、精确率(precision)、召回率(recall)、宏F1值,均使用百分数,如0.823写成82.3。
词向量 | accuracy | precision | recall | F1 |
glove/tenct100 | ||||
random100 |
4. 要求
(1)独立完成,严禁抄袭(抄袭和被抄袭均判为0分)。
(2)实验报告排版合理,内容详实,必要时配过程截图。
(3)在规定时间范围内提交,否则判为0分。
一、实验环境
操作系统:Windows 10
深度学习框架:pytorch
二、实验内容及详细的完成情况
2.1 实验一
类比推理任务
测试三份不同的词向量,根据词向量的线性加减,回答:least-little+many=? went-go+drink =?
请给出每一个问题的top 5回答。
词向量 | least-little+many = | went-go+drink = |
glove100 | ||
tenct100 |
least-little+many =
went-go+drink =
2.2 实验二
词语相关度计算
给定数据集wordsim353(实际包含348个词对),每一条数据包含两个词语以及人工打出的平均相关度得分。使用2个词语向量的余弦相似度计算得到相关性得分,与人工打分相比较,使用Spearman秩相关系数作为评价指标,计算方法见课件。
词向量 | ρs |
glove100 | |
tenct100 |
随机取10个词对,展示glove100计算的相关度得分和真实得分
2.3 实验三
(1)数据预处理
定义了一个 preprocess_text 函数来进行文本预处理。在这个函数中,我们首先使用 replace 方法来忽略了无意义的片段,然后使用 lower 方法将文本转换为小写,接着使用 split 和 join 方法删除多余空格,最后使用 replace 方法忽略了特定的新闻出版社名称。
- # 定义需要忽略的无意义片段和特定新闻出版社名称
- meaningless_fragments = ['\\', '<', '>']
- ignore_publishers = ['NEW YORK (Reuters)', 'LONDON (Reuters)', 'Canadian Press - TORONTO (CP)']
- # 定义文本预处理函数
- def preprocess_text(text):
- # 忽略无意义的片段
- for fragment in meaningless_fragments:
- text = text.replace(fragment, '')
- # 大小写转换
- text = text.lower()
- # 删除多余空格
- text = ' '.join(text.split())
- # 忽略特定新闻出版社名称
- for publisher in ignore_publishers:
- text = text.replace(publisher, '')
- return text
(2)参数设置
# 定义训练参数
hidden_size = 128
maxlen = 100
dim = 100 # 假设使用100维词向量
batch_size = 64
epochs = 10
learning_rate = 0.001
(3)
统计每次实验的准确率(accuracy)、精确率(precision)、召回率(recall)、宏F1值
- X_train = np.zeros((len(train_data), maxlen * dim))
- y_train = train_data['label'].values
- for i, text in enumerate(train_data['text']):
- for j, word in enumerate(text.split()):
- if j >= maxlen:
- break
- # if word in word_embeddings:
- # X_train[i, j*dim:(j+1)*dim] = word_embeddings[word]
- X_train[i, j*dim:(j+1)*dim] = np.random.normal(0, 0.1, 100)
glove词向量: fasttext词向量:
random100:
三、实验总结
(可以总结实验中出现的问题以及解决的思路,也可以列出没有解决的问题)
- GloVe词向量文件必须是以以下形式,才能被gensim.models 中的KeyedVectors函数处理,然而en_glove_100d.txt文件开头并没有显示VOCAB_SIZE VECTOR_SIZE。
已知该txt文件是100维向量,并且算得其大小为400000,于是手动添加,使其可以正常调用库函数运行。
- tencent-ailab-embedding-en-d100-v0.1.0-s文件中有许多%+xxx的word,不知道什么意思怎么处理,导致类比推理任务也出现这些乱码。
3. 正态分布生成100维词向量效果十分差,体现了一个好的词向量的重要性。