2013-07-31 5 views
3

엔티티 추출과 같습니다. 이름은입니다. 사용하는 문서는 OpenNLP Java API입니다. 적절한 이름을 추출하지 않습니다. 내가 여기OpenNLP를 사용하여 맞춤 모델을 만드는 방법은 무엇입니까?

opennlp sourceforge link에 가능한 모델을 사용하고하는 것은 내가 뭘하려고 오전

public class tikaOpenIntro { 

    public static void main(String[] args) throws IOException, SAXException, 
      TikaException { 

     tikaOpenIntro toi = new tikaOpenIntro(); 
     toi.filest(""); 
     String cnt = toi.contentEx(); 
     toi.sentenceD(cnt); 
     toi.tokenization(cnt); 

     String names = toi.namefind(toi.Tokens); 
     toi.files(names); 

    } 

    public String Tokens[]; 

    public String contentEx() throws IOException, SAXException, TikaException { 
     InputStream is = new BufferedInputStream(new FileInputStream(new File(
       "/home/rahul/Downloads/rahul.pdf"))); 
     // URL url=new URL("http://in.linkedin.com/in/rahulkulhari"); 
     // InputStream is=url.openStream(); 
     Parser ps = new AutoDetectParser(); // for detect parser related to 

     BodyContentHandler bch = new BodyContentHandler(); 

     ps.parse(is, bch, new Metadata(), new ParseContext()); 

     return bch.toString(); 

    } 

    public void files(String st) throws IOException { 
     FileWriter fw = new FileWriter("/home/rahul/Documents/extrdata.txt", 
       true); 
     BufferedWriter bufferWritter = new BufferedWriter(fw); 
     bufferWritter.write(st + "\n"); 
     bufferWritter.close(); 
    } 

    public void filest(String st) throws IOException { 
     FileWriter fw = new FileWriter("/home/rahul/Documents/extrdata.txt", 
       false); 

     BufferedWriter bufferWritter = new BufferedWriter(fw); 
     bufferWritter.write(st); 
     bufferWritter.close(); 
    } 

    public String namefind(String cnt[]) { 
     InputStream is; 
     TokenNameFinderModel tnf; 
     NameFinderME nf; 
     String sd = ""; 
     try { 
      is = new FileInputStream(
        "/home/rahul/opennlp/model/en-ner-person.bin"); 
      tnf = new TokenNameFinderModel(is); 
      nf = new NameFinderME(tnf); 

      Span sp[] = nf.find(cnt); 

      String a[] = Span.spansToStrings(sp, cnt); 
      StringBuilder fd = new StringBuilder(); 
      int l = a.length; 

      for (int j = 0; j < l; j++) { 
       fd = fd.append(a[j] + "\n"); 

      } 
      sd = fd.toString(); 

     } catch (FileNotFoundException e) { 

      e.printStackTrace(); 
     } catch (InvalidFormatException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 
     return sd; 
    } 


    public void sentenceD(String content) { 
     String cnt[] = null; 
     InputStream om; 
     SentenceModel sm; 
     SentenceDetectorME sdm; 
     try { 
      om = new FileInputStream("/home/rahul/opennlp/model/en-sent.bin"); 
      sm = new SentenceModel(om); 
      sdm = new SentenceDetectorME(sm); 
      cnt = sdm.sentDetect(content); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    public void tokenization(String tokens) { 

     InputStream is; 
     TokenizerModel tm; 

     try { 
      is = new FileInputStream("/home/rahul/opennlp/model/en-token.bin"); 
      tm = new TokenizerModel(is); 
      Tokenizer tz = new TokenizerME(tm); 
      Tokens = tz.tokenize(tokens); 
      // System.out.println(Tokens[1]); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

코드 - 자바의 조각 것은입니다 : 내가 PDF로 변환 아파치 티카을 사용하고

  • 문서를 일반 텍스트 문서로 변환합니다.
  • 문장 경계 검출 에 대한 일반 텍스트 문서를 전달 중입니다. 이 이름 엔티티 추출

하지만 이름과 다른 단어를 추출 후이 토큰

  • . 적절한 이름을 추출하지 않습니다.수영, 프로그래밍 등의 문서에서 기술을 추출하는 맞춤 모델을 만드는 방법은 무엇입니까?

    몇 가지 아이디어를주세요.

    어떤 도움을 주시면 대단히 감사하겠습니다!?

  • +0

    이 문제를 해결 했습니까? – vashishth

    답변

    0

    당신이 할 수있는 한 가지 방법은 문서에 나타날 수있는 알려진 올바른 이름 목록을 유지하는 것입니다. 이것은 기술에 대한 좋은 방법이기도합니다. 명명 된 엔티티를 인식하면 목록에 표시되는지 확인해야합니다.

    다른 방법은 OpenNLP보다 우수한 작업을 수행하는 명명 된 엔티티를 추출하는 자체 구성 요소를 작성하는 것이지만 훨씬 어려울 수 있습니다.

    3

    OpenNLP 용 사전 빌드 된 모델의 성능에 만족하지 않는 것 같습니다. 그러나 (a) 모델은 절대로 완벽하지 않으며, 심지어 가장 좋은 모델이라도 놓쳐 버려야 할 것들을 놓치고 잡아야한다. (b) 모델이 훈련 된 문서가 장르 및 텍스트 스타일로 태그하려는 문서와 일치하면 모델이 가장 잘 수행됩니다 (대용량 혼합 텍스트에 대해 교육 된 모델은 모든 모델에서 잘 작동하지 않습니다) 대문자 텍스트 및 뉴스 기사에 대해 교육받은 모델은 트윗에서 잘 작동하지 않습니다. Stanford NE 툴킷 또는 LingPipe와 같은 공개적으로 사용 가능한 다른 도구를 사용해 볼 수도 있습니다. 그들은 더 잘 수행 할 수있는 모델을 가지고 있습니다. 그러나 그들 중 누구도 완벽 할 수는 없습니다.

    맞춤 모델을 만들려면 몇 가지 교육 데이터를 만들어야합니다.OpenNLP의 경우, 다음과 같을 것입니다.

    I have a Ph.D. in <START:skill> operations research <END> 
    

    이와 같은 특정 사항은 사용자가 직접 작성해야합니다. 그리고 당신은 그것을 많이 필요로합니다. OpenNLP 문서는 약 15,000 개의 예문을 권장합니다. 자세한 내용은 OpenNLP 문서를 참조하십시오.

    +0

    15,000 문장을 얻었 으면 어떻게 모델로 변환합니까? –

    +1

    http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.namefind.training –

    +0

    @SamBayer : 50K 문장으로 맞춤 모델을 학습했습니다. 나는 그 문장들에 주석을 달았다. 이 모델을 테스트하는 동안 엔터티로 전체 입력 문자열을 반환합니다. 당신은 가이드가 될 수 있습니까? –

    1

    이 게시물 그것은, 파일이 문장의 파일을 먹일 "모델 빌더 - 부가 기능"

    라는 아주 새로운 OpenNLP의 부가 기능을 사용하여 모델을 생성하는 방법을 보여줍니다

    OpenNLP: foreign names does not get recognized

    도움이 될 이름을 알고 모델을 어디에 넣을 지 알려줍니다. HTH