2017-10-11 7 views
0

私は名前付きエンティティ抽出のために事前計算されたMITIEモデルを使用しています。とにかく、あらかじめ訓練されたモデルを使用するのではなく、彼らの実際のモデルを見ることができますか?モデルはオープンソースとして利用可能ですか?物事を設定MITIE nerモデル

答えて

1

:手始めに

を、あなたは が total_word_feature_extractor.dat と呼ばれるファイル内の巨大なダンプからの注釈付きテキストのコーパスを含むEnglish Language Modelをダウンロードすることができます。

その後、 GitからMITIE-Master Projectをダウンロード/複製してください。

Windows OSを実行している場合は、CMakeをダウンロードしてください。

x64ベースのWindows OSを実行している場合は、Visual Studio 2015 Community EditionをC++コンパイラ用にインストールします。

上記をダウンロードした後、すべてをフォルダに展開します。

スタートからVS 2015> [すべてのアプリ]> [Visual Studio用

The project structure will look something like this

オープンデベロッパーのコマンドプロンプト、およびツールのフォルダに移動し、あなたが内部の5つのサブフォルダが表示されます。

enter image description here

次のステップでは、Visual Studioデベロッパーコマンドプロンプトでコマンドを次のようにCMakeを使用することにより、ner_conll、ner_stream、train_freebase_relation_detectorとwordrepパッケージを構築することです。

このような何か:ner_conllについては

enter image description here

:については

cd "C:\Users\xyz\Documents\MITIE-master\tools\ner_conll" 

i)がmkdir build II)cd build III)cmake -G "Visual Studio 14 2015 Win64" .. IV)cmake --build . --config Release --target install

ner_stream:train_freebase_relation_detectorについて

cd "C:\Users\xyz\Documents\MITIE-master\tools\ner_stream" 

i)はmkdir build II)cd build III)cmake -G "Visual Studio 14 2015 Win64" .. IV)cmake --build . --config Release --target install

cd "C:\Users\xyz\Documents\MITIE-master\tools\train_freebase_relation_detector" 

i)はmkdir build II)cd build III)cmake -G "Visual Studio 14 2015 Win64" .. IV)wordrepについてはcmake --build . --config Release --target install

を:

cd "C:\Users\xyz\Documents\MITIE-master\tools\wordrep" 

i)はmkdir build II)cd build III)cmake -G "Visual Studio 14 2015 Win64" .. IV)cmake --build . --config Release --target install

あなたがそれらを構築した後、あなたは、いくつかの150-160の警告を取得します、心配しないでください。今

、手動でテキストに注釈を付けるためのVisual Studioのコードを使用して、このような何かJSONファイル「data.json」を作る"C:\Users\xyz\Documents\MITIE-master\examples\cpp\train_ner"

に移動します。あなたがより多くの発話や注釈を追加することができます

{ 
    "AnnotatedTextList": [ 
    { 
     "text": "I want to travel from New Delhi to Bangalore tomorrow.", 
     "entities": [ 
     { 
      "type": "FromCity", 
      "startPos": 5, 
      "length": 2 
     }, 
     { 
      "type": "ToCity", 
      "startPos": 8, 
      "length": 1 
     }, 
     { 
      "type": "TimeOfTravel", 
      "startPos": 9, 
      "length": 1 
     } 
     ] 
    } 
    ] 
} 

をそれらのトレーニングデータが多いほど、予測精度が向上します。

この注釈付きJSONは、jQueryやAngularなどのフロントエンドツールを使用して作成することもできます。しかし簡潔にするために私は手でそれらを作りました。

ここで、Annotated JSONファイルを解析して、ner_training_instanceのadd_entityメソッドに渡します。

しかし、C++ではJSONを逆シリアル化するためのリフレクションはサポートされていないため、このライブラリRapid JSON Parserを使用することができます。 Gitページからパッケージをダウンロードし、"C:\Users\xyz\Documents\MITIE-master\mitielib\include\mitie"の下に置きます。

train_ner_example.cppファイルをカスタマイズして、注釈付きカスタムエンティティJSONを解析し、トレーニングするためにMITIEに渡す必要があります。

#include "mitie\rapidjson\document.h" 
#include "mitie\ner_trainer.h" 

#include <iostream> 
#include <vector> 
#include <list> 
#include <tuple> 
#include <string> 
#include <map> 
#include <sstream> 
#include <fstream> 

using namespace mitie; 
using namespace dlib; 
using namespace std; 
using namespace rapidjson; 

string ReadJSONFile(string FilePath) 
{ 
    ifstream file(FilePath); 
    string test; 
    cout << "path: " << FilePath; 
    try 
    { 
     std::stringstream buffer; 
     buffer << file.rdbuf(); 
     test = buffer.str(); 
     cout << test; 
     return test; 
    } 
    catch (exception &e) 
    { 
     throw std::exception(e.what()); 
    } 
} 

//Helper function to tokenize a string based on multiple delimiters such as ,.;:- or whitspace 
std::vector<string> SplitStringIntoMultipleParameters(string input, string delimiter) 
{ 
    std::stringstream stringStream(input); 
    std::string line; 

    std::vector<string> TokenizedStringVector; 

    while (std::getline(stringStream, line)) 
    { 
     size_t prev = 0, pos; 
     while ((pos = line.find_first_of(delimiter, prev)) != string::npos) 
     { 
      if (pos > prev) 
       TokenizedStringVector.push_back(line.substr(prev, pos - prev)); 
      prev = pos + 1; 
     } 
     if (prev < line.length()) 
      TokenizedStringVector.push_back(line.substr(prev, string::npos)); 
    } 
    return TokenizedStringVector; 
} 

//Parse the JSON and store into appropriate C++ containers to process it. 
std::map<string, list<tuple<string, int, int>>> FindUtteranceTuple(string stringifiedJSONFromFile) 
{ 
    Document document; 
    cout << "stringifiedjson : " << stringifiedJSONFromFile; 
    document.Parse(stringifiedJSONFromFile.c_str()); 

    const Value& a = document["AnnotatedTextList"]; 
    assert(a.IsArray()); 

    std::map<string, list<tuple<string, int, int>>> annotatedUtterancesMap; 

    for (int outerIndex = 0; outerIndex < a.Size(); outerIndex++) 
    { 
     assert(a[outerIndex].IsObject()); 
     assert(a[outerIndex]["entities"].IsArray()); 
     const Value &entitiesArray = a[outerIndex]["entities"]; 

     list<tuple<string, int, int>> entitiesTuple; 

     for (int innerIndex = 0; innerIndex < entitiesArray.Size(); innerIndex++) 
     { 
      entitiesTuple.push_back(make_tuple(entitiesArray[innerIndex]["type"].GetString(), entitiesArray[innerIndex]["startPos"].GetInt(), entitiesArray[innerIndex]["length"].GetInt())); 
     } 

     annotatedUtterancesMap.insert(pair<string, list<tuple<string, int, int>>>(a[outerIndex]["text"].GetString(), entitiesTuple)); 
    } 

    return annotatedUtterancesMap; 
} 

int main(int argc, char **argv) 
{ 

    try { 

     if (argc != 3) 
     { 
      cout << "You must give the path to the MITIE English total_word_feature_extractor.dat file." << endl; 
      cout << "So run this program with a command like: " << endl; 
      cout << "./train_ner_example ../../../MITIE-models/english/total_word_feature_extractor.dat" << endl; 
      return 1; 
     } 

     else 
     { 
      string filePath = argv[2]; 
      string stringifiedJSONFromFile = ReadJSONFile(filePath); 

      map<string, list<tuple<string, int, int>>> annotatedUtterancesMap = FindUtteranceTuple(stringifiedJSONFromFile); 


      std::vector<string> tokenizedUtterances; 
      ner_trainer trainer(argv[1]); 

      for each (auto item in annotatedUtterancesMap) 
      { 
       tokenizedUtterances = SplitStringIntoMultipleParameters(item.first, " "); 
       mitie::ner_training_instance *currentInstance = new mitie::ner_training_instance(tokenizedUtterances); 
       for each (auto entity in item.second) 
       { 
        currentInstance -> add_entity(get<1>(entity), get<2>(entity), get<0>(entity).c_str()); 
       } 
       // trainingInstancesList.push_back(currentInstance); 
       trainer.add(*currentInstance); 
       delete currentInstance; 
      } 


      trainer.set_num_threads(4); 

      named_entity_extractor ner = trainer.train(); 

      serialize("new_ner_model.dat") << "mitie::named_entity_extractor" << ner; 

      const std::vector<std::string> tagstr = ner.get_tag_name_strings(); 
      cout << "The tagger supports " << tagstr.size() << " tags:" << endl; 
      for (unsigned int i = 0; i < tagstr.size(); ++i) 
       cout << "\t" << tagstr[i] << endl; 
      return 0; 
     } 
    } 

    catch (exception &e) 
    { 
     cerr << "Failed because: " << e.what(); 
    } 
} 

add_entityは3つのパラメータ、ベクトル、カスタムエンティティタイプ名、文章中の単語の開始インデックスと単語の範囲とすることができるトークン化文字列を受け付けます。

これで、開発者コマンドプロンプトVisual Studioで次のコマンドを使用してner_train_example.cppをビルドする必要がありました。

1)cd "C:\Users\xyz\Documents\MITIE-master\examples\cpp\train_ner" 2)mkdir build 3)cd build 4)cmake -G "Visual Studio 14 2015 Win64" .. 5)cmake --build . --config Release --target install 6)cd Release

7)train_ner_example "C:\\Users\\xyz\\Documents\\MITIE-master\\MITIE-models\\english\\total_word_feature_extractor.dat" "C:\\Users\\xyz\\Documents\\MITIE-master\\examples\\cpp\\train_ner\\data.json"

正常上記を実行する上で、我々はnew_ner_model.datを取得しますファイルは、私たちの発話のシリアライズされ訓練されたバージョンです。

この.datファイルは、RASAに渡すことも、スタンドアロンで使用することもできます。 RASAにそれを渡すために

次のようにconfig.jsonファイルを作成します。

{ 
    "project": "demo", 
    "path": "C:\\Users\\xyz\\Desktop\\RASA\\models", 
    "response_log": "C:\\Users\\xyz\\Desktop\\RASA\\logs", 
    "pipeline": ["nlp_mitie", "tokenizer_mitie", "ner_mitie", "ner_synonyms", "intent_entity_featurizer_regex", "intent_classifier_mitie"], 
    "data": "C:\\Users\\xyz\\Desktop\\RASA\\data\\examples\\rasa.json", 
    "mitie_file" : "C:\\Users\\xyz\\Documents\\MITIE-master\\examples\\cpp\\train_ner\\Release\\new_ner_model.dat", 
    "fixed_model_name": "demo", 
    "cors_origins": ["*"], 
    "aws_endpoint_url": null, 
    "token": null, 
    "num_threads": 2, 
    "port": 5000 
} 
関連する問題