首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MITIE ner模型

MITIE ner模型
EN

Stack Overflow用户
提问于 2017-10-11 09:29:34
回答 1查看 1.7K关注 0票数 1

我一直在探索使用预先训练的MITIE模型进行命名实体提取。不管怎么说,我可以看看他们实际的ner模型,而不是使用预先训练的模型吗?该模型作为开放源码可用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-28 10:48:41

设置: 首先,您可以从名为total_word_feature_extractor.dat.的文件中的一个巨大转储下载包含注释文本语料库的英语语言模式。 之后,从他们的官方Git下载/克隆MITIE-硕士项目。 如果您正在运行WindowsO.S,请下载CMake。 如果正在运行基于x64的WindowsO.S,则为C++编译器安装VisualStudio2015社区版。 下载完毕后,将所有文件解压缩到文件夹中。

打开VS 2015的开发人员命令提示符,从Start > Apps > Visual,导航到tools文件夹,您将看到里面有5个子文件夹。

下一步是在Visual命令提示符中使用以下Cmake命令构建ner_conll、ner_stream、train_freebase_relation_detector和wordrep包。

就像这样:

对于ner_conll:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

对于train_freebase_relation_detector:

代码语言:javascript
复制
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) cmake --build . --config Release --target install

对wordrep来说:

代码语言:javascript
复制
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个警告,别担心。

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

使用Visual代码创建一个JSON文件"data.json“,用于手动注释文本,如下所示:

代码语言:javascript
复制
{
  "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或like )创建。但为了简洁起见,我用手创造了它们。

现在,解析我们的注释JSON文件并将其传递给ner_training_instance的add_entity方法。

但是C++不支持反序列化JSON的反射,这就是为什么您可以使用这个库快速JSON分析器。从他们的Git页面下载这个包,并把它放在"C:\Users\xyz\Documents\MITIE-master\mitielib\include\mitie"下面。

现在,我们必须自定义train_ner_example.cpp文件,以便解析带注释的自定义实体JSON,并将其传递给MITIE以进行培训。

代码语言:javascript
复制
#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中使用以下命令来构建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文件:

代码语言:javascript
复制
{
    "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
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46684633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档