学习义原预测代码总结

读刘知远老师的论文 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..............]