2017-09-21 3 views
1

classification을 사용하는 SVMLight 입력 형식의 MalletNaiveBayes 분류 자로 사용하고 있습니다. 하지만 NumberFormatException이 표시됩니다. SVMLight를 사용할 때 문자열 기능을 어떻게 사용할 수 있는지 궁금합니다. 가이드 라인 1에서 읽은대로 기능을 문자열로 지정할 수도 있습니다.말렛의 올바른 svmlight 입력 형식은 무엇입니까?

내 코드 또는 입력에 문제가있는 사람을 도와 줄 수 있습니까? 여기

내 코드입니다 :

public void trainMalletNaiveBayes() throws Exception { 

     ArrayList<Pipe> pipes = new ArrayList<Pipe>(); 
     pipes.add(new SvmLight2FeatureVectorAndLabel()); 
     pipes.add(new PrintInputAndTarget()); 

     SerialPipes pipe = new SerialPipes(pipes); 

     //prepare training instances 
     InstanceList trainingInstanceList = new InstanceList(pipe); 

     trainingInstanceList.addThruPipe(new CsvIterator(new FileReader("/tmp/featureFiles_svm.csv"), "^(\\S*)[\\s,]*(.*)$", 2, 1, -1)); 

     //prepare test instances 
     InstanceList testingInstanceList = new InstanceList(pipe); 
     testingInstanceList.addThruPipe(new CsvIterator(new FileReader("/tmp/test_set.csv"), "^(\\S*)[\\s,]*(.*)$", 2, 1, -1)); 

     ClassifierTrainer trainer = new NaiveBayesTrainer(); 
     Classifier classifier = trainer.train(trainingInstanceList); 

그리고 여기 내 입력 파일의 처음 세 줄입니다 :

No f1:NP f2:NN f3:1 f4:1 f5:0 f6:0 f7:0 f8:0.0 f9:1 f10:true f11:false f12:false f13:false f14:false f15:ROOT f16:NN f17:NOTHING 
No f1:NP f2:NN f3:8 f4:4 f5:0 f6:0 f7:1 f8:4.127134385045092 f9:8 f10:true f11:false f12:false f13:false f14:false f15:ROOT f16:DT f17:NOTHING 
Yes f1:NP f2:NN f3:4 f4:3 f5:0 f6:0 f7:0 f8:0.0 f9:4 f10:true f11:false f12:false f13:false f14:false f15:NP f16:DT f17:NN 

첫 번째 열은 데이터의 나머지가 인스턴스의 레이블이며, 기능 및 해당 값을 포함합니다. 예를 들어, NN은 문구의 선두 단어의 POS을 보여줍니다.

그동안 NN (NumberFormatException: For input string: "NN") 예외가 발생합니다. 나는 그 전에 오는 NP에 어떤 문제가 없는지 궁금하지만, NN에서 멈춘다.

답변

1

모든 기능에는 숫자 값이 필요합니다. 불리언 값의 경우 true = 1과 false = 0을 사용할 수 있습니다. f1 : NP를 f1_NP = 1로 수정해야합니다.

NP에서 죽어 가지 않는 이유는 SvmLight2FeatureVectorAndLabel 클래스가 전체 행 (레이블 및 데이터)을 구문 분석하려고하지만 코드가 첫 번째 요소를 레이블로 분리하는 CsvIterator으로 파일을 읽는 것입니다 .

classify.tui.SvmLight2Vectors 클래스는 반복자이 코드를 사용하여 답장을 보내

new SelectiveFileLineIterator (fileReader, "^\\s*#.+") 
+0

감사합니다. 그리고 라인에 0 값이있는 다른 모든 기능을 추가해야합니까? 예를 들어 피처에 NP 값이있는 경우 VP, S, FRAG 등이 아니라는 의미입니다. f2_VP : 0, f3_S : 0 등을 추가해야합니까? 내 분류를 변환해야합니까? 숫자 기능에 대한 기능? 그러면, 나는 정말로 드문 드문 한 특징 벡터를 갖게 될 것입니다. 권리? – user1419243

+0

카테고리를 기능으로 변환하고 0 값을 가진 것을 제외하고 효율적으로 처리합니다. –

+0

감사합니다. 이제 오류없이 작동합니다 :) 위의 형식과 작성된 코드를 사용하여 또 다른 질문을합니다. 이름은 다음과 같습니다. csvline : 1 대상 : f1_NP : 1 입력 : f2 (0) = 0.0 f3 (1) = 0.0 f4 (2) = 2.65 ... 내 타겟을 올바르게 읽고 타겟으로 사용하지 않는 것 같습니다. 내 코드 또는 입력 형식이 어딘가 잘못되었거나 PrintInputAndTarget()이 SVMLight에서 작동하지 않고 다른 형식으로 만 사용됩니까? – user1419243

관련 문제