19

Niedawno starałem się trenować n-gramowe jednostki z Stanford Core NLP. Skorzystałem z następujących samouczków - http://nlp.stanford.edu/software/crf-faq.shtml#bSzkolenie n-gram NER ze Stanford NLP

Dzięki temu jestem w stanie określić tylko tokeny typu unigram oraz klasę, do której należą. Czy ktokolwiek może mnie poprowadzić, abym mógł go rozszerzyć na n-gramy. Próbuję wyodrębnić znane elementy, takie jak nazwy filmów z zestawu danych czatu.

Proszę, poprowadzę mnie przez przypadek, w którym źle interpretowałem samouczki Stanforda i to samo można wykorzystać w szkoleniu n-gramowym.

Co siedzę ze ma następującą właściwość

#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 

Oto pierwsza kolumna jest słowo (unigram), a druga kolumna jest podmiotem, na przykład

CHAPTER O 
I O 
Emma PERS 
Woodhouse PERS 

Teraz, kiedy trzeba pociągu znanych podmiotów (np. nazwy filmów), takich jak Hulk, Titanic itp., jak filmy, byłoby to łatwe z tego podejścia. Ale na wypadek, gdy muszę trenować Wiem, co zrobiłeś ostatniego lata lub Dzień dziecka na, jakie jest najlepsze podejście?

+0

Drogi @Arun czy udało ci się wyszkolić NER na n-gramy? Chcę kształcić się na takich kierunkach jak: Master in Science: EDUCATION, PhD in Electronics: EDUCATION. Czy możesz mnie prowadzić? Dzięki –

+0

@ KhalidUsman, Dzięki za skontaktowanie się z Tobą. Użyłem LingPipe jak w poniższej odpowiedzi, aby to osiągnąć. Pracował bardzo dobrze z całkiem przyzwoitą ilością danych treningowych. Każdy model będzie działał dobrze tylko w zależności od tego, jak dobry zestaw danych zapewni go do nauki. –

Odpowiedz

20

To było długie oczekiwanie na odpowiedź. Nie byłem w stanie wymyślić, jak to zrobić, używając Stanford Core. Jednak misja zakończona. Użyłem bibliotek LingPipe NLP dla tego samego. Po prostu przytaczam tutaj odpowiedź, ponieważ myślę, że ktoś inny mógłby z niej skorzystać.

Przed rozpoczęciem nurkowania zapoznaj się z Lingpipe licencing, jeśli jesteś programistą lub badaczem.

Lingpipe zapewnia różne metody NER.

1) Słownik Based NER

2) statystyczne NER (HMM Based)

3) Zasada NER oparciu itp

Użyłem Słownika, jak również metod statystycznych.

Pierwsza to metodologia bezpośredniego wyszukiwania, a druga to szkolenie.

Przykładem dla NER słowniku oparta można znaleźć here

statstical podejście wymaga pliku treningowego. Użyłem pliku w następującym formacie -

<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> 

Następnie użyłem następującego kodu do szkolenia jednostek.

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); 
    } 

} 

I przetestować Nerem użyłem następujące klasy

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()); 

     } 
    } 
} 

Courtesy Kod: Google :)

+0

http://tech.groups.yahoo.com/group/LingPipe/message/68 zawiera więcej informacji na temat przygotowania korpusu. –

+0

Próbowałem również tego samego kodu. Czy możesz wspomnieć o tym, jak przygotowałeś zestaw treningowy. Dodałem to jako plik tekstowy i próbowałem dodać własną jednostkę, ale to nie działa ... plz pomóż mi. Nie wiem, czy źle zinterpretowałem o zestawie treningowym – lulu

+0

Znacznik USAir stewardesa w tylnej samolotu podejmowania krótki lot do Charlotte NC, obserwowałem za rogiem miejsce w rzędzie 21, co 9-miesięcznego Danasia Brown śmiać się. – lulu

10

Odpowiedź jest w zasadzie podane w cytowanym przykładzie, gdzie "Emma Woodhouse" jest jedno imię. Domyślne modele, które dostarczamy, używają kodowania IO i zakładają, że sąsiednie tokeny tej samej klasy są częścią tego samego obiektu. W wielu okolicznościach jest to prawie zawsze prawdziwe i sprawia, że ​​modele stają się prostsze. Jednakże, jeśli nie chcesz zrobić, że można trenować modele Ner z innymi kodowania etykiet, takich jak powszechnie stosowane kodowanie IOB, gdzie byś zamiast znakowania rzeczy:

Emma B-PERSON 
Woodhouse I-PERSON 

Następnie sąsiednie znaki takie same kategoria, ale nie ta sama jednostka może być reprezentowana.

+0

Dzięki @Chris, Let ja próbuję stworzyć nowy model z tym formatem kodowania. –

+1

@ChristopherManning Jak włączyć kodowanie IOB w NER? Thx –

+1

Podam dyskusję na temat opcji kodowania IOB w mojej odpowiedzi na to pytanie: http://stackoverflow.com/questions/21469082/how-do-i-use-iob-tags-with-stanford-ner –

1

Stawiałem czoła temu samemu wyzwaniu związanemu z tagowaniem wyrażeń ngram dla domeny automatycznej. Szukałem efektywnego odwzorowania słów kluczowych, które można wykorzystać do tworzenia plików szkoleniowych na późniejszym etapie. Skończyło się na użyciu regexNER w potoku NLP, dostarczając plik odwzorowania z wyrażeniami regularnymi (terminami komponentu ngram) i odpowiadającą im etykietą. Należy zauważyć, że w tym przypadku nie osiągnięto uczenia maszynowego NER. Mam nadzieję, że ta informacja pomaga komuś!

Powiązane problemy