学习义原预测代码总结
读刘知远老师的论文 Lexical Sememe Prediction via Word Embeddings and Matrix Factorization,并在网上下载了代码。
总结一下学习过程:
1.首先需要准备一个预训练的中文词向量,推荐包含20万个词并且特征在200维以上
2.把中文词向量命名为embedding_200.txt,放在文件目录下
3.运行data_generator.sh,会生成train_data,hownet.txt_test和hownet.txt_answer,还有PMI.txt 文件
4.运行application_SPWE.sh ,会生成output_S PWE文件
那么,在服务器上运行的时候需要注意的是,进入到semme_prediction-master文件夹后,运行脚本时,直接使用
. data_generator.sh即可。要注意.之后有个空格。
接下来分析一下这几个文件
1.通过hownet_corpus_data_picker.py这个文件
embedding_200.txt中的词语总数是259922,维度是300,如下图所示
生成训练目标数据集即train_data,主要是把hownet中的词挑出来看embedding_200.txt中有没有,如果有就认为是目标词语
那么,train_data的总数是75588,维度是300
2.通过test_data_generator.py这个文件
生成三个文件:hownet.txt_test , hownet.txt_answer , train_hownet
首先把hownet字典当中的每一行去掉首尾空格加到列表data中,然后words中存data的偶数索引的词,sememes中存data的奇数索引的词,把train_data中的词(去掉向量)存到sourcewords中,然后从sourcewords中随机选取len(sourcewords)*0.1个词作为samples,判断如果words中包含samples的词,记录下来索引,并把(该词,sememe[索引])添加到samplesBuf中。
那么hownet.txt_test中存的是samplesBuf中的词(没有sememe)
hownet.txt_answer中存的是samplesBuf中的(词,sememe[索引])
将words和sememes进行zip压缩,把samples中的词去重,对于words中的每个词如果不在samples中,那么就把其添加到train_hownet中,train_hownet中是(word+sememe)
3.通过SPWE.py这个文件
embedding_vec是词向量字典,放了所有的词+向量
train_embedding_vec是存放不在test_words中的剩余的词向量字典中的词
test_words是测试的词和词向量字典的交集并且去重
- 求得embedding_vec(字典)存放每个词的300个特征向量的欧几里得距离
embedding_vec={‘word':[x1/距离,x2/距离,..........x300/距离]
距离=sqrt(x1*x1+x2*x2+...........x300*x300)
- 得到word2sememe={词:义原,词:义原.......}
sememe_all={'词':0,..................}包含了所有词
- test_words中存的是去除重复的hownet.txt_test和embedding_vec中相同的词
- train_embedding_vec中存不在test_words中的词向量字典中的词
- nearestwords中存放train_embedding_vec中每一个非目标词与目标词进行特征相乘后的结果
nearestwords=[(非目标词,求和结果)........]
- 得到word2sememe中非目标词对应的义原,然后计算相似度
sememe_all={'词':0,'词':0+cosine*power(para_c,rank)............}
- reslist中的是[(sememe,sememe_all[sememe])]
final中的是[sememe,sememe..............]