-
Notifications
You must be signed in to change notification settings - Fork 44
3.3 Implicit & Pattern matching
Bugeun Kim edited this page Nov 27, 2018
·
3 revisions
여기에 수록된 사용법(1~3절)은 모두 1.x 버전의 사용법입니다. 최신 버전의 사용법은 Usage를 참고하십시오.
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)로 변환또한 아래와 같이 패턴 매칭이 가능합니다.
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개 이상의 매칭도 가능합니다.