Spark2 분석 예제 (Scala)

이 문서에서는 Spark2에서 KOMORAN을 이용한 분석 예제를 살펴보겠습니다.

Note

문서의 내용 중 지원되지 않거나 잘못된 내용을 발견하실 경우, 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.STABLE)

  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 기다리/...|
+--------------------+--------------------+

Todo

사용 가능한 API 문서를 작성하고, 링크합니다.