All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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