我想加载一个 word2vec 模型并通过执行单词类比任务来评估它(例如a 对 b 就像 c 对某事?)。为此,首先我加载我的 w2v 模型:
model = Word2VecModel.load(spark.sparkContext, str(sys.argv[1]))
Run Code Online (Sandbox Code Playgroud)
然后我调用映射器来评估模型:
rdd_lines = spark.read.text("questions-words.txt").rdd.map(getAnswers)
Run Code Online (Sandbox Code Playgroud)
该getAnswers函数每次从questions-words.txt 中读取一行,其中每一行包含问题和评估我的模型的答案(例如,雅典希腊巴格达伊拉克,其中 a=雅典,b=希腊,c=巴格达和某事=伊拉克)。阅读该行后,我创建了current_question和actual_answer(例如:current_question=Athens Greece Baghdad和actual_answer=Iraq)。之后,我调用getAnalogy用于计算类比的函数(基本上,给出它计算答案的问题)。最后,在计算完类比之后,我返回答案并将其写入文本文件。
问题是我收到以下异常:
Exception: It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transformation. SparkContext can only be used on the driver, not in code that it run on workers.
Run Code Online (Sandbox Code Playgroud)
我认为它被抛出是因为我在 map 函数中使用了模型。这个问题与我的问题类似,但我不知道如何将该答案应用到我的代码中。我怎么解决这个问题?以下是完整代码:
def getAnalogy(s, …Run Code Online (Sandbox Code Playgroud) 我有一个列表列表,其中包含if语句必须满足的所有条件,但问题是存储在列表列表中的条件数是未知的.例如,列表列表如下:
my_list: [["A", "0"], ["B", "1"], ["C", "2"]]
Run Code Online (Sandbox Code Playgroud)
所以if应该是:
if A==0 and B==1 and C==2:
#do-something
else:
pass
Run Code Online (Sandbox Code Playgroud)
既然我不知道列表列表中的元素数量,我不能这样做:
if my_list[0][0]==my_list[0][1] and my_list[1][0]==my_list[1][1] and my_list[2][0]==my_list[2][1]:
#do-something
else:
pass
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
谢谢.