代码之家  ›  专栏  ›  技术社区  ›  MenorcanOrange

MITIE-ner模型

  •  1
  • MenorcanOrange  · 技术社区  · 7 年前

    我一直在探索使用预训练的MITIE模型进行命名实体提取。我可以看看他们的实际ner模型而不是使用预训练模型吗?该模型是开源的吗?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Kunal Mukherjee    7 年前

    设置:

    对于初学者,您可以下载 English Language Model 哪一个 包含一个名为 total\u word\u feature\u提取器。dat公司 .

    之后,下载/克隆 MITIE-Master Project 从他们的 官方Git。

    如果您正在运行Windows O.S,请下载 CMake .

    如果您运行的是基于x64的Windows操作系统,请安装Visual Studio C++编译器的2015社区版。

    下载上述内容后,将其全部解压缩到一个文件夹中。

    The project structure will look something like this

    从开始为VS 2015打开开发者命令提示符>所有应用程序>然后导航到tools文件夹,您将在其中看到5个子文件夹。

    enter image description here

    下一步是通过在Visual Studio Developer命令提示符中使用以下Cmake命令来构建ner\u conll、ner\u stream、train\u freebase\u relation\u detector和wordrep包。

    类似这样:

    enter image description here

    对于ner_conll:

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

    一) mkdir build ii) cd build iii) cmake -G "Visual Studio 14 2015 Win64" .. 四) cmake --build . --config Release --target install

    对于ner_流:

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

    一) mkdir生成 ii) cd构建 cmake—构建--配置发布--目标安装

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

    一) mkdir生成 ii) cmake-G“Visual Studio 14 2015 Win64”。。 cmake—构建--配置发布--目标安装

    对于wordrep:

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

    一) mkdir生成 cd构建 iii) cmake-G“Visual Studio 14 2015 Win64”。。 四) cmake—构建--配置发布--目标安装

    在您构建它们之后,您将收到大约150-160个警告,不要担心。

    现在,导航到 "C:\Users\xyz\Documents\MITIE-master\examples\cpp\train_ner"

    使用Visual Studio代码制作JSON文件“data.JSON”以手动注释文本,如下所示:

    {
      "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等前端工具创建。但为了简单起见,我手工制作了它们。

    现在,解析带注释的JSON文件并将其传递给ner\u training\u实例的add\u entity方法。

    但是C++不支持反射来反序列化JSON,这就是为什么您可以使用这个库 Rapid JSON Parser . 从他们的Git页面下载包并将其放在 "C:\Users\xyz\Documents\MITIE-master\mitielib\include\mitie"

    现在我们必须自定义train\u ner\u示例。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_实体接受3个参数,标记化字符串可以是向量,自定义实体类型名称,句子中单词的开始索引和单词的范围。

    现在我们必须构建ner\u train\u示例。通过在开发人员命令提示符Visual Studio中使用以下命令进行cpp。

    1) cd "C:\Users\xyz\Documents\MITIE-master\examples\cpp\train_ner" 2) mkdir生成 3) cd构建 4) cmake-G“Visual Studio 14 2015 Win64”。。 5) 6) cd Release

    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"

    成功执行上述操作后,我们将得到一个新的NU ner_模型。dat文件,是我们话语的序列化和训练版本。

    既然dat文件可以传递给RASA或单独使用。

    将其传递给RASA:

    进行配置。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
    }