2014-06-24 4 views
1

우리 자신의 모델을 작성openNLP

./opennlp TokenNameFinder en-ner-person.bin "input.txt" "output.txt" 

거 야 내가 인쇄해야하도록 자신의 모델을 쓰고 싶어하지만 경우 output.txt에 인쇄 된 사람의 이름을 가져 내 자신의 엔티티.

예.

  1. icm2500의 위험 값은 무엇입니까?
  2. prd_234 배달이 늦게 도착합니다.
  3. 왓슨이 router_34를 (를) 처리 중입니다.

이 줄을 넘으면 product_entities를 구문 분석하고 추출해야합니다. icm2500, prd_234, router_34 ... etc 이것들은 모두 제품입니다 (이 정보를 파일에 저장할 수 있으며 모델 또는 openNLP를 조회 할 때 사용할 수 있습니다).

아무도 전화를 내게 어떻게 할 수 있습니까?

답변

2

opennlp 형식의 일부 문장에 주석을 달아 자신의 모델을 학습해야합니다.

what is the risk value on <START:product> icm2500 <END>. 
Delivery of <START:product> prd_234 <END> will be arrived late. 
Watson is handling <START:product> router_34 <END>. 

각 문장 개행 문자로 끝나고 문장에 줄 바꿈이있는 경우 어떻게 든 탈출해야합니다 : 예문 위해 당신은 형식은 다음과 같을 것이다 기록했다. 당신이 당신의 데이터에서이 같은 파일을 일단 는, 당신은 지금 당신이 NameFinder에서와 모델을 사용할 수 있습니다이

public static void main(String[] args){ 

Charset charset = Charset.forName("UTF-8"); 
ObjectStream<String> lineStream = 
     new PlainTextByLineStream(new FileInputStream("your file in the above format"), charset); 
ObjectStream<NameSample> sampleStream = new NameSampleDataStream(lineStream); 

TokenNameFinderModel model; 

try { 
    model = NameFinderME.train("en", "person", sampleStream, TrainingParameters.defaultParams(), 
      null, Collections.<String, Object>emptyMap()); 
} 
finally { 
    sampleStream.close(); 
} 

try { 
    modelOut = new BufferedOutputStream(new FileOutputStream(modelFile)); 
    model.serialize(modelOut); 
} finally { 
    if (modelOut != null) 
    modelOut.close();  
} 

} 

같은 모델을 훈련하는 자바 API를 사용할 수 있습니다.

제품 이름의 명확하고 가능한 짧은 목록이있을 수 있으므로 간단한 정규식 접근 방법을 고려해보십시오. 여기

는 NameFinder에서 조금을 커버 opennlp 워드 프로세서입니다 :

http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.namefind.training.tool 
+0

난 당신이 내가 내 자신의 모델을 생성하고 코드 HTTPS에 대한 입력으로 "위치 icm2500는"이 문자열을 통과 의미 말을했다 : //gist.github.com/johnmiedema/7e7330e1b9263267bdfc 내 자신의 moded를 사용하지만 작동하지 않았다 .. 그리고 나는 정규식 접근법에 대해서도 모른다 ?? – user3322698