Skip to content

3.3 Implicit & Pattern matching

Bugeun Kim edited this page Nov 27, 2018 · 3 revisions

여기에 수록된 사용법(1~3절)은 모두 1.x 버전의 사용법입니다. 최신 버전의 사용법은 Usage를 참고하십시오.

Implicit conversion

Scala의 경우 다음과 같은 암시적 변환을 지원합니다.

import kr.bydelta.koala.Implicit._   //암시적 변환들

import kr.bydelta.koala.POS
import kr.bydelta.koala.hnn.SentenceSplitter
import kr.bydelta.koala.kkma._

// implicit 변환이 사용할 tagger/parser를 implicit val로 선언해둡니다.
implicit val split = new SentenceSplitter
implicit val tagger = new Tagger
implicit val parser = new Parser

// 1. 문장분리
// String.sentences가 암시적 변환으로 생성됩니다.
val sentences: Seq[String] = "나눠봅시다. 문장들로.".sentences

// 2. 품사표기
// String.toTagged가 암시적 변환으로 생성됩니다.
val tagged:Sentence = "분석할 문장입니다".toTagged

// 3. 의존구문분석
// String.toParsed, Sentence.toParsed가 암시적 변환으로 생성됩니다.
val parsed:Sentence = "분석할 문장입니다".toParsed
val parsed2 = tagged.toParsed

// 4. POSTag 확인
// 아래 문장은 tagged.exists(w => w.exists(m => m.tag == POS.VV))와 동일합니다.
tagged.exists(POS.VV)      // 암시적 변환: POSTag를 (Word => Boolean)로 변환
// 아래 문장은 tagged.head.exists(m => w.tag == POS.VV)와 동일합니다.
tagged.head.exists(POS.VV) // 암시적 변환: POSTag를 (Morpheme => Boolean)로 변환

// 5. Set of POSTag
val posSet = Seq(POS.VV, POS.VA, POS.VCP)  //세 태그 중 하나라도 일치하는지 확인하고자 할 때.
// 아래 문장은 tagged.exists(w => w.exists(m => posSet.contains(m.tag)))와 동일합니다.
tagged.exists(posSet)      // 암시적 변환: POSTag의 Seq를 (Word => Boolean)로 변환
// 아래 문장은 tagged.head.exists(m => posSet.contains(m.tag))와 동일합니다.
tagged.head.exists(posSet) // 암시적 변환: POSTag의 Seq를 (Morpheme => Boolean)로 변환

Pattern Matching

또한 아래와 같이 패턴 매칭이 가능합니다.

morpheme match {
  /* unapply(surf: 표면형, pos: 품사) */
  // 품사가 체언인 경우
  case Morpheme(surf, pos) if POS.isNoun(pos) =>
  // 품사가 VV인 경우
  case Morpheme(surf, POS.VV) => ...
  case Morpheme(surf, tag) => ...
}

word match {
  /* unapply(surf: 표면형, morphemes: 형태소*) */
  // 첫 형태소가 VV 품사인 경우, surf에 표면형을 넣고 rest에 나머지 형태소를 저장
  case Word(surf, Morpheme(_, POS.VV), rest @ _*) =>
  // 기타: surf에 표면형을, morphemes에 전체 형태소를 저장
  case Word(surf, morphemes @ _*) => ...
}

sentence match {
  /* unapply(words: 어절*) */
  // 첫 어절이 "나는"인 경우, rest에 나머지 어절을 저장
  case Sentence(Word("나는", _), rest @ _*) =>
  case Sentence(words @ _*) => ...
}

예시에서는 리스트 매칭의 경우 1개만 보여주었으나, 2개 이상의 매칭도 가능합니다.

Clone this wiki locally