繁体   English   中英

Spark:句子上的StringIndexer

[英]Spark: StringIndexer on sentences

我正在尝试在一列句子上执行StringIndexer,即将单词列表转换为整数列表。

例如:

输入数据集

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

我期望StringIndexer之后的输出像:

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

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

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

谢谢!

用于将文本转换为特征的标准TransformersCountVectorizer

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

HashingTF

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

两者都有binary选项,可用于从计数转换为二进制向量。

没有内置的Transfomer可以提供您想要的准确结果(这对ML算法而言没有用),购买后您可以explode应用StringIndexercollect_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]|
// +---+---------------+

随着CountVectorizerudf

import org.apache.spark.ml.linalg._


spark.udf.register("indices", (v: Vector) => v.toSparse.indices)

val pipeline = new Pipeline().setStages(Array(
  new CountVectorizer().setInputCol("words").setOutputCol("vector"),
  new SQLTransformer()
    .setStatement("SELECT *, indices(vector) FROM __THIS__")
))

pipeline.fit(df).transform(df).show

// +---+----------------+--------------------+-------------------+
// | id|           words|              vector|UDF:indices(vector)|
// +---+----------------+--------------------+-------------------+
// |  1|[I, like, Spark]|(4,[0,1,3],[1.0,1...|          [0, 1, 3]|
// |  2|[I, hate, Spark]|(4,[0,1,2],[1.0,1...|          [0, 1, 2]|
// +---+----------------+--------------------+-------------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM