はじめに

本システム (relretrieval) と必要となる関連システム (ElasticsearchNER API Server) 、及びそれらを利用するアプリケーションの関係を示します。

graph TD subgraph "" app[fa:fa-user アプリケーション] end app -.-> 3r subgraph 本システム及び関連システム 3r[relretrieval] es[fa:fa-database Elasticsearch] ner[fa:fa-scissors NER API Server] 3r -.-> es 3r -.-> ner end

図に示すように本システムは、バックエンドで固有表現抽出 (NER) をするためのサーバーと、データベースとしてElasticsearchを使用します。

ダウンロードとセットアップ

Elasticsearch

データベースとしてElasticsearchを利用します。 すでに起動している場合は必要ありませんが、以下のインデックス名及びプラグインを使用します。

インストール例

$ mkdir ./data
$ wget -P ./data/ https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/zip/elasticsearch/2.3.4/elasticsearch-2.3.4.zip
$ unzip -d ./data/ ./data/elasticsearch-2.3.4.zip
$ echo "script.inline: true" >> ./data/elasticsearch-2.3.4/config/elasticsearch.yml
$ echo "script.indexed: true" >> ./data/elasticsearch-2.3.4/config/elasticsearch.yml
$ ./data/elasticsearch-2.3.4/bin/plugin install lang-javascript
$ ./data/elasticsearch-2.3.4/bin/elasticsearch
...

NER API Server

本システムでは固有表現を外部のAPIを用いて抽出を行うことで、固有表現抽出 (NER) に用いるツールの変更を容易にしています。 固有表現抽出用のAPIが満たすべき仕様についてはこちら

インストール例

上記のAPI仕様を満たす固有表現抽出サーバー (Play NER Server) を本システムとは別に提供しています。 Play NER Server の使用には activator のインストールが必要です。

ソースコードのダウンロード
$ git clone https://github.com/sosuke-k/ner-play-server
CRF モデルのダウンロード
$ cd ner-play-server
$ wget -P ./data/ http://nlp.stanford.edu/software/stanford-ner-2015-12-09.zip
$ unzip -d ./data/ ./data/stanford-ner-2015-12-09.zip
$ cp -r ./data/stanford-ner-2015-12-09/classifiers/ ./apps/play/public/classifiers/
Play NER Server の起動

最初はCRFモデルの読み込みに少し時間がかかります。

$ cd apps/play
$ ./bin/activator run
...
--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

relretrieval

環境変数の追加

環境変数の設定例:

export ELASTICSEARCH_URL "http://localhost:9200"
export NER_API_URL "http://localhost:9000"

インストール

pip install relretrieval

インデックスの初期化

$ python -m relretrieval --init True
Elasticsearch(2.3.4) ENDPOINT : http://localhost:9200
Initializing ...
done

起動

$ python -m relretrieval
Elasticsearch(2.3.4) ENDPOINT : http://localhost:9200
NER API ENDPOINT : http://localhost:9000
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
...

簡単な使い方

文を保存

article_id=1The tech company Soundcloud is based in Berlin, capital of Germany. を保存する例です。

$ url --header "Content-type: application/json" --request POST --data '{"article_id": 1, "text":"The tech company Soundcloud is based in Berlin, capital of Germany."}' http://localhost:5000/docs -s | jq
{
  "status": "ok"
}

学習を開始

$ curl --header "Content-type: application/json" --request POST --data '{"max_iter": 2}' http://localhost:5000/start -s | jq
{
  "message": "Training begins",
  "status": "ok"
}

relation の取得

curl http://localhost:5000/relations -s | jq
{
  "clusters": [
    {
      "id": "AVoHVpws7qHvD9dVUw6Y",
      "relations": [
        {
          "AFT": ".",
          "BEF": "based in",
          "BET": ", capital of",
          "tuples": [
            {
              "first": "Berlin",
              "second": "Germany"
            }
          ]
        },
        {
          "AFT": ", capital",
          "BEF": "tech company",
          "BET": "is based in",
          "tuples": [
            {
              "first": "Soundcloud",
              "second": "Berlin"
            }
          ]
        }
      ]
    }
  ]
}