thunlp / SE-WRL

Improved Word Representation Learning with Sememes
MIT License
195 stars 56 forks source link

how to interpret the output #11

Closed Th1nK4data closed 4 years ago

Th1nK4data commented 6 years ago

训练(binary=1)之后得到.bin文件,请问怎样interpret the output?

描述 .bin文件的每一行包括一个汉字,接着是一个integer i,embedding_dim * i 个float number,最后是一系列的integers。

我猜想: .bin文件中每个汉字是其对应的sense,后面的integer i是这个sense对应的sememe embedding数量,再之后的float number就是实际的sememe embedding。那最后的integers是什么呢?

例如: 有两个word=“来”,第一个“来”就是来的第一个sense,后面的integer i=8,说明有8个sememes组成了这个sense,其embedding就是后面的floating numbers; 第二个“来”后面没有integer,直接跟其唯一组成的sememe embedding。

我没有找到相关说明来解释程序的输出,非常感激如果有人能回答这个问题!

heyLinsir commented 6 years ago

@Th1nK4data 对输出进行一些解释:

  1. 首先是一个单词W,即使用当前行去解释的单词。
  2. 接下来是一个整数SENSE_NUM,表示这个单词W的sense的数量。
  3. 接下来是EMBEDDING_SIZE * SENSE_NUM个浮点数,即每个sense的向量表示。
  4. 接下来是SENSE_NUM个整数,表示每个sense的sememe数量。
  5. 接下来剩余的所有整数,表示sense对应的每个sememe编号。
Th1nK4data commented 6 years ago

@heyLinsir 感谢这么快而详细的回答!根据回答,想请教以下4个问题:

  1. 通过训练后结果如何知道每个sense对应的sememes? 例如: 人 9 floats 每个sense的sememe数量=[4 6 8 10 11 13 15 17 21] sense对应的每个sememe编号=[31 1701 682 299 1354 31 31 1913 531 202 31 31 217 31 360 31 1203 1530 31 419 974] 这里我们有9个sense,21个sememes,但是怎样知道每个sense对应的sememes编号?

  2. 有些单词后面没有SENSE_NUM或者SENSE_NUM=1(只有单词,和embedding),并且最后没有一连串的整数,是不是说明这个词本身就是一个sememe?例如“也”。所以这个embedding就同时是其sememe和sense的embedding?

  3. 训练后,有些单词会出现2次,例如“来”,第一个“来”有8个sense,第二个有1个sense,这是怎么回事呢?是根据当前行去解释的单词吗?按照这样说,很多common words应该出现很多次才对,但是并非如此。

  4. 在使用训练结果作为其他程序输入(如,text classification)的时候,怎样确定一句话中每个单词对应的sense embedding呢?即,任意给出一句话,怎样利用hownet的训练结果确定每个单词的embedding?因为结果中每个词有多个sense embedding,在使用的时候如何消歧?

Thanks a ton!!

heyLinsir commented 6 years ago

@Th1nK4data 对问题按顺序解答:

1.第一个sense的sememe是第1个到第4个,第二个sense的sememe是第5个到第6个,以此类推。

2.sense数量是1,只是表示这个单词只有一个sense,和sememe无关,因为我们只是使用sememe去预测该选择哪个sense。当sense唯一时,不需要进行预测。

3.抱歉没有明白意思。

4.我们只是提出一种消歧的可能性,并没有额外验证如何进行消歧。不过我们提出一个可能的方法,在训练结束后,word、sense、sememe的embedding都是已知的,所以可以使用类似SAT的方法,使用上下文和中心词的sememe信息进行计算,判断当前单词的哪个sense权重最大。

Th1nK4data commented 6 years ago

@heyLinsir 十分感谢回答!关于问题4我想追问一下: 您回答说“word、sense、sememe的embedding都是已知的”,请问,这个已知的word的embedding是从哪里找到呢?从vectors.bin结果中我可以看到每个词的sense embedding和sememe的embedding,但是word的embedding从哪里获取呢?

word的embedding是从其他模型训练出来的吗,例如Word2Vec?当我们用attention机制例如SAT模型消歧的时候,context words (Wt-2, Wt-1, Wt+1, Wt+2)就是从Word2Vec训练出来的结果?因为hownet训练出来的结果只包含sense embedding和sememe embedding,这时对核心词消歧的时候context words也存在歧义,所以唯一合理的解释就是context words的embedding来自例如Word2Vec这种每个词只给一个embedding的模型,而且您上文对问题4的回答中说的word的embedding是已知的,也是指的从Word2Vec这种模型训练出来的结果对吗?

十分感谢!

heyLinsir commented 6 years ago

@Th1nK4data 不是这样的。word embedding也是来自于SAT等模型本身,在训练中,计算context embedding的时候,使用的就是上下文单词的word embedding。这一部分随着sense embedding和sememe embedding一起更新。 我之前说word embedding是已知的,是说SAT等模型训练完成后,可以从SAT等模型获取训练好的word embedding。 for (a = 0; a < vocab_size * layer1_size; ++a) fprintf(fo, "%lf ", syn1neg[a]); SAT.c中第893行的这段代码是存储的word embedding。