LexiconDict.loadFromIterator의 cost값 인자 위치
Issue #1
closed
다음 코드에서 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)
-
-
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)
-
그렇군요!!!!!!! ㅠㅠ 그동안 버그가 있어도.. 에러가 안나고 적당히 분석이 되는 바람에 몰랐었네요. case 부분의 순서가 잘못되었네요... 조금 더 확인해보고 빠르게 바꾸도록 하겠습니다. 감사합니다. 여유가 되신다면? pull requests를 주셔도 감사하겠습니다.
-
reporter 일하는 환경이 외부로 파일을 올릴 수 있는 환경이 아니라 퇴근 후에 해보겠습니다.
-
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)))
-
네. 맞습니다. 그렇게 해야합니다!
-
- changed status to resolved
다음버전에 적용될 예정입니다.
-
- changed status to closed
seunjeon-1.0.1 에 반영되었습니다.
- Log in to comment
mecab-ko-dic 사전 정의에서는 그렇게 되어 있긴한데, 클래스의 멤버변수로 접근하면 되는 것이라 순서와 상관이 없지 않나요? 혹시 문제가 되는 경우가 있을까요?