当前位置: 首页 > 面试题库 >

使用Word2VecModel.transform()在地图功能中不起作用

戚高洁
2023-03-14
问题内容

我已经使用Spark建立了Word2Vec模型并将其另存为模型。现在,我想在另一个代码中将其用作脱机模型。我已经加载了模型,并用它来表示单词的向量(例如,Hello),并且效果很好。但是,我需要使用map在RDD中为许多单词调用它。

当我在地图函数中调用model.transform()时,它将引发以下错误:

“似乎您正在尝试从广播引用SparkContext。”异常:您似乎正在尝试从广播变量,动作或转换引用SparkContext。SparkContext只能在驱动程序上使用,而不能在工作程序上运行的代码中使用。有关更多信息,请参见SPARK-5063。

编码:

from pyspark import SparkContext
from pyspark.mllib.feature import Word2Vec
from pyspark.mllib.feature import Word2VecModel

sc = SparkContext('local[4]',appName='Word2Vec')

model=Word2VecModel.load(sc, "word2vecModel")

x= model.transform("Hello")
print(x[0]) # it works fine and returns [0.234, 0.800,....]

y=sc.parallelize([['Hello'],['test']])
y.map(lambda w: model.transform(w[0])).collect() #it throws the error

非常感谢您的帮助。


问题答案:

这是预期的行为。像其他MLlib模型一样,Python对象只是Scala模型的包装,实际处理被委派给JVM对应对象。由于工作人员无法访问Py4J网关,因此无法从操作或转换中调用Java /Scala方法。

通常,MLlib模型提供一种可以直接在RDD上运行的辅助方法,但实际情况并非如此。Word2VecModel提供了getVectors一种方法,该方法可将单词从单词返回到向量,但不幸的是它是一个JavaMap这样的方法,因此在转换中不起作用。您可以尝试这样的事情:

from pyspark.mllib.linalg import DenseVector

vectors_ = model.getVectors() # py4j.java_collections.JavaMap
vectors = {k: DenseVector([x for x in vectors_.get(k)])
    for k in vectors_.keys()}

获取Python字典,但速度会非常慢。另一个选择是将该对象以Python可以使用的形式转储到磁盘上,但是需要对Py4J进行一些修改,最好避免这种情况。相反,让我们将模型读取为DataFrame:

lookup = sqlContext.read.parquet("path_to_word2vec_model/data").alias("lookup")

我们将得到以下结构:

lookup.printSchema()
## root
## |-- word: string (nullable = true)
## |-- vector: array (nullable = true)
## |    |-- element: float (containsNull = true)

可以通过以下方式将单词映射到向量join

from pyspark.sql.functions import col

words = sc.parallelize([('hello', ), ('test', )]).toDF(["word"]).alias("words")

words.join(lookup, col("words.word") == col("lookup.word"))

## +-----+-----+--------------------+
## | word| word|              vector|
## +-----+-----+--------------------+
## |hello|hello|[-0.030862354, -0...|
## | test| test|[-0.13154022, 0.2...|
## +-----+-----+--------------------+

如果数据适合驱动程序/工作程序内存,则可以尝试通过广播进行收集和映射:

lookup_bd = sc.broadcast(lookup.rdd.collectAsMap())
rdd = sc.parallelize([['Hello'],['test']])
rdd.map(lambda ws: [lookup_bd.value.get(w) for w in ws])


 类似资料:
  • 问题内容: 我正在使用这种技术来加载数据。因此,我创建了以下解析函数: 存在的问题是,是在瞬间函数执行。它是正确的/错误吗?我该如何解决? 问题答案: 您需要改用。该只更新 后 的路线被改变。因此,您的代码应遵循以下原则:

  • 下面是一个函数,它获取一个长字符串,并返回一个按段落分割的字符串。 问题是k是空的。为什么函数不起作用?

  • 问题内容: 我正在学习Vue并在计算属性中使用箭头功能时遇到问题。 我的原始代码工作正常(请参见下面的代码段)。 但是,更改计算属性中的方法后,颜色不会更改(尽管turnRed值仍成功在true和false之间切换)。 这是我的代码: 我使用错误的语法吗? 问题答案: 您遇到此错误是因为箭头函数不会绑定到您要为其定义计算属性的vue实例。如果要使用箭头功能进行定义,也会发生同样的情况。 不要在实例

  • 问题内容: 我发现了一个代码创建一个超时功能在这里,这似乎并没有工作。完整的测试代码如下: 预期的行为:代码在3秒内结束。问题出在哪儿? 问题答案: 一个线程不能优雅地杀死另一个线程,因此对于您当前的代码,它永远不会终止。(使用Python程序时,仅保留守护程序线程将退出,但这不允许您在不终止主线程的情况下终止。) 有些人]试图使用信号来停止执行,但这在某些情况下可能不安全。 如果可以修改,则有许

  • 问题内容: 我正在尝试使用opencv v 2.1创建图像,但出现此错误: AttributeError:“模块”对象没有属性“ CreateImage” 该代码是 问题答案: 您正在覆盖名称空间。仅使用,而不使用其他。

  • 我正在尝试在列小部件中动态创建行小部件。我是个新手,我已经尽力了,但还是没能解决这个问题。我想请你在这个问题上帮助我。我添加了所有我尝试过的东西。多谢各位 我的Json 参考图像 我面临两个错误,如下所示:, 和 在全班同学中,我有以下几点 通过这种方法,我从api获取数据 下面是我的构建小部件 下面是我想在地图中使用的函数 这是我的数据模型课