web-dev-qa-db-ja.com

スタンフォードNLPによるn-gramNERのトレーニング

最近、Stanford CoreNLPを使用してn-gramエンティティをトレーニングしようとしています。私は次のチュートリアルに従いました- http://nlp.stanford.edu/software/crf-faq.shtml#b

これにより、ユニグラムトークンとそれが属するクラスのみを指定できます。私がそれを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

ここで、最初の列は単語(ユニグラム)で、2番目の列はエンティティです。

CHAPTER O
I   O
Emma    PERS
Woodhouse   PERS

ハルクタイタニックなどの既知のエンティティ(映画名など)を映画としてトレーニングする必要があるので、次のように簡単にできます。このアプローチ。しかし、私が訓練する必要がある場合あなたが去年の夏に何をしたか知っていますまたは赤ちゃんの日、最良のアプローチは何ですか?

21
Arun A K

ここで答えを待つのは長い間でした。私はスタンフォードコアを使用してそれを成し遂げる方法を理解することができませんでした。しかし、任務は達成されました。私は同じためにLingPipeNLPライブラリを使用しました。ここで答えを引用するだけです。なぜなら、他の誰かがそれから利益を得ることができると思うからです。

開発者や研究者などの場合に備えて、実装に飛び込む前に Lingpipe licencing を確認してください。

Lingpipeは、さまざまなNERメソッドを提供します。

1)辞書ベースのNER

2)統計NER(HMMベース)

3)ルールベースのNERなど。

私は辞書と統計的アプローチを使用しました。

1つ目は直接検索の方法論で、2つ目はトレーニングベースです。

辞書ベースの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());

        }
    }
}

コード提供:グーグル:)

26
Arun A K

答えは基本的にあなたの引用された例で与えられます、そこでは「エマウッドハウス」は単一の名前です。私たちが提供するデフォルトのモデルはIOエンコーディングを使用し、同じクラスの隣接するトークンが同じエンティティの一部であると想定しています。多くの場合、これはほとんどの場合当てはまり、モデルをよりシンプルに保ちます。ただし、それを望まない場合は、一般的に使用されるIOBエンコーディングなど、他のラベルエンコーディングを使用してNERモデルをトレーニングできます。代わりに、次のラベルを付けます。

Emma    B-PERSON
Woodhouse    I-PERSON

次に、同じカテゴリであるが同じエンティティではない隣接するトークンを表すことができます。

14

自動ドメインのngramフレーズにタグを付けるという同じ課題に直面しました。後の段階でトレーニングファイルを作成するために使用できる、効率的なキーワードマッピングを探していました。正規表現(ngramコンポーネント用語)とそれに対応するラベルを含むマッピングファイルを提供することにより、NLPパイプラインでregexNERを使用することになりました。この場合、NER機械学習は達成されないことに注意してください。この情報が誰かに役立つことを願っています!

2
Neethu Prem