Spark2 분석 예제 (Scala)¶
이 문서에서는 Spark2에서 KOMORAN을 이용한 분석 예제를 살펴보겠습니다.
주석
문서의 내용 중 지원되지 않거나 잘못된 내용을 발견하실 경우, KOMORAN 문서 프로젝트에 이슈 를 남겨주세요.
들어가기¶
KOMORAN을 아직 설치하지 않으셨거나 프로젝트에 포함하는 방법을 모르신다면, 설치하기 또는 3분 만에 형태소 분석 따라하기 문서를 먼저 참고해주세요.
문장 분석¶
다음과 같은 예시 코드를 사용하여 분석할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import kr.co.shineware.nlp.komoran.constant.DEFAULT_MODEL
import kr.co.shineware.nlp.komoran.core.Komoran
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.functions.udf
import scala.collection.JavaConverters._
object Main {
val komoran = new Komoran(DEFAULT_MODEL.LIGHT)
val getPlainTextUdf: UserDefinedFunction = udf[String, String] { sentence =>
komoran.analyze(sentence).getPlainText
}
val getNounsUdf: UserDefinedFunction = udf[Seq[String], String] { sentence =>
komoran.analyze(sentence).getNouns.asScala
}
val getTokenListUdf: UserDefinedFunction = udf[Seq[String], String] { sentence =>
komoran.analyze(sentence).getTokenList.asScala.map(x => x.toString)
}
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().enableHiveSupport().getOrCreate()
import spark.implicits._
val testDataset = spark.createDataFrame(Seq(
"밀리언 달러 베이비랑 바람과 함께 사라지다랑 뭐가 더 재밌었어?",
"아버지가방에들어가신다",
"나는 밥을 먹는다",
"하늘을 나는 자동차",
"아이폰 기다리다 지쳐 애플공홈에서 언락폰질러버렸다 6+ 128기가실버ㅋ"
).map(Tuple1.apply)).toDF("sentence")
// 1. print test data
testDataset.show(truncate = false)
val analyzedDataset =
testDataset.withColumn("plain_text", getPlainTextUdf($"sentence"))
.withColumn("nouns", getNounsUdf($"sentence"))
.withColumn("token_list", getTokenListUdf($"sentence"))
// 2. print test data and analyzed result as list
analyzedDataset.select("sentence", "token_list").show()
// 3. print test data and morphes with selected pos
analyzedDataset.select("sentence", "nouns").show()
// 4. print test data and analyzed result as pos-tagged text
analyzedDataset.select("sentence", "plain_text").show()
}
}
|
분석 결과¶
위 코드를 실행한 결과는 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | +---------------------------------------+
|sentence |
+---------------------------------------+
|밀리언 달러 베이비랑 바람과 함께 사라지다랑 뭐가 더 재밌었어? |
|아버지가방에들어가신다 |
|나는 밥을 먹는다 |
|하늘을 나는 자동차 |
|아이폰 기다리다 지쳐 애플공홈에서 언락폰질러버렸다 6+ 128기가실버ㅋ|
+---------------------------------------+
+--------------------+--------------------+
| sentence| token_list|
+--------------------+--------------------+
|밀리언 달러 베이비랑 바람과 함...|[Token [morph=밀리,...|
| 아버지가방에들어가신다|[Token [morph=아버지...|
| 나는 밥을 먹는다|[Token [morph=나, ...|
| 하늘을 나는 자동차|[Token [morph=하늘,...|
|아이폰 기다리다 지쳐 애플공홈에...|[Token [morph=아이,...|
+--------------------+--------------------+
+--------------------+--------------------+
| sentence| nouns|
+--------------------+--------------------+
|밀리언 달러 베이비랑 바람과 함...| [베이비, 바람]|
| 아버지가방에들어가신다| [아버지, 가방]|
| 나는 밥을 먹는다| [밥]|
| 하늘을 나는 자동차| [하늘, 자동차]|
|아이폰 기다리다 지쳐 애플공홈에...|[아이, 폰, 애플, 공, 홈,...|
+--------------------+--------------------+
+--------------------+--------------------+
| sentence| plain_text|
+--------------------+--------------------+
|밀리언 달러 베이비랑 바람과 함...|밀리/VV 어/EC ㄴ/JX 달...|
| 아버지가방에들어가신다|아버지/NNG 가방/NNG 에/...|
| 나는 밥을 먹는다|나/NP 는/JX 밥/NNG 을...|
| 하늘을 나는 자동차|하늘/NNG 을/JKO 나/NP...|
|아이폰 기다리다 지쳐 애플공홈에...|아이/NNG 폰/NNP 기다리/...|
+--------------------+--------------------+
|
과제
사용 가능한 API 문서를 작성하고, 링크합니다.