环境:Linux
实验相关信息:
①语言与版本:Python2.7
②深度学习框架与版本:tensorflow cpu 版
③深度学习模型:word2vec
④ Python 库:jieba、tensorflow、pandas
⑤源码:https://github.com/LCG22/DeepLearning/tree/master/TensorflowLearning/Word2Vec/Word2Vec
注:由于使用的是公司业务数据,故代码中不提供数据
⑥实验目的:
a)word2vec 模型对混杂两个语种(普通话和广州话)的数据是否仍有较好的学习效果,即能否学习到普通话和广州话中
意思相近的词语的词向量在词空间中的位置也较近
b)word2vec 模型在实际数据中的效果如何
⑦数据:
领域:楼房销售(房产中介)
内容:客户跟进记录。记录客户的购房需求和客户相关的信息。
语言:中文,极少部分英文。混杂有普通话和广州话。
难点:
a)记录的信息格式比较随意
b)记录的信息比较杂乱,有的记录了客户较多的个人信息,有的则记录的比较少,很难从中提取有效信息
c)由于数据中混杂有很多广州话,而 jieba 分词并不支持广州话的字典,因此对广州话的分词结果较差
d)由于记录内容偏向于口语化,故 jieba 分词对普通话的分词结果较差,但比广州话的分词结果要好得多
e)部分词语在整个数据集中的数量较少,word2vec 模型可能会学习不到与该词语意思相近的词语
⑧实验结果
1、数据集大小:
分词前:189M
分词后:220M
分词数量:包括重复的有 35654193 个词(仅删掉了常见的标点符号,没删除常见的停用词),去重后的有 50003 个词
2、参数与结果
a)
参数:
词汇表大小:vocabulary_size =50000
每批训练模型的样本数:batch_size =128
词向量的大小:embedding_size =128
词窗口大小:skip_window =1
要生成的目标词的训练样本数量:num_skips =2
验证词的数量:valid_size =len(valid_word)
valid_window =100
抽样的负样本:num_sampled =64
训练模型的步数:num_steps =2000000
结果:
由上图结果可见,对于普通话字词的买、儿子和广州话字词的中意(意思是喜欢,包括钟意、仲意,三者意思相同但因个人差别而使用了不同的字来代替广州话发音)、得闲(有空)、几好(好、不错)、价钱(价格)的学习结果都是很好的,学习到了与其意思相近的词在词空间上也是相近的。例如普通话的儿子,跟它意思相近的词分别是,女儿、老婆、女朋友、老公、太太、妈妈、家人、弟弟,这些词跟儿子一样,都是属于家人,而且是直系亲属(女朋友除外),可见对于普通话的词向量的学习还是很不错的。而例如广州话中的价钱,跟它意思相近的词分别是,价格、价位、单价、总价、价、楼价、楼层、房价,这些词要么是跟价钱是同义词(只是在不同的语种中的字词不同)要么是跟价钱高度相关的(例如楼层),可见词向量的确能够学习到即使是属于不同语种的词语在词空间上也是相近的,学习到了语义相近的词语在词空间上的相近;另外,价钱虽然是广州话,但是并不是用广州话的字词来写的,而是借用了普通话中语音相近的普通话字词,可见词向量学习的的确是字词在上下文的语义(虽然该模型中的上下文仅仅只是目标词的左右两边的词)。
但是训练结果也并不是很让人满意,例如上图中的博士、倾成(广州话,对应普通话中的谈成)跟在词空间上的距离是最近的字词,实际语义相差却极大,甚至可以说根本没有半点语义相近。究其原因,则是因为两者在训练样本中的数量太少了,例如博士的数量才只有 24 个,倾成的数量也仅有 22 个,而买、儿子、中意、得闲、几好、价钱的数量则分别有 284426、7733、25592、56932、2475、61048,可见这些词的数量远比博士、倾成要多得多,最少的也是他们的 100 倍,最多的则高达 12928 倍,也可见字词的数量对于训练结果有决定性作用。
总结:
①词向量的确能够学习到即使是属于不同语种的词语在词空间上也是相近的
②字词的数量对于训练结果有决定性作用