2017-10-11 3 views
0

Ich habe auf die Verwendung von vortrained MITIE-Modelle für named Entity Extraction erforscht. Gibt es überhaupt einen Blick auf ihr aktuelles Modell, anstatt ein vortrainiertes Modell zu verwenden? Ist das Modell als Open Source verfügbar?MITIE ner Modell

Antwort

1

Einstellung Dinge:

Für den Anfang können Sie die English Language Model herunterladen, die enthält Corpus kommentierter Text aus einer riesigen Müllkippe in einer Datei namens total_word_feature_extractor.dat.

Danach herunterladen/Klonen Sie die MITIE-Master Project von ihrem offiziellen Git.

Wenn Sie Windows OS ausführen, laden Sie CMake herunter.

Wenn Sie ein x64-basiertes Windows-O.S ausführen, installieren Sie Visual Studio 2015 Community Edition für den C++ - Compiler.

Nach dem Herunterladen, die oben genannten, extrahieren alle von ihnen in einen Ordner.

The project structure will look something like this

Öffnen Prompt Entwickler Befehl für VS 2015 von Start> Alle Apps> Visual Studio, und navigieren Sie zu dem Ordner Tools, werden Sie 5 Unterordner innen sehen.

enter image description here

Der nächste Schritt ist ner_conll, ner_stream, train_freebase_relation_detector und wordrep Pakete zu erstellen, indem Sie Cmake-Befehle in der Visual Studio Developer Eingabeaufforderung.

Etwas wie folgt:

enter image description here

Für ner_conll:

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

Für ner_stream:

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

Für train_freebase_relation_detector:

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" .. 0.123.iv) cmake --build . --config Release --target install

Für wordrep:

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

Nachdem Sie sie bauen Sie einige 150-160 Warnungen erhalten, Mach dir keine Sorgen.

Navigieren Sie nun zu dem "C:\Users\xyz\Documents\MITIE-master\examples\cpp\train_ner"

eine JSON-Datei "data.json" Machen Sie mit Visual Studio-Code für Text mit Anmerkungen versehen manuell, etwa so:

{ 
    "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 
     } 
     ] 
    } 
    ] 
} 

Sie können weitere Äußerungen hinzufügen und mit Anmerkungen versehen Je höher die Trainingsdaten, desto besser ist die Vorhersagegenauigkeit.

Dieser mit Anmerkungen versehene JSON kann auch über Front-End-Tools wie jQuery oder Angular erstellt werden. Aber um es kurz zu machen, habe ich sie von Hand erstellt.

Jetzt, um die unsere Annotated JSON-Datei zu analysieren und sie an add_entity-Methode von ner_training_instance übergeben.

Aber C++ unterstützt keine Reflektion zum Deserialisieren von JSON, deshalb können Sie diese Bibliothek verwenden Rapid JSON Parser. Laden Sie das Paket von der Git-Seite herunter und legen Sie es unter "C:\Users\xyz\Documents\MITIE-master\mitielib\include\mitie" ab.

Jetzt müssen wir die Datei train_ner_example.cpp anpassen, um unsere kommentierten benutzerdefinierten Entitäten JSON analysieren und an MITIE weiterleiten zu können.

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

Die add_entity akzeptiert 3 Parameter, die in Zeichen übersetzte Zeichenfolge, die ein Vektor sein kann, die benutzerdefinierte Entität Typname, der Startindex eines Wortes in einem Satz und der Bereich des Wortes.

Nun müssen wir die ner_train_example.cpp mit den folgenden Befehlen in Developer Command Prompt Visual Studio erstellen.

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"

Auf erfolgreich die obigen Ausführung werden wir eine new_ner_model.dat erhalten Datei, die eine serialisierte und trainierte Version unserer Äußerungen ist.

Jetzt kann diese .dat-Datei an RASA übergeben oder eigenständig verwendet werden.

Denn es RASA vorbei:

die config.json Datei Machen Sie wie folgt vor:

{ 
    "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 
} 
Verwandte Themen