Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spark:句子索引器_Java_Scala_Apache Spark_Machine Learning_Apache Spark Mllib - Fatal编程技术网

Java Spark:句子索引器

Java Spark:句子索引器,java,scala,apache-spark,machine-learning,apache-spark-mllib,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]) 理想情况下,我希望将这种转换作为管道的一部分,这样我就可以将transformer链接在一起并序列化以提供在线服务 这是天生的火花支持吗 谢谢大家! 用

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

例如:

输入数据集

  (1, ["I", "like", "Spark"])
  (2, ["I", "hate", "Spark"])
我希望StringIndexer之后的输出如下:

  (1, [0, 2, 1])
  (2, [0, 3, 1])
理想情况下,我希望将这种转换作为管道的一部分,这样我就可以将transformer链接在一起并序列化以提供在线服务

这是天生的火花支持吗


谢谢大家!

用于将文本转换为功能的标准
转换器

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

或:

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

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

没有内置的
Transformer
可以给出您想要的准确结果(它对ML算法没有用处)购买您可以
分解
应用
StringIndexer
,以及
收集列表
/
收集集

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]|
// +---+---------------+
使用
countvectorier
udf

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]|
// +---+----------------+--------------------+-------------------+

非常感谢你的详细回答。奇怪的是,为什么你说这对ML没有用处。我尝试这样做的原因是,我正在spark中转换数据,然后将转换后的数据输入Tensorflow框架进行训练。TF模型希望使用“句子”进行NLP处理。通常ML工具希望数据有一个固定大小的向量表示,您不能只传递索引列表。啊,也许我没有表达我的问题。当我说索引列表时,我指的是索引数组。我试图解决的问题是,我需要将原始句子转换成固定大小的数字向量。如果句子长度比大小长,我会删掉它;另一方面,如果句子长度较短,我将使用默认值填充数组。因此,如果是矢量(而不是列表),您对数据预处理有更好的建议吗?不要填充-您的数据将被完全删除。搞混了。使用
countvectorier
HashingTF
并将输出(
SparseVector
)转换为代码可以使用的内容:)