bgnkim / koalanlp   1.9.4

Website GitHub

KoalaNLP는 @koalanlp/koalanlp로 이동했습니다:

Scala versions: 2.12 2.11 2.10

KoalaNLP

이 저장소는 1.x 버전의 API와 사용법 참고를 위한 기록용으로 보존됩니다.

아래를 눌러, @koalanlp가 관리하는 최신 버전(2.x 이후)의 저장소로 이동해주세요.

2.x 버전에서는 Daon (김상준), ETRI Open API (ETRI), Khaiii (Kakao)를 추가로 지원합니다.


KoalaNLP

ScalaDoc JavaDoc 분석기별 품사비교표 MIT License

소개

한국어 형태소 및 구문 분석기의 모음입니다.

이 프로젝트는 서로 다른 형태의 형태소 분석기를 모아, 동일한 인터페이스 아래에서 사용할 수 있도록 하는 것이 목적입니다.

주1-1 이전 코드와의 연속성을 위해서, OpenKoreanText의 패키지 명칭은 twitter로 유지합니다.

주1-2 Arirang 분석기의 출력을 형태소분석에 적합하게 조금 다듬었으므로, 원본과 약간 다른 결과를 낼 수도 있습니다.

KoalaNLP Team의 일원이 되고 싶으시다면, 언제든지 Issue에 등록해주십시오. 또한, 추가하고자 하는 새로운 프로젝트가 있으시면, Issue에 등록해주십시오.

SBT/Maven

패키지명 버전 Java Scala 설명
koalanlp-core Version 8+ 2.11+ 통합 인터페이스의 정의가 등재된 중심 묶음입니다.
koalanlp-hannanum Version 8+ 2.11+ 한나눔 분석기 패키지입니다. 2-1
koalanlp-kkma Version 8+ 2.11+ 꼬꼬마 분석기 패키지입니다. 2-1
koalanlp-komoran Version 8+ 2.11+ 코모란 분석기 패키지입니다. 2-2
koalanlp-twitter Version 8+ 2.11+2-3 트위터(OpenKoreanText) 분석기 패키지입니다.
koalanlp-eunjeon Version 8+ 2.11+ 은전한닢 분석기 패키지입니다.
koalanlp-arirang Version 8+ 2.11+ 아리랑 분석기 패키지입니다.2-1
koalanlp-rhino Version 8+ 2.11+ RHINO 분석기 패키지입니다.2-1
koalanlp-kryo Version 8+ 2.11+ Kryo Serialization을 지원하기 위한 패키지입니다.
koalanlp-server Version 8+ 2.11+2-3 HTTP 서비스 구성을 위한 패키지입니다.

주2-1 꼬꼬마, 한나눔, 아리랑, RHINO 분석기는 타 분석기와 달리 Maven repository에 등재되어 있지 않아, 원래는 수동으로 직접 추가하셔야 합니다. 이 점이 불편하다는 것을 알기에, KoalaNLP는 assembly 형태로 해당 패키지를 포함하여 배포하고 있습니다. 포함된 패키지를 사용하려면, assembly classifier를 사용하십시오. "assembly" classifier가 지정되지 않으면, 각 분석기 라이브러리가 빠진 채로 dependency가 참조됩니다.

주2-2 코모란 분석기는 KoalaNLP v1.6.0부터 Jitpack에 등재된 코모란 3.2를 Dependency 참조합니다. 따라서 "assembly" classifier는 v1.5.4까지 지원됩니다.

주2-3 twitter패키지의 경우, Scala 2.11용 패키지는 OKT의 Legacy인 Twitter의 korean-text 4.4.4 버전을 사용합니다.

server패키지의 경우, Scala 2.11용 패키지는 Legacy인 Colossus 0.9.1 버전을 사용합니다. (2.12용 패키지는 colossus 0.10.0-RC1이 배포되는 대로 반영됩니다.)

Dependency 추가하기

KoalaNLP는 Scala 2.11과, 2.12에서 컴파일 되었으며, Scala 2.11+과 Java 8+을 지원합니다.

SBT를 사용하시는 경우, 다음과 같이 추가하시면 됩니다. (버전은 Latest Release 기준입니다. SNAPSHOT을 사용하시려면, latest.integration을 사용하세요.)

resolvers += "jitpack" at "https://jitpack.io/" // 코모란 분석기의 참조를 위한 Resolver 추가.

libraryDependencies += "kr.bydelta" %% "koalanlp-twitter" % "latest.release"	//트위터 분석기의 경우
libraryDependencies += "kr.bydelta" %% "koalanlp-eunjeon" % "latest.release"	//은전한닢 분석기의 경우
libraryDependencies += "kr.bydelta" %% "koalanlp-komoran" % "latest.release"	//코모란 분석기의 경우

libraryDependencies += "kr.bydelta" %% "koalanlp-kkma" % "latest.release" classifier "assembly"	//꼬꼬마 분석기의 경우
libraryDependencies += "kr.bydelta" %% "koalanlp-hannanum" % "latest.release" classifier "assembly"	//한나눔 분석기의 경우
libraryDependencies += "kr.bydelta" %% "koalanlp-arirang" % "latest.release" classifier "assembly"	//아리랑 분석기의 경우
libraryDependencies += "kr.bydelta" %% "koalanlp-rhino" % "latest.release" classifier "assembly"	//RHINO 분석기의 경우

libraryDependencies += "kr.bydelta" %% "koalanlp-kryo" % "latest.release" // Kryo Serialization
libraryDependencies += "kr.bydelta" %% "koalanlp-server" % "latest.release" // HTTP 서비스

Maven을 사용하시는 경우, 다음과 같습니다. ${TAGGER_PACK}위치에는 원하는 품사분석기의 패키지를 써주시고, ${TAGGER_VER}위치에는 품사분석기의 버전을 써주세요.

<dependency>
  <groupId>kr.bydelta</groupId>
  <artifactId>koalanlp-${TAGGER.PACK}_2.12</artifactId>
  <version>${TAGGER_VER}</version>
</dependency>

[질문] 저는 Java개발자입니다. 왜 패키지명칭에 _2.12가 붙나요?

KoalaNLP가 Scala에서 개발되었기 때문에, 개발 당시 Scala의 버전인 2.12가 뒤에 붙은 것입니다.

Classifier를 추가하실 경우, <artifactId>다음 행에 다음 코드를 추가하세요.

  <classifier>assembly</classifier>

예를 들어서, 꼬꼬마 분석기(koalanlp-kkma) 버전 1.8.2를 추가하고자 한다면, 아래와 같습니다.

<dependency>
  <groupId>kr.bydelta</groupId>
  <artifactId>koalanlp-kkma_2.12</artifactId>
  <classifier>assembly</classifier>
  <version>1.8.2</version>
</dependency>

사용방법

아래에는 대표적인 특징만 기술되어 있습니다.

상세한 사항은 Wiki 또는 ScalaDoc을 참고하십시오.

여러 패키지의 사용

통합 인터페이스는 여러 패키지간의 호환이 가능하게 설계되어 있습니다. 이론적으로는 타 패키지의 품사 분석 결과를 토대로 구문 분석이 가능합니다.

Note:

  • 본 분석의 결과는 검증되지 않았습니다.
  • 신조어 등으로 인해 한나눔이나 꼬꼬마에서 품사 분석이 제대로 수행되지 않을 경우를 위한 기능입니다.
  • 사용자 정의 사전은 TaggerParser의 대상이 되는 패키지에 모두에 추가하여야 합니다.
/* 패키지 명: 한나눔(hnn), 코모란(kmr), 꼬꼬마(kkma), 은전한닢(eunjeon), 트위터(twt), 아리랑(arirang) */
// 예시에서는 트위터 문장분석기, 은전한닢 품사 분석, 꼬꼬마 구문 분석을 진행함.
import kr.bydelta.koala.twt.SentenceSplitter
import kr.bydelta.koala.eunjeon.Tagger
import kr.bydelta.koala.kkma.Parser

val splitter = new SentenceSplitter
val tagger = new Tagger
val parser = new Parser

val paragraph = "누군가가 말했다. Python에는 KoNLPy가 있다. Scala는 KoalaNLP가 있었다."
val sentences = splitter.sentences(paragraph)
val tagged = sentences.map(tagger.tagSentence)
val parsed = tagged.map(parser.parse)

Java는 아래와 같습니다.

import kr.bydelta.koala.twt.SentenceSplitter;
import kr.bydelta.koala.eunjeon.Tagger;
import kr.bydelta.koala.kkma.Parser;
import kr.bydelta.koala.Sentence;

SentenceSplitter splitter = new SentenceSplitter();
Tagger tagger = new Tagger();
Tagger parser = new Parser();

String paragraph = "누군가가 말했다. Python에는 KoNLPy가 있다. Java는 KoalaNLP가 있었다.";
List<String> sentences = splitter.jSentences(paragraph);
for(String line : sentences){
  Sentence tagged = tagger.tagSentence(line);
  Sentence parsed = parser.parse(tagged);
}

Implicit 변환 & 패턴 매칭

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 split = new SentenceSplitter
implicit val tagger = new Tagger
implicit val parser = new Parser

// 1. 문장분리
val sentences: Seq[String] = "나눠봅시다. 문장들로.".sentences

// 2. 품사표기
val tagged:Sentence = "분석할 문장입니다".toTagged

// 3. 의존구문분석
val parsed:Sentence = "분석할 문장입니다".toParsed
val parsed2 = tagged.toParsed

// 4. POSTag 확인
tagged.exists(POS.VV)      // 암시적 변환: POSTag --> (Word => Boolean)
tagged.head.exists(POS.VV) // 암시적 변환: POSTag --> (Morpheme => Boolean)

// 5. Set of POSTag
val posSet = Seq(POS.VV, POS.VA, POS.VCP)  //세 태그 중 하나라도 일치하는지 확인하고자 함.
tagged.exists(posSet)      // 암시적 변환: POSTag --> (Word => Boolean)
tagged.head.exists(posSet) // 암시적 변환: POSTag --> (Morpheme => Boolean)

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

morpheme match {
  case Morpheme(surf, pos) if POS.isNoun(pos) =>
  case Morpheme(surf, POS.VV) => ...
  case Morpheme(surf, tag) => ...
}

word match {
  case Word(surf, Morpheme(_, POS.VV), rest @ _*) =>
  case Word(surf, morphemes @ _*) => ...
}

sentence match {
  case Sentence(Word("나는", _), rest @ _*) =>
  case Sentence(words @ _*) => ...
}

License 조항

이 프로젝트 자체(KoalaNLP-core)와 인터페이스 통합을 위한 코드는 v1.8.0부터 MIT License을 따르며, 각 분석기의 License와 저작권은 각 프로젝트에서 지정한 바를 따릅니다. (kr.bydelta.koala.helper 하위에 새로 수정되어 등록된 Class/Object는 각 프로젝트의 결과물을 조금 수정한 판본이며, 저작권은 각 프로젝트에 귀속됩니다.)

결과 비교

Wiki:결과비교를 참조해주세요.