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을 추가합니다.
MorphemeType
: 형태소 분석 결과입니다. 아래와 같은 schema를 가집니다:
root
|-- surface: string (nullable = false) // 표면형
|-- pos_id: integer (nullable = false) // 형태소 id
주어진 문자열을 문장 단위로 분할합니다.
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의 아해가 무섭다고 그리오. |
// +------------------------------+
주어진 문자열을 단어 단위로 분할합니다.
input | output | |
---|---|---|
param | 문자열 | 분할된 단어 집합 |
type | StringType |
ArrayType(StringType) |
주어진 문자열을 형태소 단위로 분할합니다.
input | output | |
---|---|---|
param | 문자열 | 포함된 형태소 집합 |
type | StringType |
ArrayType(MorphemeType) |
형태소 분석 결과가 체언(명사, 수사, 대명사)인지를 판별합니다.
input | output | |
---|---|---|
param | 형태소 분석 결과 | 체언 여부 |
type | MorphemeType |
BooleanType |
형태소 분석 결과가 용언(동사, 형용사)인지를 판별합니다.
input | output | |
---|---|---|
param | 형태소 분석 결과 | 용언 여부 |
type | MorphemeType |
BooleanType |
형태소 분석 결과가 수식언(관형사, 부사)인지를 판별합니다.
input | output | |
---|---|---|
param | 형태소 분석 결과 | 수식언 여부 |
type | MorphemeType |
BooleanType |
형태소 분석 결과가 관계언(조사)인지를 판별합니다.
input | output | |
---|---|---|
param | 형태소 분석 결과 | 관계언 여부 |
type | MorphemeType |
BooleanType |
형태소 분석 결과가 어미(선어말 어미, 종결 어미, ...)인지를 판별합니다.
input | output | |
---|---|---|
param | 형태소 분석 결과 | 어미 여부 |
type | MorphemeType |
BooleanType |
형태소 분석 결과가 접사(체언 접두사, 용언 접두사, ...)인지를 판별합니다.
input | output | |
---|---|---|
param | 형태소 분석 결과 | 접사 여부 |
type | MorphemeType |
BooleanType |
주어진 형태소 id 값 혹은 형태소 분석 결과가 기호인지를 판별합니다.
input | output | |
---|---|---|
param | 형태소 분석 결과 | 기호 여부 |
type | MorphemeType |
BooleanType |
형태소 분석 결과가 미확인 품사인지를 판별합니다.
input | output | |
---|---|---|
param | 형태소 분석 결과 | 미확인 품사 여부 |
type | MorphemeType |
BooleanType |
형태소 분석 결과가 주어진 형태소 id 집합에 포함되는지를 판별합니다.
input1 | input2 | output | |
---|---|---|---|
param | 형태소 분석 결과 | 형태소 id 배열 | 포함 여부 |
type | MorphemeType |
ArrayType(IntegerType) |
BooleanType |
프로젝트를 빌드하기 위해서는 sbt가 필요합니다.
sbt clean # 빌드된 파일 제거
sbt compile # 컴파일
sbt test # 테스트
sbt package # artifact 생성
* 모든 기능 및 테스트는 konlp에 구현되어 있습니다. arirang, daon, kmr, rhino 모듈에는 지원되는 형태소 분석기에 대한 테스트를 수행하는 코드만 있습니다.
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 | 임시기호(내부처리용) |