19

최근 스탠포드 코어 NLP를 사용하여 n-gram 엔터티를 교육하려고했습니다. 나는 다음의 튜토리얼을 따라 갔다. - http://nlp.stanford.edu/software/crf-faq.shtml#b스탠포드 NLP를 사용한 n-gram NER 교육

이것으로 나는 unigram 토큰과 그것이 속한 클래스 만 지정할 수있다. 아무도 나를 안내 할 수 없으므로 그것을 n-gram으로 확장 할 수 있습니다. 채팅 데이터 세트에서 영화 이름과 같은 알려진 엔티티를 추출하려고합니다.

스탠포드 자습서를 잘못 해석하고 n-gram 교육에도 사용할 수 있으므로 안내해주십시오.

내가 가진 끼 었어하면 다음과 같은 특성 여기

#structure of your training file; this tells the classifier 
#that the word is in column 0 and the correct answer is in 
#column 1 
map = word=0,answer=1 

최초의 열은 단어 (유니 그램)이고 두 번째 열은 이제

CHAPTER O 
I O 
Emma PERS 
Woodhouse PERS 

예를

을 위해, 그 I 엔티티입니다에게 있습니다 헐크, 타이타닉 등의 알려진 엔티티 (영화 이름)를 교육해야하므로이 방법을 사용하면 쉽습니다. 그러나 내가 훈련 할 필요가있는 경우에 대비하여 나는 지난 여름에 무엇을했는지 알았습니다 또는 아기의 하루가 인 가장 좋은 방법은 무엇입니까?

+0

친애하는 @Arn은 n-gram을 위해 NER를 교육하는 데 성공 했습니까? 나는 과학에서 교육 : 교육, 전자 공학 : 교육에서와 같은 교육을 훈련하고 싶다. 나를 안내 해줄 수 있니? 감사합니다 –

+0

@KhalidUsman, 문의 해 주셔서 감사합니다. 나는 이것을 달성하기 위해 아래와 같이 LingPipe를 사용했다. 꽤 괜찮은 양의 훈련 데이터 세트로 아주 잘 작동했습니다. 모든 모델은 학습 자료를 제공하는 데 얼마나 효과가 있는지에 따라 문제가 없습니다. –

답변

20

답변을 기다리는 데 오래 기다렸습니다. 스탠포드 코어를 사용하여 완성 할 수있는 방법을 찾아 내지 못했습니다. 그러나 임무는 완수되었습니다. 나는 LingPipe NLP 라이브러리를 동일하게 사용했다. 다른 사람이 그 혜택을 볼 수 있기 때문에 여기에 답을 인용하십시오.

개발자 또는 연구원 또는 어떤 경우에 대비하여 다이빙하기 전에 Lingpipe licencing을 확인하십시오.

링 파이프는 다양한 NER 방법을 제공합니다. I는 사전뿐만 아니라 통계 학적 방법을 사용했다 등

1) 사전 기반 NER

2) 통계 NER (HMM 기반)

3) 규칙 기반 NER.

첫 번째는 직접 조회 방식이고 두 번째는 교육 기반입니다.

사전 기반 NER에 대한 예는 here

statstical 접근 방식은 교육 파일을 필요로 찾을 수 있습니다. 다음 형식으로 파일을 사용했습니다. -

<root> 
<s> data line with the <ENAMEX TYPE="myentity">entity1</ENAMEX> to be trained</s> 
... 
<s> with the <ENAMEX TYPE="myentity">entity2</ENAMEX> annotated </s> 
</root> 

다음 엔티티를 교육하는 데 다음 코드를 사용했습니다.

import java.io.File; 
import java.io.IOException; 

import com.aliasi.chunk.CharLmHmmChunker; 
import com.aliasi.corpus.parsers.Muc6ChunkParser; 
import com.aliasi.hmm.HmmCharLmEstimator; 
import com.aliasi.tokenizer.IndoEuropeanTokenizerFactory; 
import com.aliasi.tokenizer.TokenizerFactory; 
import com.aliasi.util.AbstractExternalizable; 

@SuppressWarnings("deprecation") 
public class TrainEntities { 

    static final int MAX_N_GRAM = 50; 
    static final int NUM_CHARS = 300; 
    static final double LM_INTERPOLATION = MAX_N_GRAM; // default behavior 

    public static void main(String[] args) throws IOException { 
     File corpusFile = new File("inputfile.txt");// my annotated file 
     File modelFile = new File("outputmodelfile.model"); 

     System.out.println("Setting up Chunker Estimator"); 
     TokenizerFactory factory 
      = IndoEuropeanTokenizerFactory.INSTANCE; 
     HmmCharLmEstimator hmmEstimator 
      = new HmmCharLmEstimator(MAX_N_GRAM,NUM_CHARS,LM_INTERPOLATION); 
     CharLmHmmChunker chunkerEstimator 
      = new CharLmHmmChunker(factory,hmmEstimator); 

     System.out.println("Setting up Data Parser"); 
     Muc6ChunkParser parser = new Muc6ChunkParser(); 
     parser.setHandler(chunkerEstimator); 

     System.out.println("Training with Data from File=" + corpusFile); 
     parser.parse(corpusFile); 

     System.out.println("Compiling and Writing Model to File=" + modelFile); 
     AbstractExternalizable.compileTo(chunkerEstimator,modelFile); 
    } 

} 

그리고 난 다음 클래스를 사용하는 NER을 테스트

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.Set; 

import com.aliasi.chunk.Chunk; 
import com.aliasi.chunk.Chunker; 
import com.aliasi.chunk.Chunking; 
import com.aliasi.util.AbstractExternalizable; 

public class Recognition { 
    public static void main(String[] args) throws Exception { 
     File modelFile = new File("outputmodelfile.model"); 
     Chunker chunker = (Chunker) AbstractExternalizable 
       .readObject(modelFile); 
     String testString="my test string"; 
      Chunking chunking = chunker.chunk(testString); 
      Set<Chunk> test = chunking.chunkSet(); 
      for (Chunk c : test) { 
       System.out.println(testString + " : " 
         + testString.substring(c.start(), c.end()) + " >> " 
         + c.type()); 

     } 
    } 
} 

코드 의례 : 대답은 기본적 인용 예에 제시되어있다 구글 :)

+0

http://tech.groups.yahoo.com/group/LingPipe/message/68에서 자료 준비에 대한 자세한 정보를 제공합니다. –

+0

나는 또한 동일한 코드를 시도했다. 당신은 어떻게 훈련 세트를 준비했는지 언급 할 수 있습니까? 나는 이것을 텍스트 파일로 추가하고 나 자신의 엔티티를 추가하려했으나 작동하지 않습니다 ... plz help me. 훈련 세트에 대해 잘못 해석했는지 모르겠습니다. – lulu

+0

샬럿,에 짧은 비행을 평면의이면 에 USAir 승무원 NC, 행 21에 자리 잡은 구석을 엿 보면서 9 개월 된 Danasia 갈색 웃음을 짓고 있습니다. – lulu

10

은 "엠마 우드 하우스가" 하나의 이름. 우리가 제공하는 기본 모델은 IO 인코딩을 사용하고 같은 클래스의 인접한 토큰이 동일한 엔티티의 일부라고 가정합니다. 많은 경우에, 이것은 거의 항상 사실이며, 모델을 더 간단하게 유지합니다. 그러나, 당신은 당신이 대신 일을 레이블 것입니다 일반적으로 사용되는 IOB 인코딩 같은 다른 레이블 인코딩과 NER 모델을 훈련 할 수 그렇게하지 않으려면 : 그런 다음 같은 인접한 토큰을

Emma B-PERSON 
Woodhouse I-PERSON 

을 카테고리가 아니라 동일한 엔티티가 표현 될 수 있습니다.

+0

감사합니다. 이 인코딩 형식으로 새 모델을 만들려고합니다. –

+1

@ChristopherManning NER에서 IOB 인코딩을 사용하려면 어떻게해야합니까? Thx –

+1

이 질문에 대한 대답은 IOB 인코딩 옵션에 대한 설명을 제공합니다. http://stackoverflow.com/questions/21469082/how-do-i-use-iob-tags-with-stanford-ner –

1

나는 자동화 도메인 용 ngram 구문에 태그를 지정하는 것과 동일한 과제에 직면했습니다. 이후 단계에서 교육 파일을 만드는 데 사용할 수있는 효율적인 키워드 매핑을 찾고있었습니다. 결국 NLP 파이프 라인에서 regexNER를 사용하여 정규 표현식 (ngram 구성 요소 용어)과 해당 레이블을 사용하여 매핑 파일을 제공했습니다. 이 경우에는 NER 기계 학습이 이루어지지 않습니다. 희망이 정보는 누군가를 도와줍니다!

관련 문제