LexiconDict.loadFromIterator의 cost값 인자 위치

Issue #1 closed
Wanhee Lee created an issue

다음 코드에서 cost.toShort 값이 rightId.toShort 다음으로 가야하는 것은 아닌지요?

          case Some(List(surface, cost, leftId, rightId, feature@_ *)) =>
            terms += Morpheme(surface,
              cost.toShort,
              leftId.toShort,
              rightId.toShort,
              wrapRefArray(feature.toArray),
              MorphemeType(feature),
              wrapRefArray(Pos.poses(feature)))

Comments (8)

  1. 영호 유

    mecab-ko-dic 사전 정의에서는 그렇게 되어 있긴한데, 클래스의 멤버변수로 접근하면 되는 것이라 순서와 상관이 없지 않나요? 혹시 문제가 되는 경우가 있을까요?

  2. Wanhee Lee reporter

    사용자 사전에 다음과 같은 데이터를 넣었습니다. 소스의 csv 파일을 읽었을 때 cost값이 -1500입니다.

    나는,-1500,476,3536,VV,*,T,나는,Inflect,VV,EC,/VV/*+는/EC/*
    

    "나는 자동차를 만들었어요." 라는 문장으로 형태소 분석 테스트를 했을 경우 다음과 같은 Exception이 발생합니다.

    [error] (run-main-0) java.lang.ArrayIndexOutOfBoundsException: -1500
    java.lang.ArrayIndexOutOfBoundsException: -1500
            at org.bitbucket.eunjeon.seunjeon.ConnectionCostDict.getCost(ConnectionCostDict.scala:79)
            at org.bitbucket.eunjeon.seunjeon.Lattice.getCost(Lattice.scala:115)
            at org.bitbucket.eunjeon.seunjeon.Lattice.org$bitbucket$eunjeon$seunjeon$Lattice$$updateCost(Lattice.scala:98)
            at org.bitbucket.eunjeon.seunjeon.Lattice$$anonfun$getBestPath$1.apply$mcVI$sp(Lattice.scala:71)
            at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:141)
            at org.bitbucket.eunjeon.seunjeon.Lattice.getBestPath(Lattice.scala:61)
            at org.bitbucket.eunjeon.seunjeon.Tokenizer$$anonfun$1.apply(Tokenizer.scala:33)
            at org.bitbucket.eunjeon.seunjeon.Tokenizer$$anonfun$1.apply(Tokenizer.scala:32)
            at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
            at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
            at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
            at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
            at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
            at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
            at org.bitbucket.eunjeon.seunjeon.Tokenizer.parseText(Tokenizer.scala:32)
            at org.bitbucket.eunjeon.seunjeon.Analyzer$.parse(Analyzer.scala:30)
            at org.bitbucket.eunjeon.seunjeon.Tester$.main(Tester.scala:12)
            at org.bitbucket.eunjeon.seunjeon.Tester.main(Tester.scala)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
    

    cost.toShort의 위치를 바꾸었을 경우 다음과 같이 정확하게 분석합니다.

    LNode(Morpheme(현대자동차,1786,3541,500,WrappedArray(NNP, *, F, 현대자동차, Compound, *, *, 현대/NNP/*+자동/NNG/*+차/NNG/*),COMPOUND,WrappedArray(N)),0,5,-2008)
    LNode(Morpheme(에서,373,315,-1028,WrappedArray(JKB, *, F, 에서, *, *, *, *),COMMON,WrappedArray(J)),5,7,-4161)
    LNode(Morpheme(하늘,1784,3537,1587,WrappedArray(NNG, *, T, 하늘, *, *, *, *),COMMON,WrappedArray(N)),8,10,-4789)
    LNode(Morpheme(을,476,878,1003,WrappedArray(JKO, *, T, 을, *, *, *, *),COMMON,WrappedArray(J)),10,11,-6399)
    LNode(Morpheme(나는,476,3536,-1500,WrappedArray(VV, *, T, 나는, Inflect, VV, EC, 날/VV/*+는/EC/*),INFLECT,WrappedArray(V)),12,14,-4235)
    LNode(Morpheme(자동차,1784,3536,1310,WrappedArray(NNG, *, F, 자동차, Compound, *, *, 자동/NNG/*+차/NNG/*),COMPOUND,WrappedArray(N)),15,18,-5539)
    LNode(Morpheme(를,471,706,406,WrappedArray(JKO, *, T, 를, *, *, *, *),COMMON,WrappedArray(J)),18,19,-7419)
    LNode(Morpheme(만들,2421,3575,1282,WrappedArray(VV, *, T, 만들, *, *, *, *),COMMON,WrappedArray(V)),20,22,-8312)
    LNode(Morpheme(었,5,9,1826,WrappedArray(EP, *, T, 었, *, *, *, *),COMMON,WrappedArray(EP)),22,23,-10517)
    LNode(Morpheme(어요,4,6,1540,WrappedArray(EF, *, F, 어요, *, *, *, *),COMMON,WrappedArray(E)),23,25,-11135)
    LNode(Morpheme(.,1794,3555,3559,WrappedArray(SF, *, *, *, *, *, *, *),COMMON,WrappedArray(S)),25,26,-11614)
    LNode(Morpheme(나,1790,3549,2299,WrappedArray(NP, *, F, 나, *, *, *, *),COMMON,WrappedArray(N)),0,1,-1756)
    LNode(Morpheme(는,590,1920,1043,WrappedArray(JX, *, T, 는, *, *, *, *),COMMON,WrappedArray(J)),1,2,-3685)
    LNode(Morpheme(자동차,1784,3536,1310,WrappedArray(NNG, *, F, 자동차, Compound, *, *, 자동/NNG/*+차/NNG/*),COMPOUND,WrappedArray(N)),3,6,-1663)
    LNode(Morpheme(를,471,706,406,WrappedArray(JKO, *, T, 를, *, *, *, *),COMMON,WrappedArray(J)),6,7,-3543)
    LNode(Morpheme(만들,2421,3575,1282,WrappedArray(VV, *, T, 만들, *, *, *, *),COMMON,WrappedArray(V)),8,10,-4436)
    LNode(Morpheme(었,5,9,1826,WrappedArray(EP, *, T, 었, *, *, *, *),COMMON,WrappedArray(EP)),10,11,-6641)
    LNode(Morpheme(어요,4,6,1540,WrappedArray(EF, *, F, 어요, *, *, *, *),COMMON,WrappedArray(E)),11,13,-7259)
    LNode(Morpheme(.,1794,3555,3559,WrappedArray(SF, *, *, *, *, *, *, *),COMMON,WrappedArray(S)),13,14,-7738)
    
  3. 영호 유

    그렇군요!!!!!!! ㅠㅠ 그동안 버그가 있어도.. 에러가 안나고 적당히 분석이 되는 바람에 몰랐었네요. case 부분의 순서가 잘못되었네요... 조금 더 확인해보고 빠르게 바꾸도록 하겠습니다. 감사합니다. 여유가 되신다면? pull requests를 주셔도 감사하겠습니다.

  4. Wanhee Lee reporter

    일하는 환경이 외부로 파일을 올릴 수 있는 환경이 아니라 퇴근 후에 해보겠습니다.

  5. Wanhee Lee reporter

    사용자 사전도 시스템 사전과 마찬가지로 leftId, rightId, cost 순서로 데이터를 넣어야 하고 Some(List)의 cost 인자 순서도 동일하게 해야 시스템 사전과 사용자 사전을 모두 잘 읽을 수 있는것 같습니다.

    나는,476,3536,-1500,VV,*,T,나는,Inflect,VV,EC,/VV/*+는/EC/*
    
              case Some(List(surface, leftId, rightId, cost, feature@_ *)) =>
                terms += Morpheme(surface,
                  leftId.toShort,
                  rightId.toShort,
                  cost.toShort,
                  wrapRefArray(feature.toArray),
                  MorphemeType(feature),
                  wrapRefArray(Pos.poses(feature)))
    
  6. Log in to comment