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

Importing Glove to h2o with word2vec function throwing NullPointerException

我正在尝试通过带有 word2vec 函数的 R 将 Glove 导入 h2o 集群。 对此 我下载了预训练的 glove.840B.300d.txt 文件并尝试将其导入 h2o,但解析存在问题。 然后我读了 Glove to 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)

感谢您的报告,当前的实现受限于 JVM 的最大数组长度。这个模型似乎太大了,超出了 JVM 的限制。

我们必须在 H2O 中修复它。

鉴于您超出了模型的最大数组大小,作为解决方法,您可以 trim 将其退回一点。我假设词汇表在 glove 文件中按频率排序。换句话说,我假设最常用的词排在最前面,最后的词通常晦涩难懂且用处不大。

例如此代码将只使用前 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)