来自麻省理工的信息抽取

简介: MITIEMITIE 即 MIT 的 NLP 团队发布的一个信息抽取库和工具。它是一款免费且先进的信息抽取工具,目前包含了命名实体抽取、二元关系检测功能,另外也提供了训练自定义抽取器和关系检测器的工具。

MITIE

MITIE 即 MIT 的 NLP 团队发布的一个信息抽取库和工具。它是一款免费且先进的信息抽取工具,目前包含了命名实体抽取、二元关系检测功能,另外也提供了训练自定义抽取器和关系检测器的工具。

MITIE 是核心代码是使用 C++ 写的,建立在高性能的机器学习库 dlib 上。MIT 团队给我们提供了一些已训练好了的模型,这其中包含了英语、西班牙语和德语,这些模型都使用了大量的语料进行训练。我们发现并没有我们要的中文的模型,所以这个还得我们自己训练。

尽管 MITIE 是 C++ 写的,但它也提供了其他语言的调用 API 。在我自己的项目中常常会跟 Java 、 Python 混合用,所以只要编译成动态库再分别用 Java 和 Python 调用就行了,很方便。

为什么出现MITIE

看看 MIT 实验室的人怎么说就知道了。

I work at a lab and there are a lot of cool things about my job. In fact, I could go on all day about it, but in this post I want to talk about one thing in particular, which is that we recently got funded by the program to make an open source natural language processing library focused on information extraction.

Why make such a thing when there are already open source libraries out there for this (e.g. OpenNLP, NLTK, Stanford IE, etc.)? Well, if you look around you quickly find out that everything which exists is either expensive, not state-of-the-art, or GPL licensed. If you wanted to use this kind of NLP tool in a non-GPL project then you are either out of luck, have to pay a lot of money, or settle for something of low quality. Well, not anymore! We just released the first version of our MIT Information Extraction library which is built using state-of-the-art statistical machine learning tools.

怎么使用

提取实体为例,为方便可直接使用 MITIE 提供给我们的模型,否则你就需要自己训练了。从 https://github.com/mit-nlp/MITIE/releases/download/v0.4/MITIE-models-v0.2.tar.bz2 下载。

然后创建一个 test.txt 文件,待测试内容为

I met with john becker at HBU.
The other day at work I saw Brian Smith from CMU.

最后编写代码如下,

#include <mitie/named_entity_extractor.h>
#include <mitie/conll_tokenizer.h>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdlib>

using namespace std;
using namespace mitie;

std::vector<string> tokenize_file (
    const string& filename
)
{
    ifstream fin(filename.c_str());
    if (!fin)
    {
        cout << "Unable to load input text file" << endl;
        exit(EXIT_FAILURE);
    }
    conll_tokenizer tok(fin);
    std::vector<string> tokens;
    string token;
    while(tok(token))
        tokens.push_back(token);

    return tokens;
}


int main(int argc, char** argv)
{
    try
    {
        if (argc != 3)
        {
            printf("You must give a MITIE ner model file as the first command line argument\n");
            printf("followed by a text file to process.\n");
            return EXIT_FAILURE;
        }
        string classname;
        named_entity_extractor ner;
        dlib::deserialize(argv[1]) >> classname >> ner;

        const std::vector<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 << "   " << tagstr[i] << endl;

        std::vector<string> tokens = tokenize_file(argv[2]);

        std::vector<pair<unsigned long, unsigned long> > chunks;
        std::vector<unsigned long> chunk_tags;
        std::vector<double> chunk_scores;

        ner.predict(tokens, chunks, chunk_tags, chunk_scores);

        cout << "\nNumber of named entities detected: " << chunks.size() << endl;
        for (unsigned int i = 0; i < chunks.size(); ++i)
        {
            cout << "   Tag " << chunk_tags[i] << ": ";
            cout << "Score: " << fixed << setprecision(3) << chunk_scores[i] << ": ";
            cout << tagstr[chunk_tags[i]] << ": ";
            for (unsigned long j = chunks[i].first; j < chunks[i].second; ++j)
                cout << tokens[j] << " ";
            cout << endl;
        }

        return EXIT_SUCCESS;
    }
    catch (std::exception& e)
    {
        cout << e.what() << endl;
        return EXIT_FAILURE;
    }
}

执行结果为,

The tagger supports 4 tags:
   PERSON
   LOCATION
   ORGANIZATION
   MISC

Number of named entities detected: 4
   Tag 0: Score: 1.532: PERSON: john becker
   Tag 2: Score: 0.340: ORGANIZATION: HBU
   Tag 0: Score: 1.652: PERSON: Brian Smith
   Tag 2: Score: 0.471: ORGANIZATION: CMU

中文模型训练

主要是要训练所有词向量特征,后面的实名实体模型和关系模型都是建立在它的基础上,MITIE 给我们提供了工具完成上述操作,我们可以用 cmake 生成vs项目,但一般我们没有必要改动到代码,直接使用 cmake 构建一下就可直接使用。主要操作有

D:\MITIE\tools\wordrep>mkdir build
D:\MITIE\tools\wordrep>cd build
D:\MITIE\tools\wordrep\build>cmake ..
D:\MITIE\tools\wordrep\build>cmake --build . --config Release

再一个是需要收集大量的词汇,可以通过维基百科和百度百科收集,类似处理可以参加前面的文章 《如何使用中文维基百科语料》。

接着就可以开始训练了,参数e表示生成所有我们需要的模型,data为语料库的目录。

wordrep -e data
if (parser.option("e"))
        {
            count_words(parser);
            word_vects(parser);
            basic_morph(parser);
            cca_morph(parser);
            return 0;
        }

Java&Python调用

主要的一步都是要生成共享链接库,同样使用 cmake 可以很方便生成,到 mitielib 目录,

D:\MITIE\mitielib>mkdir build
D:\MITIE\mitielib>cd build
D:\MITIE\mitielib\build>cmake ..
D:\MITIE\mitielib\build>cmake --build . --config Release --target install

生成需要的链接库。

-- Install configuration: "Release"
-- Installing: D:/MITIE/mitielib/msvcp140.dll
-- Installing: D:/MITIE/mitielib/vcruntime140.dll
-- Installing: D:/MITIE/mitielib/concrt140.dll
-- Installing: D:/MITIE/mitielib/mitie.lib
-- Installing: D:/MITIE/mitielib/mitie.dll

然后 python 就能轻易完成调用。而对于 Java 也而需要类似的操作,但它的构建过程还需要有 SWIG 。生成如下的链接库和 jar 包,然后 Java就能轻易完成调用。

-- Install configuration: "Release"
-- Installing: D:/MITIE/mitielib/java/../javamitie.dll
-- Installing: D:/MITIE/mitielib/java/../javamitie.jar
-- Up-to-date: D:/MITIE/mitielib/java/../msvcp140.dll
-- Up-to-date: D:/MITIE/mitielib/java/../vcruntime140.dll
-- Up-to-date: D:/MITIE/mitielib/java/../concrt140.dll

github

一个文本分析项目使用MITIE,https://github.com/sea-boat/TextAnalyzer.git

以下是广告

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述
这里写图片描述

目录
相关文章
|
自然语言处理 算法 机器人
PaddleNLP通用信息抽取技术UIE【一】产业应用实例:信息抽取{实体关系抽取、中文分词、精准实体标。情感分析等}、文本纠错、问答系统、闲聊机器人、定制训练
PaddleNLP通用信息抽取技术UIE【一】产业应用实例:信息抽取{实体关系抽取、中文分词、精准实体标。情感分析等}、文本纠错、问答系统、闲聊机器人、定制训练
PaddleNLP通用信息抽取技术UIE【一】产业应用实例:信息抽取{实体关系抽取、中文分词、精准实体标。情感分析等}、文本纠错、问答系统、闲聊机器人、定制训练
|
1月前
|
机器学习/深度学习 算法 数据挖掘
社交网络分析7:社交网络舆情分析 、 社交网络舆情演化传播建模 、 社交网络舆情用户研究 意见领袖识别 情感分析 、结构洞 、 生命周期 、 舆情分析 知识图谱 主题图谱 、 异质平均场
社交网络分析7:社交网络舆情分析 、 社交网络舆情演化传播建模 、 社交网络舆情用户研究 意见领袖识别 情感分析 、结构洞 、 生命周期 、 舆情分析 知识图谱 主题图谱 、 异质平均场
537 0
|
10月前
|
安全 大数据
数据要素市场研究资料合集
数据要素市场研究资料合集
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
中文人物关系知识图谱(含码源):中文人物关系图谱构建、数据回标、基于远程监督人物关系抽取、知识问答等应用.
中文人物关系知识图谱(含码源):中文人物关系图谱构建、数据回标、基于远程监督人物关系抽取、知识问答等应用.
中文人物关系知识图谱(含码源):中文人物关系图谱构建、数据回标、基于远程监督人物关系抽取、知识问答等应用.
|
11月前
|
JSON 自然语言处理 算法
手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询
手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询
手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询
|
11月前
|
数据采集 存储 搜索推荐
分析新闻评论数据并进行情绪识别
爬取新闻评论数据并进行情绪识别的目的是为了从网页中抓取用户对新闻事件或话题的评价内容,并从中识别和提取用户的情绪或态度,如积极、消极、中立等。爬取新闻评论数据并进行情绪识别有以下几个优势: 1)可以了解用户对新闻事件或话题的看法和感受,以及影响他们情绪的因素; 2)可以分析用户的情绪变化和趋势,以及与新闻事件或话题的相关性和影响力; 3)可以根据用户的情绪进行个性化的推荐或服务,如提供正能量的内容、提供帮助或建议等;
188 1
|
机器学习/深度学习 Web App开发 自然语言处理
基于神经标签搜索,中科院&微软亚研零样本多语言抽取式摘要入选ACL 2022
基于神经标签搜索,中科院&微软亚研零样本多语言抽取式摘要入选ACL 2022
|
机器学习/深度学习 存储 文字识别
基于ERNIELayout&pdfplumber-UIE的多方案学术论文信息抽取
基于ERNIELayout&pdfplumber-UIE的多方案学术论文信息抽取,小样本能力强悍,OCR、版面分析、信息抽取一应俱全。
|
数据可视化 大数据 知识图谱
【建议收藏】|信息抽取与经济学文本量化分析(下)
【建议收藏】|信息抽取与经济学文本量化分析
146 0
【建议收藏】|信息抽取与经济学文本量化分析(下)
|
机器学习/深度学习 自然语言处理 数据可视化
【建议收藏】|信息抽取与经济学文本量化分析(上)
【建议收藏】|信息抽取与经济学文本量化分析
221 0
【建议收藏】|信息抽取与经济学文本量化分析(上)

热门文章

最新文章