2017-11-25 20 views
2

결국 OpenNLP가 내 프로젝트에 통합되어 15k 줄의 교육 데이터에서 모델을 성공적으로 교육하고 저장하고로드 할 수 있습니다. 내 프로그램의 엔티티를 인식하는 데 사용하고 싶습니다!커스텀 OpenNLP 이름 찾기는 교육 세트의 데이터를 인식하지만 테스트 세트는 아닙니다.

내 훈련 데이터가이 같은 모습, 그래서 해시 태그를 인식하는 데 사용하고 있습니다 : 내가 직접하지 않은 문장을 전달되면 모델이 어떤 해시 태그를 인식 할 수없는 것을 발견하고

... 
    Jim , I know you to be a fighter <START:HASHTAG> #usmarine <END> @ USMC Kira has your strength & amp ; ours @ t1r1u1t1h R love 2 U , Kira & amp ; 
    What has changed that people from your JAMAT are insulting Hindu GODS and GODDESSES . Calling our Religion names ... . 
    Ibtihaj represented the United States of America at the Olympics and brought home a medal , elevating the status of 
    A story point is a metric used in agile project management and development to determine (or estimate) the difficul 
    I 'm not shy or quiet , I just do n't find your mind appealing in any way shape or form and I 'm not gon na force a conv 
    <START:HASHTAG> #paradisepapers <END> , Canadian Taxpayers Federation (CTF) & amp ; tax reform `` CTF has not uttered even a single shocked-and-a 
    ... 

을 같은 내 훈련 세트에 :

String paragraph = "Take a shot for #harambe he took one for you!"; 

내가 확인에도 불구하고,이 예에서 해시 태그를 인식 할 수 없습니다 내 훈련 데이터에서 사용되는 #harambe의 인스턴스가있다. 그러나

, 나는 훈련 데이터로부터 문장을 직접 전달하는 경우 :

String nameParagraph = "Idk whats funnier the #harambe or the fact that Im the only one who will see my page https : t.co/2eWjm6mOon "; 

가 제대로 해시 태그로 식별하여 #harambe을 인식 할 수있을 것이다.

내 모델이 모든 해시 태그를 인식하기를 원하기 때문에 #harambe 해시 태그의 인스턴스를 더 많이 공급하여 단일 해시 태그를 인식 할 수 있기를 바랍니다.

내 모델이 교육 집합에 포함되지 않은 새로운 엔티티를 올바르게 식별 할 수 있도록하는 방법에 대한 조언이 있습니까? 미리 감사드립니다!

+1

일반 표현식을 사용하여 해시 태그를 식별 할 수없는 이유가 있습니까? – jbird

+0

그래서이 코드를 뭔가 "간단한 테스트"로 사용하여 정규식이 쉽게 찾을 수없는 여러 종류의 엔티티를 인식하는 데 사용할 계획입니다. –

+0

사용자 정의 생성기를 생성하여 각 "#"에서 트리거 할 수는 있지만 사용하는 방법이 어떨지 모르겠습니다. 어쨌든 해시 태그는 패턴을 따르므로 가능한 경우 정규 표현식을 사용합니다. – jbird

답변

0

결정 성있는 문제를 통계적으로 모델링하려는 이유가 확실하지 않습니다. jbird7 당신은 또한 수, 정규식을 사용하여 언급 :

을 문자열의 첫 번째 문자보고 문자열의 배열을 통해 WhitespaceTokenizer

으로 반복을 사용하여 텍스트 토큰 화 (그것은 #입니다).

\\ create a Tokenizer 
Tokenizer tokenizer=WhitespaceTokenizer.INSTANCE 
String[] tokens = tokenizer.tokenize(text) 

\\ use old-style loop for span creation 
List<Span> spans = new ArrayList<Span>() 
for (int i=0;i<tokens.length;i++){ 
    if (token.charAt(0) == '#') spans.add(new Span(i,i+1,"HashTag")) 
} 
Span[] foundTags = spans.toArray(new Span[spans.size]) 

이 시점에서 HashTagNameFinder와 완전히 동일한 출력이 있어야합니다. 구문 오류가 있으면 죄송합니다. 이 코드는 여러분이하고 싶은 것에 대한 아이디어를 제공해야합니다.

+0

네 말이 맞아. 위에서 언급 한 jbird7처럼 정규 표현식이 완벽하게 작동합니다. 모델이 간단한 개체를 인식 할 수 있는지 확인하기 위해 해시 태그를 "첫 번째 테스트"로 사용하고 있음을 나타내야합니다. 정규 표현식에서 식별 할 수없는 다른 엔티티 (예 : 하이킹, 드로잉, 축구)를 인식하기 위해이를 사용하려고합니다. 그러나 정규식에 관한 조언을 주셔서 감사합니다, 나는 그 개념을 결정적 엔티티를 인식하도록 할 것입니다. –

+0

그렇다면 훈련 된 모델이 #harambe를 찾지 못한 이유는 아직 충분한 교육 데이터가 없기 때문일 것입니다.분류기는 단어, 이전 두 단어, 이전 단어와 이전 단어가 대문자인지 여부와 같은 기능을 사용합니다. 따라서 분류자를 훈련시키는 데는 몇 가지 예가 필요합니다. 작성한 예제의 경우 현재 단어의 첫 번째 문자가 해시 태그인지 확인하는 기능을 추가하십시오. 이 기능은 매우 강력하므로 몇 가지 예제만으로 알맞은 분류기를 만들 수 있습니다. – HowYaDoing

+0

맞춤 기능을 만들려면 https://opennlp.apache.org/docs/1.8.0/manual/opennlp.html#tools.namefind.training.featuregen을 참조하십시오. – HowYaDoing