thunlp/SE-WRL

数据问题

Closed this issue · 30 comments

您好:
现在代码没有问题了,是源数据文件空格和换行被修改了,导致文件解析错误,我有2个问题想请教您。
我这边想用您的创新的**训练词向量,然后在智能问答、近义词挖掘的背景下,比较效果。

  1. 我想知道您提供的Word_Sense_Sememe_File、SememeFile 这两个文件是全的么。
  2. 增量训练的接口打算开发么。
    祝好!
  1. 这两个文件是全的,不过也只是包含了HowNet中的内容,HowNet中缺少一些新词,在我们的文件中同样缺少这样的新词数据。
  2. 目前没有开发这个接口的打算。

谢谢解答。
我这边用了4个G的数据,在服务器上跑了一晚上,还没有结束,我想请问下,您当时用了多大数据,跑了多久,我这边线程数设置的20,其他参数按您推荐的设置的,负采样25是不是有点多了,影响效率,我看Gensim提供的API,负采样是5。

@quan3401 请问你运行的时候遇到过Segmentation fault (core dumped)问题吗?谢谢

您可以详细点说,或者截图给我。我把这个代码训练起来了。

image
我调试了一下发现是在init(struct sense *s, int n, int l, int *rank, int *cnt) 这个函数里面的
s->mult_sense_value = (real *)calloc(n * l, sizeof(real)); 这行出错的。 问题是这行成功运行了一次,但是到第二次的时候却出错了。。
截图中的输出"19466 200"是n和l。

@quan3401 我当时用的21G训练数据,训练一个epoch需要将近30小时,训练2或3个epoch后,效果达到最好。

抱歉之前可能漏了Github的邮件提醒,没能及时回复。

@libertine2 我看你的截图,是malloc.c报错,会不会是环境问题。我们是在Linux环境下进行的实验。

@heyLinsir
我也是在linux环境下跑的呀,那个报错感觉是因为gdb没找到malloc.c,应该不是malloc.c本身的问题。

@heyLinsir 收到您的邮件了,谢谢。我在Window跑了,Linux也跑了,代码在Linux上可以直接跑,
@libertine2 你读文件的时候可能出错了,多个空格什么的,读出来的词或者数字是一个脏数据,负数导致后面程序报错

@quan3401
请问您指的是哪个文件?是Word_Sense_Sememe_File这个文件吗?可是我的代码一点没改呀,就是gh上作者的代码

@libertine2 代码不变,可能因为数据文件的格式出错了,读文件的代码你可以改一下,或者给我个邮件,我把能跑起来的发给你,其实改动很少。

@quan3401
那麻烦您给我发一份吧,我的邮箱:kfc_test@126.com,多谢!

@heyLinsir @quan3401 你说的正确,Word_Sense_Sememe_File这个数据文件出错,每一行最后多出一个空格,导致程序指针异常,是我linux下调试出来的问题。我将该文件每行最后一个空格删除,目前仍然调试有问题,请问作者可以在百度云盘上分享一下训练数据吗?,另外,请问corpus是来自搜狗语料库吗?

@TingEn-Li
近两天会修复一下数据文件。
训练数据会分享出来,不过有点大,21G,不知道有没有超过限制,而且百度云上传会比较慢,所以不清楚什么时候可以公开出来。

@heyLinsir 太好了,这边可以下下来玩玩。祝好!

@heyLinsir 又过了一周了,请问训练数据上传好了吗?感谢分享!

@heyLinsir @lixiang1991 @zibuyu @TingEn-Li 我们这边最近做实验,发现语料对词向量的训练效果有比较大的影响,首先膜拜一下这个词向量模型,在近义词、或者义元相近的词上表现很好,反义词上理论上应该表现也很好的,因为我们语料里面反义词的比例不均衡,例子:提升 、降低;如果语料里面提升出现了100词,降低出现了2次。这样HowNet的结构信息就没有使用完全,我们在语料的构建的部分,可以注意下反义词的比例,这样训练出来的模型更加完美。
这里请教各位有没有现成的GPU版本(CUDA C)的代码,我们这边也在弄,有的话共享一下,或者转成python的 ?可以直接跑GPU。然后请问这次分享的语料,反义词比例是不是比较均衡?我觉得应该是频数需要达到一定的值,效果就会好,不均衡也没关系?

@quan3401
抱歉我们目前没有现成的GPU版本,之后可能会开发一版。
反义词的比例没有统计过。我认为,如果反义词频次差不多的话,两个词训练出来的词向量应该也是比较相近的,这是skipgram模型本身决定的,因为同类型义元的上下文也会趋向于相同。如果想要凸显反义词的特性,可能需要跳出skipgram/CBOW这类模型。
如果真的想区分开反义词的话,可能可以考虑一下adversarial training(perturbation on word embeddings)的**:)

@heyLinsir 解惑了,谢谢。是不是可以考虑在您的模型基础上做一些工作,在词向量和义元底层做一层相似度的关系,多一个Loss,使得词向量更加受限义元、或者说词向量和词的义元的关系更加强。我们这边也在抽空做GPU,不过时间有点抽不开,期待您分享出来,祝好!

@quan3401 我觉得如果能设计出来一个词和义元之间的loss是有意义的,因为现在他们之间的限制关系是隐式的,如果能显式地表示出来,应该会有效果提升。

请问可以分享一下处理sougoT数据,提取文本的代码吗,刚刚拷贝到数据发现里面的噪声非常多,处理起来有些困难。

@liukun95 我分享在网盘的数据就是我们使用的数据,没有额外的数据处理。

请问‘Clean-SogouT2.txt’和‘Clean-SogouT1.txt’在编码上有区别吗?我在用gensim的word2vec模型训练词向量时T2报了如下编码错误,而T1没有报错。
'utf-8' codec can't decode byte 0xbc in position 0: invalid start byte

@liukun95 你把文件先用脚本语言处理一下,如果你按字节去读文件,就没有问题。按行读,为出现编码的问题,很可能是中文前面有一些别的编码符号,可能是多个文件合在一起的造成的。你自己解析一下就好了。

链接:https://pan.baidu.com/s/1kXgkyJ9 密码:f2ul

我看里面一共有俩文件,sogouT1和sogouT2,训练的时候是都用上吗?如果是都用上,是分开训练两次还是把他们放一起训练一次?

@embraceth 一起训练一次,建议使用新的SAT训练程序,在README里面有链接。

@heyLinsir 我解压您提供的SogouT1.txt和SougouT2.txt,并将SogouT2.txt追加到SogouT1.txt的结尾,然后使用您提供的最新的代码以及评测代码,参数也都一样,训练出的模型以及评测跟您的不一样这是为什么?是我合并训练文本的方式不对吗?将将SogouT1.txt追加到SogouT2.txt的结尾吗?

@liukun95 请问您最后关于SogouT2.txt的编码问题解决了吗?