CountVectorizer와 CountVectorizerModel은 텍스트 문서를 토큰 개수의 벡터로 변환할 수 있다.
CountVectorizer는 어휘 추출을 위한 에스터메이터(estimator)로 사용되어 CountVectorizerModel을 생성한다.
해당 모델은 어휘를 통해 문서에 대한 희소한 표현을 생성한 다음 LDA와 같은 알고리즘으로 전달할 수 있다.
다음은 피쳐를 만드는 간단한 데이터 프레임을 생성하는 예이다.
scala>
val df = spark.createDataFrame(
Seq((0, Array("Jason", "David")),
(1, Array("David", "Martin")),
(2, Array("Martin", "Jason")),
(3, Array("Jason", "Daiel")),
(4, Array("Daiel", "Martin")),
(5, Array("Moahmed", "Jason")),
(6, Array("David", "David")),
(7, Array("Jason", "Martin")))).toDF("id", "name")
scala>
df.show(false)
// 결과
+---+----------------+
|id |name |
+---+----------------+
|0 |[Jason, David] |
|1 |[David, Martin] |
|2 |[Martin, Jason] |
|3 |[Jason, Daiel] |
|4 |[Daiel, Martin] |
|5 |[Moahmed, Jason]|
|6 |[David, David] |
|7 |[Jason, Martin] |
+---+----------------+
대부분의 경우 setInputCol을 사용해 입력 컬럼을 설정할 수 있다. 다음과 같이 코퍼스의 CountVectorizerModel 오브젝트를 피팅한다.
scala>
import org.apache.spark.ml.feature.CountVectorizer
import org.apache.spark.ml.feature.CountVectorizerModel
val cvModel: CountVectorizerModel = new CountVectorizer()
.setInputCol("name")
.setOutputCol("features")
.setVocabSize(3)
.setMinDF(2)
.fit(df)
이제 추출기를 사용해 다음과 같이 토큰 개수에 대한 벡터를 얻는다.
scala>
val feature = cvModel.transform(df)
scala>
feature.show(false)
+---+----------------+-------------------+
|id |name |features |
+---+----------------+-------------------+
|0 |[Jason, David] |(3,[0,1],[1.0,1.0])|
|1 |[David, Martin] |(3,[1,2],[1.0,1.0])|
|2 |[Martin, Jason] |(3,[0,2],[1.0,1.0])|
|3 |[Jason, Daiel] |(3,[0],[1.0]) |
|4 |[Daiel, Martin] |(3,[2],[1.0]) |
|5 |[Moahmed, Jason]|(3,[0],[1.0]) |
|6 |[David, David] |(3,[1],[2.0]) |
|7 |[Jason, Martin] |(3,[0,2],[1.0,1.0])|
+---+----------------+-------------------+
이름에 대한 피쳐가 생성되었다.
'scala' 카테고리의 다른 글
[spark] 머신 러닝 - StringIndexer/One-host encoding 예 (0) | 2018.05.29 |
---|---|
[spark] 머신 러닝 - 토큰화(Tokenizer) / StopWordsRemover 예 (0) | 2018.05.28 |
[spark] spark-shell - Failed to start database 'metastore_db' with class loader 처리하기 (0) | 2018.05.28 |
[spark] EOFException:Cannot seek after EOF/java.lang.NumberFormatException: For input string: "" 해결하기 (0) | 2018.05.12 |
[spark] 로컬 모드 아키텍처 [펌] (0) | 2018.03.29 |