在 Apache Spark (v2.3.1) 的 UDF 中使用 Word2Vec 函数

Using Word2Vec functions inside of a UDF in Apache Spark (v2.3.1)

我有一个由两列组成的数据框,一列是 Int,另一列 一个字符串:

+-------------+---------------------+
|user_id      |token                |
+-------------+---------------------+
|          419|                 Cake|
|          419|            Chocolate|
|          419|               Cheese|
|          419|                Cream|
|          419|                Bread|
|          419|                Sugar|
|          419|               Butter|
|          419|              Chicken|
|          419|               Baking|
|          419|             Grilling|
+-------------+---------------------+

我需要在 Word2Vec 词汇表中为 "token" 列中的每个标记找到 250 个最接近的标记。我试图在 udf:

中使用 findSynonymsArray 方法
def getSyn( w2v : Word2VecModel ) = udf { (token : String) => w2v.findSynonymsArray(token, 10)}

但是,此 udf 在与 withColumn 一起使用时会导致 NullPointerException。即使令牌是硬编码的,也不管代码是 运行 本地还是集群模式,都会发生此异常。我在 udf 中使用了一个 try-catch 来捕获空指针,并且它在每一行都被引发。

我查询了数据框的空值,两列中都有 none。

我还尝试使用 getVectorsWord2VecModel 中提取单词和向量,运行 在这个数据帧上的单词上使用我的 udf,并与我的数据帧进行内部连接.引发了相同的异常。

如有任何帮助,我将不胜感激。

这是预期的结果 Word2VecModel 是一个分布式模型,其方法是使用 RDD 操作实现的。因此,它不能在 udfmap 或任何其他执行程序端代码中使用。

如果您想计算整个 DataFrame 的同义词,您可以尝试手动完成。

  • 直接将模型加载为 DataFrame,如
  • 中所示
  • 转换输入数据。
  • 使用 approximate join 或叉积合并两者并过滤结果。