在Spark中加载Word2Vec模型

4

能否将已经预训练好的二进制模型加载到Spark(使用Scala)中?我尝试过像这样加载Google生成的二进制模型:

    import org.apache.spark.mllib.feature.{Word2Vec, Word2VecModel}


    val model = Word2VecModel.load(sc, "GoogleNews-vectors-negative300.bin")

但是它无法找到元数据目录。我还创建了文件夹并将二进制文件附加在那里,但它无法解析。我没有找到任何解决这个问题的包装器。

2个回答

3

我编写了一个快速函数,将谷歌新闻预训练模型加载到Spark Word2Vec模型中。享受它。

def loadBin(file: String) = {
  def readUntil(inputStream: DataInputStream, term: Char, maxLength: Int = 1024 * 8): String = {
    var char: Char = inputStream.readByte().toChar
    val str = new StringBuilder
    while (!char.equals(term)) {
      str.append(char)
      assert(str.size < maxLength)
      char = inputStream.readByte().toChar
    }
    str.toString
  }
  val inputStream: DataInputStream = new DataInputStream(new GZIPInputStream(new FileInputStream(file)))
  try {
    val header = readUntil(inputStream, '\n')
    val (records, dimensions) = header.split(" ") match {
      case Array(records, dimensions) => (records.toInt, dimensions.toInt)
    }
    new Word2VecModel((0 until records).toArray.map(recordIndex => {
      readUntil(inputStream, ' ') -> (0 until dimensions).map(dimensionIndex => {
        java.lang.Float.intBitsToFloat(java.lang.Integer.reverseBytes(inputStream.readInt()))
      }).toArray
    }).toMap)
  } finally {
    inputStream.close()
  }
}

快速文本(FastText)怎么样?我们如何将FastText .bin加载到每个执行器中。我尝试过这样做,但是模型是按分区加载的,当分区数量很高时,这并不好。 - bib
听起来你需要使用广播...在驱动程序上加载模型一次,然后通过广播包装器分发它。 - Andrew Charneski
@Andew Cherneski,您能否回答一下我关于同一主题的问题https://stackoverflow.com/questions/54540970/how-to-load-a-file-in-each-executor-once?noredirect=1#comment96563878_54540970? - bib

0

1
将二进制文件转换为文本文件后,我应该如何加载模型? - LonsomeHell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接