Подтвердить что ты не робот

Обучение n-граммовому NER со Стэнфордским НЛП

Недавно я пытался тренировать n-граммовые объекты с помощью NLP Stanford Core. Я следил за следующими учебниками - http://nlp.stanford.edu/software/crf-faq.shtml#b

С этим я могу указать только токены unigram и класс, к которому он принадлежит. Может ли кто-нибудь провести меня, чтобы я мог продлить его до n-граммов. Я пытаюсь извлечь известные объекты, такие как имена фильмов из набора данных чата.

Прошу вас посоветовать, если я неправильно интерпретирую учебники Стэнфорда, и то же самое можно использовать для обучения 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

Теперь, когда мне нужно обучать известные объекты (например, имена фильмов), например Халк, Титаник и т.д. в качестве фильмов, с этим подходом было бы легко. Но если мне нужно тренировать , я знаю, что вы делали прошлым летом или Детский день, какой лучший подход?

4b9b3361

Ответ 1

Было долго ждать ответа. Я не смог понять, как это сделать, используя Stanford Core. Однако миссия выполнена. Я использовал библиотеки LLPPL для NLP для того же самого. Просто цитирую ответ здесь, потому что, я думаю, кто-то другой мог бы извлечь из этого выгоду.

Пожалуйста, ознакомьтесь с лицензированием Lingpipe перед тем, как погрузиться в реализацию, если вы разработчик или исследователь или что-то еще.

Lingpipe предоставляет различные методы NER.

1) NER на основе словаря

2) Статистический NER (на основе HMM)

3) NER на основе правил и т.д.

Я использовал Словарь, а также статистические подходы.

Первая - это методика прямого поиска, а вторая - тренировка.

Пример для NER на основе словаря можно найти здесь

Для статистического подхода требуется учебный файл. Я использовал файл со следующим форматом -

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

        }
    }
}

Код любезности: Google:)

Ответ 2

Ответ в основном приведен в вашем цитируемом примере, где "Эмма Вудхаус" - это одно имя. Модели по умолчанию, которые мы поставляем, используют кодирование IO и предполагают, что соседние маркеры одного и того же класса являются частью одного и того же объекта. Во многих случаях это почти всегда верно и упрощает модели. Однако, если вы не хотите этого делать, вы можете обучать модели NER с другими кодировками ярлыков, такими как обычно используемая кодировка IOB, где вы бы вместо этого отметили вещи:

Emma    B-PERSON
Woodhouse    I-PERSON

Затем могут быть представлены смежные маркеры той же категории, но не одна и та же сущность.

Ответ 3

Я столкнулся с такой же проблемой маркировки ngram-фраз для автоматизации домена. Я искал эффективное сопоставление ключевых слов, которое можно использовать для создания учебных файлов на более позднем этапе. Я закончил использование regexNER в конвейере NLP, предоставив файл сопоставления с регулярными выражениями (терминами компонента ngram) и их соответствующей меткой. Обратите внимание, что в этом случае не достигается машинное обучение NER. Надеюсь, эта информация поможет кому-то!