Spark mllib:如何将字符串分类特征转换为 int 以供评级接受
Spark mllib : how to convert string categorical features into int for Rating to accept
我想在协同过滤技术中使用 spark mllib 和 ALS 算法构建一个推荐应用程序。我的数据集具有字符串形式的用户和产品特征,如:
[{"user":"StringName1", "product":"StringProduct1", "rating":1},
{"user":"StringName2", "product":"StringProduct2", "rating":2},
{"user":"StringName1", "product":"StringProduct2", "rating":3},..]
但是 Rating 方法似乎只接受用户和产品特征的 int 值。这是否意味着我必须构建一个单独的字典来将每个字符串映射到一个整数?我的数据集将有用户和 product.Is 的重复条目,在 mllib 库本身中有内置的解决方案吗?
谢谢,感谢任何帮助!
编辑:不,这不是重复的,因为该问题的答案似乎不符合我的情况。 spark.ml.recommendation.ALS.Rating
库似乎不支持 user
或 item
的字符串值。我需要这种支持。
让我试试。假设 data: RDD[(String, String, Float)]
import org.apache.spark.mllib.recommendation.Rating
val data = sc.parallelize(Array(("StringName1", "StringProduct1", 1.0), ("StringName2", "StringProduct2", 2.0), ("StringName3", "StringProduct3", 3.0)))
//get distinct names and products and create maps from them
val names = data.map(_._1).distinct.sortBy(x => x).zipWithIndex.collectAsMap
val products = data.map(_._2).distinct.sortBy(x => x).zipWithIndex.collectAsMap
//convert to Rating format
val data_rating = data.map(r => Rating(names(r._1).toInt, products(r._2).toInt, r._3))
应该可以了。基本上,您只需创建一个从 string 到 long 的映射,然后将 long 转换为 int。
我想在协同过滤技术中使用 spark mllib 和 ALS 算法构建一个推荐应用程序。我的数据集具有字符串形式的用户和产品特征,如:
[{"user":"StringName1", "product":"StringProduct1", "rating":1},
{"user":"StringName2", "product":"StringProduct2", "rating":2},
{"user":"StringName1", "product":"StringProduct2", "rating":3},..]
但是 Rating 方法似乎只接受用户和产品特征的 int 值。这是否意味着我必须构建一个单独的字典来将每个字符串映射到一个整数?我的数据集将有用户和 product.Is 的重复条目,在 mllib 库本身中有内置的解决方案吗?
谢谢,感谢任何帮助!
编辑:不,这不是重复的,因为该问题的答案似乎不符合我的情况。 spark.ml.recommendation.ALS.Rating
库似乎不支持 user
或 item
的字符串值。我需要这种支持。
让我试试。假设 data: RDD[(String, String, Float)]
import org.apache.spark.mllib.recommendation.Rating
val data = sc.parallelize(Array(("StringName1", "StringProduct1", 1.0), ("StringName2", "StringProduct2", 2.0), ("StringName3", "StringProduct3", 3.0)))
//get distinct names and products and create maps from them
val names = data.map(_._1).distinct.sortBy(x => x).zipWithIndex.collectAsMap
val products = data.map(_._2).distinct.sortBy(x => x).zipWithIndex.collectAsMap
//convert to Rating format
val data_rating = data.map(r => Rating(names(r._1).toInt, products(r._2).toInt, r._3))
应该可以了。基本上,您只需创建一个从 string 到 long 的映射,然后将 long 转换为 int。