dongjinleekr / spark-ko-nlp

Korean language processor for Apache Spark

Version Matrix

spark-ko-nlp

spark-ko-nlp는 Apache Spark를 위한 한국어 자연어 처리 패키지입니다. KoalaNLP에 기반하여 형태소 분석기에 독립적인 일관적이고 표준적인 인터페이스를 제공하며, Spark의 User Defined Function 기능을 사용하지 않음으로써 효율적인 처리를 구현합니다.

빠른 시작

import com.dongjinlee.spark.konlp.functions._
import com.dongjinlee.spark.konlp.types._
import org.apache.spark.sql.functions._

...

// 입력 문자열
val lines = """바람이 살짝 잠을 깨운 꽃잎에
        |좋아해 이 말 한마디를 담아서
        |어젯밤 꼬박 새운 나의 노래에
        |사랑의 마법을 걸어보네""".stripMargin.split('\n').toSeq

// 형태소 분석
val df = lines.toDF("str")
  .withColumn("morphemes", explode(morphemes(col("str"))))
  .withColumn("surface", col("morphemes.surface"))
  .withColumn("pos_id", col("morphemes.pos_id"))
  .select(col("surface"), col("pos_id"))

df.show

// +-------+------+
// |surface|pos_id|
// +-------+------+
// |  바람  |   0  |
// |   이  |  15  |
// |  살짝  |  12  |
// |   잠  |   0  |
// |   을  |  18  |
// |  깨우  |   6  |
// |   ㄴ  |  28  |
// ...
// +-------+------+

제공 기능

이 패키지는 Spark SQL에 아래와 같은 Type과 Function을 추가합니다.

Type

  • MorphemeType: 형태소 분석 결과입니다. 아래와 같은 schema를 가집니다:
root
 |-- surface: string (nullable = false) // 표면형
 |-- pos_id: integer (nullable = false) // 형태소 id

Function

ssplit

주어진 문자열을 문장 단위로 분할합니다.

input output
param 문자열 분할된 문장 집합
type StringType ArrayType(StringType)
// 입력 문자열
val text = """13인의 아해가 도로로 질주하오.
       |길은 막다른 골목이 적당하오.
       |
       |제 1의 아해가 무섭다고 그리오.""".stripMargin.replaceAll("\\n", " ")

// 문장 단위 분할
val df = Seq(text).toDF("str")
  .withColumn("sentence", explode(ssplit(col("str"))))
  .select(col("sentence"))

df.printSchema

// root
//  |-- sentence: string (nullable = false)s 8s

df.show

// +------------------------------+
// |           sentence           |
// +------------------------------+
// |   13인의 아해가 도로로 질주하오.  |
// |    길은 막다른 골목이 적당하오.   |
// |   제 1의 아해가 무섭다고 그리오.  |
// +------------------------------+

wsplit

주어진 문자열을 단어 단위로 분할합니다.

input output
param 문자열 분할된 단어 집합
type StringType ArrayType(StringType)

morphemes

주어진 문자열을 형태소 단위로 분할합니다.

input output
param 문자열 포함된 형태소 집합
type StringType ArrayType(MorphemeType)

isNoun

형태소 분석 결과가 체언(명사, 수사, 대명사)인지를 판별합니다.

input output
param 형태소 분석 결과 체언 여부
type MorphemeType BooleanType

isPredicate

형태소 분석 결과가 용언(동사, 형용사)인지를 판별합니다.

input output
param 형태소 분석 결과 용언 여부
type MorphemeType BooleanType

isModifier

형태소 분석 결과가 수식언(관형사, 부사)인지를 판별합니다.

input output
param 형태소 분석 결과 수식언 여부
type MorphemeType BooleanType

isPostPosition

형태소 분석 결과가 관계언(조사)인지를 판별합니다.

input output
param 형태소 분석 결과 관계언 여부
type MorphemeType BooleanType

isEnding

형태소 분석 결과가 어미(선어말 어미, 종결 어미, ...)인지를 판별합니다.

input output
param 형태소 분석 결과 어미 여부
type MorphemeType BooleanType

isAffix

형태소 분석 결과가 접사(체언 접두사, 용언 접두사, ...)인지를 판별합니다.

input output
param 형태소 분석 결과 접사 여부
type MorphemeType BooleanType

isSymbol

주어진 형태소 id 값 혹은 형태소 분석 결과가 기호인지를 판별합니다.

input output
param 형태소 분석 결과 기호 여부
type MorphemeType BooleanType

isUnknown

형태소 분석 결과가 미확인 품사인지를 판별합니다.

input output
param 형태소 분석 결과 미확인 품사 여부
type MorphemeType BooleanType

hasTagOf

형태소 분석 결과가 주어진 형태소 id 집합에 포함되는지를 판별합니다.

input1 input2 output
param 형태소 분석 결과 형태소 id 배열 포함 여부
type MorphemeType ArrayType(IntegerType) BooleanType

How to Build

프로젝트를 빌드하기 위해서는 sbt가 필요합니다.

sbt clean       # 빌드된 파일 제거
sbt compile     # 컴파일
sbt test        # 테스트
sbt package     # artifact 생성

* 모든 기능 및 테스트는 konlp에 구현되어 있습니다. arirang, daon, kmr, rhino 모듈에는 지원되는 형태소 분석기에 대한 테스트를 수행하는 코드만 있습니다.

기타

Dependency 설정

spark-ko-nlp를 사용하려면 KoalaNLP에 호환되는 형태소 분석 모듈을 추가해 주어야 합니다. 현재 아래와 같은 모듈들을 지원하며, dependency 설정만 해 주면 추가 설정 필요 없이 자동으로 인식됩니다:

이름 groupId artifactId
아리랑 kr.bydelta koalanlp-arirang
daon kr.bydelta koalanlp-daon
코모란 kr.bydelta koalanlp-kmr
rhino kr.bydelta koalanlp-rhino

버전은 koala-nlp와 동일한 버전을 써 주시면 됩니다. 버전 호환성은 아래와 같습니다:

spark-ko-nlp koala-nlp scala spark
0.5 2.0.5 2.11, 2.12 2.4.x

세종 품사표기 표준안

scala-ko-nlp는 KoalaNLP의 세종 품사표기 표준안 정의를 따릅니다. (참고)

id code 분류 한글 명칭
0 NNG 체언 일반명사
1 NNP 체언 고유명사
2 NNB 체언 일반 의존명사
3 NNM 체언 단위성 의존명사
4 NR 체언 수사
5 NP 체언 대명사
6 VV 용언 동사
7 VA 용언 형용사
8 VX 용언 보조용언
9 VCP 용언 긍정지정사
10 VCN 용언 부정지정사
11 MM 수식언 관형사
12 MAG 수식언 부사
13 MAJ 수식언 접속부사
14 IC 독립언 감탄사
15 JKS 관계언 주격 조사
16 JKC 관계언 보격 조사
17 JKG 관계언 관형격 조사
18 JKO 관계언 목적격 조사
19 JKB 관계언 부사격 조사
20 JKV 관계언 호격 조사
21 JKQ 관계언 인용격 조사
22 JC 관계언 접속 조사
23 JX 관계언 보조사
24 EP 어미 선어말 어미
25 EF 어미 종결 어미
26 EC 어미 연결 어미
27 ETN 어미 명사형 전성어미
28 ETM 어미 관형형 전성어미
29 XPN 접사 체언 접두사
30 XPV 접사 용언 접두사
31 XSN 접사 명사 파생 접미사
32 XSV 접사 동사 파생 접미사
33 XSA 접사 형용사 파생 접미사
34 XSM 접사 부사 파생 접미사
35 XSO 접사 기타 접미사
36 XR 접사 어근
37 SF 기호 종결기호
38 SP 기호 연결기호
39 SS 기호 묶음기호
40 SE 기호 생략기호
41 SO 기호 붙임기호
42 SW 기호 기타기호
43 NF 명사 추정 범주
44 NV 동사 추정 범주
45 NA 분석 불능 범주
46 SL 외국어
47 SH 한자
48 SN 숫자
49 TEMP 임시기호(내부처리용)