使用word2vec函数将Glove导入h2o,抛出NullPointerException

时间:2017-10-03 21:10:44

标签: r word2vec h2o

我尝试通过带有word2vec功能的R将Glove导入h2o群集。 关于这个Does or will H2O provide any pretrained vectors for use with h2o word2vec? 我下载了pretrained glove.840B.300d.txt文件,并尝试将其导入h2o,但解析时出现问题。 然后我读了Glove到R,删除了一行被识别为NA并将其保存为csv。使用h2o中的csv文件解析顺利但我无法使用它创建word2vec模型因此它抛出了java.lang.NullPointerException

我有h2o_3.15.0.99999版本。

我的代码:

h2o.init()
glove<-h2o.importFile("glove.840B.300d.csv",header = F)
model<-h2o.word2vec(pre_trained = glove,vec_size = 300)

完整输出:

|==========================================================================| 100%

java.lang.NullPointerException
java.lang.NullPointerException
at water.AutoBuffer.tcpOpen(AutoBuffer.java:488)
at water.AutoBuffer.sendPartial(AutoBuffer.java:679)
at water.AutoBuffer.putA4f(AutoBuffer.java:1383)
at hex.word2vec.Word2VecModel$Word2VecOutput$Icer.write90(Word2VecModel$Word2VecOutput$Icer.java)
at hex.word2vec.Word2VecModel$Word2VecOutput$Icer.write(Word2VecModel$Word2VecOutput$Icer.java)
at water.Iced.write(Iced.java:61)
at water.AutoBuffer.put(AutoBuffer.java:771)
at hex.Model$Icer.write86(Model$Icer.java)
at hex.word2vec.Word2VecModel$Icer.write85(Word2VecModel$Icer.java)
at hex.word2vec.Word2VecModel$Icer.write(Word2VecModel$Icer.java)
at water.Iced.write(Iced.java:61)
at water.Iced.asBytes(Iced.java:42)
at water.Value.<init>(Value.java:348)
at water.TAtomic.atomic(TAtomic.java:22)
at water.Atomic.compute2(Atomic.java:56)
at water.Atomic.fork(Atomic.java:39)
at water.Atomic.invoke(Atomic.java:31)
at water.Lockable.unlock(Lockable.java:181)
at water.Lockable.unlock(Lockable.java:176)
at hex.word2vec.Word2Vec$Word2VecDriver.computeImpl(Word2Vec.java:72)
at hex.ModelBuilder$Driver.compute2(ModelBuilder.java:205)
at water.H2O$H2OCountedCompleter.compute(H2O.java:1263)
at jsr166y.CountedCompleter.exec(CountedCompleter.java:468)
at jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:263)
at jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:974)
at jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1477)
at jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)

2 个答案:

答案 0 :(得分:1)

感谢您的报告,当前的实现受到JVM的最大长度限制。这个模型看起来太大了,超出了JVM的限制。

我们必须在H2O中修复它。

答案 1 :(得分:1)

鉴于您超出了模型的最大阵列大小,作为一种解决方法,您可以稍微修剪一下。我假设词汇是按手套文件中的频率排序的。换句话说,我假设最常用的词是第一个,并且最后的词通常是模糊的而且没那么有用。

E.g。这段代码只使用前50%的单词。

h2o.init()
glove <- h2o.importFile("glove.840B.300d.csv",header = F)
parts <- h2o.split(glove, [0.5])
modelCommon <- h2o.word2vec(pre_trained = parts[[1]],vec_size = 300)

根据您接下来要做的事情,您可以为后半部分数据制作第二个模型:

modelObscure <- h2o.word2vec(pre_trained = parts[[2]],vec_size = 300)