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

org.bitbucket.eunjeon.seunjeon.BasicMorpheme.scala Maven / Gradle / Ivy

The newest version!
package org.bitbucket.eunjeon.seunjeon

import java.io.{IOException, ObjectInputStream, ObjectOutputStream}

import com.typesafe.scalalogging.Logger
import org.bitbucket.eunjeon.seunjeon.MorphemeType.MorphemeType
import org.bitbucket.eunjeon.seunjeon.Pos.Pos
import org.slf4j.LoggerFactory

import scala.collection.mutable


object BasicMorpheme {
  val logger = Logger(LoggerFactory.getLogger(classOf[Morpheme].getName))

  def apply(surface: String,
            leftId: Short,
            rightId: Short,
            cost: Int,
            feature: String,
            mType: MorphemeType,
            poses: mutable.WrappedArray[Pos]) = {
    new BasicMorpheme().
      setSurface(surface).
      setLeftId(leftId).
      setRightId(rightId).
      setCost(cost).
      setFeature(feature).
      setMType(mType).
      setPoses(poses)
  }

  def apply(morpheme: Morpheme): BasicMorpheme = {
    new BasicMorpheme().
      setSurface(morpheme.getSurface).
      setLeftId(morpheme.getLeftId).
      setRightId(morpheme.getRightId).
      setCost(morpheme.getCost).
      setFeature(morpheme.getFeature).
      setMType(morpheme.getMType).
      setPoses(morpheme.getPoses)
  }

  def deComposite(feature7:String): Seq[BasicMorpheme] = {
    try {
      for (feature7 <- feature7.split("[+]")) yield BasicMorpheme.createFromFeature7(feature7)
    } catch {
      case _: Throwable =>
        logger.warn(s"invalid feature7 format : $feature7")
        Seq[BasicMorpheme]()
    }
  }

  /**
    *
    * @param feature7  "은전/NNG/\*"
    */
  def createFromFeature7(feature7: String): BasicMorpheme = {
    val splited = feature7.split("/")

    new BasicMorpheme().
      setSurface(splited(0)).
      setLeftId(-1).
      setRightId(-1).
      setCost(0).
      setFeature(splited(1)).
      setMType(MorphemeType.COMMON).
      setPoses(Array(Pos(splited(1))))

//    MorphemeBasic(
//      splited(0),
//      -1, -1, 0,
//      wrapRefArray(Array[String](splited(1))), // TODO: feature 를 적당히 만들어 주자.
//      MorphemeType.COMMON,
//      wrapRefArray(Array(Pos(splited(1)))))
  }
}

// TODO: sbt publish 할때 사전 빌드해도록 하고 SerialVersionUID 빼자
@SerialVersionUID(1000L)
class BasicMorpheme extends Morpheme with Serializable {
  private var surface: String = _
  private var leftId: Short = _
  private var rightId: Short = _
  private var cost: Int = _
  private var feature: String = _
  private var mType: MorphemeType = _
  private var poses: mutable.WrappedArray[Pos] = _

  private var composite: String = _
  private var featureHead: String = _

  def setSurface(s: String): BasicMorpheme = {
    surface = s
    this
  }

  def setLeftId(id: Short): BasicMorpheme = {
    leftId = id
    this
  }

  def setRightId(id: Short): BasicMorpheme = {
    rightId = id
    this
  }

  def setCost(c: Int): BasicMorpheme = {
    cost = c
    this
  }

  def setFeature(f: String): BasicMorpheme = {
    feature = f
    val splitedFeature = f.split(",")

    composite = if (splitedFeature.length >= 7) splitedFeature(7) else null
    featureHead = if (splitedFeature.nonEmpty) splitedFeature(0) else null
    this
  }

  def setMType(m: MorphemeType): BasicMorpheme = {
    mType = m
    this
  }

  def setPoses(ps: mutable.WrappedArray[Pos]): BasicMorpheme = {
    poses = ps
    this
  }

  override def getSurface: String = surface
  override def getLeftId: Short = leftId
  override def getRightId: Short = rightId
  override def getCost: Int = cost
  override def getFeature: String = feature
  override def getFeatureHead: String = featureHead
  override def getMType: MorphemeType = mType
  override def getPoses: mutable.WrappedArray[Pos] = poses

  override def deComposite(): Seq[Morpheme] = BasicMorpheme.deComposite(composite)

  @throws(classOf[IOException])
  private def writeObject(out: ObjectOutputStream): Unit = {
    out.writeUTF(surface)
    out.writeShort(leftId)
    out.writeShort(rightId)
    out.writeInt(cost)

    out.writeUTF(feature)
    out.writeInt(mType.id)
    out.writeUTF(poses.map(_.id).mkString(","))
  }

  @throws(classOf[IOException])
  private def readObject(in: ObjectInputStream): Unit =  {
    surface = in.readUTF()
    leftId = in.readShort()
    rightId = in.readShort()
    cost = in.readInt()

    feature = in.readUTF()
    mType = MorphemeType(in.readInt())
    poses = wrapRefArray(in.readUTF().split(",").map(id => Pos(id.toInt)))
  }

  override def equals(o: Any) = o match {
    case that: BasicMorpheme => getSurface == that.getSurface && leftId == that.leftId && rightId == that.rightId
    case _ => false
  }

  def key: String = s"$getSurface $leftId $rightId"

  override def hashCode = s"$getSurface $leftId $rightId".hashCode
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy