main.kr.bydelta.koala.eunjeon.proc.kt Maven / Gradle / Ivy
@file:JvmName("Util")
@file:JvmMultifileClass
package kr.bydelta.koala.eunjeon
import kr.bydelta.koala.POS
import kr.bydelta.koala.data.Morpheme
import kr.bydelta.koala.data.Sentence
import kr.bydelta.koala.data.Word
import kr.bydelta.koala.proc.CanTagOnlyASentence
import org.bitbucket.eunjeon.seunjeon.Eojeol
import org.bitbucket.eunjeon.seunjeon.Eojeoler
import org.bitbucket.eunjeon.seunjeon.Tokenizer
/**
* 은전한닢 형태소분석기의 KoalaNLP Wrapper입니다.
*
* ## 참고
* **형태소**는 의미를 가지는 요소로서는 더 이상 분석할 수 없는 가장 작은 말의 단위로 정의됩니다.
*
* **형태소 분석**은 문장을 형태소의 단위로 나누는 작업을 의미합니다.
* 예) '문장을 형태소로 나눠봅시다'의 경우,
* * 문장/일반명사, -을/조사,
* * 형태소/일반명사, -로/조사,
* * 나누-(다)/동사, -어-/어미, 보-(다)/동사, -ㅂ시다/어미
* 로 대략 나눌 수 있습니다.
*
* 아래를 참고해보세요.
* * [Morpheme] 형태소를 저장하는 클래스입니다.
* * [POS] 형태소의 분류를 담은 Enum class
*
* ## 사용법 예제
*
* ### Kotlin
* ```kotlin
* val tagger = Tagger()
* val sentence = tagger.tagSentence("문장 1개입니다.")
* val sentences = tagger.tag("문장들입니다. 결과는 목록이 됩니다.")
* // 또는
* val sentences = tagger("문장들입니다. 결과는 목록이 됩니다.")
* ```
*
* ### Scala + [koalanlp-scala](https://koalanlp.github.io/scala-support/)
* ```scala
* import kr.bydelta.koala.Implicits._
* val tagger = new Tagger()
* val sentence = tagger.tagSentence("문장 1개입니다.")
* val sentences = tagger.tag("문장들입니다. 결과는 목록이 됩니다.")
* // 또는
* val sentences = tagger("문장들입니다. 결과는 목록이 됩니다.")
* ```
*
* ### Java
* ```java
* Tagger tagger = new Tagger()
* Sentence sentence = tagger.tagSentence("문장 1개입니다.")
* List sentences = tagger.tag("문장들입니다. 결과는 목록이 됩니다.")
* // 또는
* List sentences = tagger.invoke("문장들입니다. 결과는 목록이 됩니다.")
* ```
*
* @since 1.x
*/
class Tagger : CanTagOnlyASentence>() {
/**
* 은전한닢의 내장 Tokenizer.
*
* @since 1.x
*/
val tokenizer: Tokenizer by lazy {
val tok = Tokenizer(Dictionary.lexiconDict, Dictionary.connectionCostDict, Dictionary.needCompress)
if (Dictionary.isNotEmpty()) {
Dictionary.reloadDic()
tok.setUserDict(Dictionary.userDict)
}
tok
}
/**
* 변환되지않은, [text]의 분석결과 List를 반환합니다.
*
* @since 1.x
* @param text 분석할 String.
* @return 원본 분석기의 결과인 문장 1개
*/
override fun tagSentenceOriginal(text: String): List {
return Eojeoler.build(tokenizer.parseText(text, false)).asJava().flatMap {
it.eojeols().asJava()
}
}
/**
* List 타입의 분석결과 [result]를 변환, [Sentence]를 구성합니다.
*
* @since 1.x
* @param text 품사분석을 수행한 문단의 String입니다.
* @param result 변환할 분석결과.
* @return 변환된 [Sentence] 객체
*/
override fun convertSentence(text: String, result: List): Sentence =
Sentence(
result.map { eojeol ->
Word(
eojeol.surface(),
eojeol.nodesJava().flatMap { Dictionary.convertMorpheme(it.morpheme()) }
)
}
)
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy