Spark:句子上的StringIndexer

时间:2017-12-06 22:29:09

标签: java scala apache-spark machine-learning apache-spark-mllib

我试图在一列句子上做一些StringIndexer,即将单词列表转换为整数列表。

例如:

输入数据集

  (1, ["I", "like", "Spark"])
  (2, ["I", "hate", "Spark"])

我希望 StringIndexer 之后的输出如下:

  (1, [0, 2, 1])
  (2, [0, 3, 1])

理想情况下,我希望将此类转换作为Pipeline的一部分,以便我可以将变换器链接在一起并序列化以进行在线服务。

这是Spark支持本地的东西吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

用于将文字转换为要素的标准TransformersCountVectorizer

  

CountVectorizer和CountVectorizerModel旨在帮助将文本文档集合转换为令牌计数向量。

HashingTF

  

使用散列技巧将一系列术语映射到其术语频率。目前,我们使用Austin Appleby的MurmurHash 3算法(MurmurHash3_x86_32)来计算术语对象的哈希码值。由于使用简单模来将散列函数转换为列索引,因此建议使用2的幂作为numFeatures参数;否则,功能将不会均匀映射到列。

两者都有binary选项,可用于从计数切换到二进制矢量。

没有内置Transfomer可以提供您想要的确切结果(它对ML算法无用)。您可以explode申请StringIndexer和{{ 1}} / collect_list

collect_set

import org.apache.spark.ml.feature._ import org.apache.spark.ml.Pipeline val df = Seq( (1, Array("I", "like", "Spark")), (2, Array("I", "hate", "Spark")) ).toDF("id", "words") val pipeline = new Pipeline().setStages(Array( new SQLTransformer() .setStatement("SELECT id, explode(words) as word FROM __THIS__"), new StringIndexer().setInputCol("word").setOutputCol("index"), new SQLTransformer() .setStatement("""SELECT id, COLLECT_SET(index) AS values FROM __THIS__ GROUP BY id""") )) pipeline.fit(df).transform(df).show // +---+---------------+ // | id| values| // +---+---------------+ // | 1|[0.0, 1.0, 3.0]| // | 2|[2.0, 0.0, 1.0]| // +---+---------------+ CountVectorizer

udf