[英]Spark: StringIndexer on sentences
我正在嘗試在一列句子上執行StringIndexer,即將單詞列表轉換為整數列表。
例如:
輸入數據集 :
(1, ["I", "like", "Spark"])
(2, ["I", "hate", "Spark"])
我期望StringIndexer之后的輸出像:
(1, [0, 2, 1])
(2, [0, 3, 1])
理想情況下,我希望將這種轉換作為Pipeline的一部分進行,以便我可以將變壓器鏈接在一起,並進行序列化以進行在線服務。
這是Spark本身支持的東西嗎?
謝謝!
用於將文本轉換為特征的標准Transformers
是CountVectorizer
CountVectorizer和CountVectorizerModel旨在幫助將文本文檔的集合轉換為令牌計數的向量。
或HashingTF
:
使用哈希技巧將術語序列映射到其術語頻率。 當前,我們使用Austin Appleby的MurmurHash 3算法(MurmurHash3_x86_32)計算術語對象的哈希碼值。 由於使用簡單的模將哈希函數轉換為列索引,因此建議使用2的冪作為numFeatures參數。 否則,要素將不會均勻地映射到列。
兩者都有binary
選項,可用於從計數轉換為二進制向量。
沒有內置的Transfomer
可以提供您想要的准確結果(這對ML算法而言沒有用),購買后您可以explode
應用StringIndexer
和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
:
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.