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

kr.bydelta.koala.traits.CanCompileDict.scala Maven / Gradle / Ivy

The newest version!
package kr.bydelta.koala.traits

import kr.bydelta.koala.POS
import kr.bydelta.koala.POS.POSTag

import scala.collection.JavaConverters._

/**
  * 사용자 사전추가 기능을 위한 Trait.
  */
trait CanCompileDict {
  private[this] val logger = org.log4s.getLogger
  /**
    * 사용자 사전에, (표면형,품사)의 여러 순서쌍을 추가.
    *
    * @param dict 추가할 (표면형,품사)의 순서쌍.
    */
  def addUserDictionary(dict: (String, POSTag)*): Unit

  /**
    * 사용자 사전에, 표면형과 그 품사를 추가.
    *
    * @param morph 표면형.
    * @param tag   품사.
    */
  def addUserDictionary(morph: String, tag: POSTag): Unit = addUserDictionary(morph -> tag)

  /**
    * (Java) 사용자 사전에, (표면형,품사)의 여러 순서쌍을 추가.
    *
    * @param morphs 추가할 단어의 표면형의 목록.
    * @param tags   추가할 단어의 품사의 목록.
    */
  def jUserDictionary(morphs: java.util.List[String], tags: java.util.List[POSTag]): Unit =
  addUserDictionary(morphs.asScala.zip(tags.asScala): _*)

  /**
    * 사용자 사전에 등재된 모든 Item을 불러옵니다.
    *
    * @return (형태소, 통합품사)의 Sequence.
    */
  def items: Set[(String, POSTag)]

  /**
    * 원본 사전에 등재된 항목 중에서, 지정된 형태소의 항목만을 가져옵니다. (복합 품사 결합 형태는 제외)
    *
    * @param filter 가져올 품사인지 판단하는 함수.
    * @return (형태소, 품사)의 Iterator.
    */
  def baseEntriesOf(filter: POSTag => Boolean): Iterator[(String, POSTag)]

  /**
    * 사전에 등재되어 있는지 확인합니다.
    *
    * @param word   확인할 형태소
    * @param posTag 품사들(기본값: NNP 고유명사, NNG 일반명사)
    */
  def contains(word: String, posTag: Set[POSTag] = Set(POS.NNP, POS.NNG)): Boolean = {
    getNotExists(false, posTag.map(word -> _).toSeq: _*).length < posTag.size
  }

  /**
    * 사전에 등재되어 있는지 확인하고, 사전에 없는단어만 반환합니다.
    *
    * @param onlySystemDic 시스템 사전에서만 검색할지 결정합니다.
    * @param word          확인할 (형태소, 품사)들.
    * @return 사전에 없는 단어들.
    */
  def getNotExists(onlySystemDic: Boolean, word: (String, POSTag)*): Seq[(String, POSTag)]

  /**
    * 다른 사전을 참조하여, 선택된 사전에 없는 단어를 사용자사전으로 추가합니다.
    *
    * @param dict       참조할 사전
    * @param filter     추가할 품사를 지정하는 함수.
    * @param fastAppend 선택된 사전에 존재하는지를 검사하지 않고, 빠르게 추가하고자 할 때 (기본값 false)
    */
  def importFrom(dict: CanCompileDict, filter: POSTag => Boolean = POS.isNoun, fastAppend: Boolean = false) {
    val entries = dict.baseEntriesOf(filter)

    logger info s"Start to import dictionary: ${dict.getClass.getPackage} → ${this.getClass.getPackage}"
    val total = entries.sliding(10000, 10000).foldLeft(0) {
      case (count, raw) =>
        val seq = if (fastAppend) raw else getNotExists(true, raw: _*)
        this.addUserDictionary(seq: _*)
        val next = count + seq.length
        logger info s"$next word(s) imported (In Progress)"
        next
    }

    logger info s"Import finished. ($total words)"
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy