[英]Calculate TF-IDF grouped by column
如何計算按列分組的tf-idf,而不是整個數據幀?
假設如下所示的數據框
private val sample = Seq(
(1, "A B C D E"),
(1, "B C D"),
(1, "B C D E"),
(2, "B C D F"),
(2, "A B C"),
(2, "B C E F G")
).toDF("id","sentences")
在上面的示例中,應通過考慮前三個元素為id = 1的句子計算IDF。 通過考慮后三個元素,以相同的方式為ID = 2的句子計算IDF。 Spark ml的tf-idf實現是否可能。
只是一個la腳的嘗試:您可以按ID過濾序列,然后將每個過濾器轉換為數據框並將其保存在列表中,然后使用循環將tf-idf應用於列表中的每個數據框。
var filters=List[org.apache.spark.sql.DataFrame]()
val mySeq=Seq((1, "A B C D E"),(1, "B C D"),(1, "B C D E"),(2, "B C D F"),(2, "A B C"),(2, "B C E F G"))
for(i<-List(1,2)){filters=filters:+s.filter{case x=>x._1==i}.toDF("id","sentences")}
例如,你有
scala> filters(0).show()
+---+---------+
| id|sentences|
+---+---------+
| 1|A B C D E|
| 1| B C D|
| 1| B C D E|
+---+---------+
scala> filters(1).show()
+---+---------+
| id|sentences|
+---+---------+
| 2| B C D F|
| 2| A B C|
| 2|B C E F G|
+---+---------+
並且您可以使用循環或map
在每個數據幀上進行TF-IDF計算。
您還可以使用某種groupBy
但是此操作需要改組,這可能會降低群集的性能
您可以按id
對數據幀進行分組,並在TF-IDF計算之前展平相應的標記詞。 以下是使用Spark TF-IDF文檔的示例代碼的代碼段:
val sample = Seq(
(1, "A B C D E"),
(1, "B C D"),
(1, "B C D E"),
(2, "B C D F"),
(2, "A B C"),
(2, "B C E F G")
).toDF("id","sentences")
import org.apache.spark.sql.functions._
import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}
val tokenizer = new Tokenizer().setInputCol("sentences").setOutputCol("words")
val wordsDF = tokenizer.transform(sample)
def flattenWords = udf( (s: Seq[Seq[String]]) => s.flatMap(identity) )
val groupedDF = wordsDF.groupBy("id").
agg(flattenWords(collect_list("words")).as("grouped_words"))
val hashingTF = new HashingTF().
setInputCol("grouped_words").setOutputCol("rawFeatures").setNumFeatures(20)
val featurizedData = hashingTF.transform(groupedDF)
val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel = idf.fit(featurizedData)
val rescaledData = idfModel.transform(featurizedData)
rescaledData.show
// +---+--------------------+--------------------+--------------------+
// | id| grouped_words| rawFeatures| features|
// +---+--------------------+--------------------+--------------------+
// | 1|[a, b, c, d, e, b...|(20,[1,2,10,14,18...|(20,[1,2,10,14,18...|
// | 2|[b, c, d, f, a, b...|(20,[1,2,8,10,14,...|(20,[1,2,8,10,14,...|
// +---+--------------------+--------------------+--------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.