ユーニックス総合研究所

  • home
  • archives
  • spacy-displacy-serve

spaCyのdisplacy.serve()の使い方【自然言語処理, Python】

spaCyのdisplacyの使い方

私たちが使う言語は「自然言語」と呼ばれます。
この自然言語をプログラム的に解析するのが「自然言語処理」です。

Pythonには自然言語処理ライブラリのspaCyがあります。
spaCyのモジュールdisplacyを使うと、spaCyの依存構造を視覚的に出力することができます。

今回はspaCyのdisplacyの使い方、特にdisplacy.serve()の使い方をわかりやすく解説します。
具体的には↓を見ていきます。

  • displacy.serve()の概要
  • displacy.serve()の構造
  • displacy.serve()を使う

displacy.serve()の概要

displacyはspaCyの構築する依存構造を視覚的に表示するためのモジュールです。
これを使うとブラウザ上にグラフィカルな依存構造を出力することができます。
依存構造を視覚的に確認したい時に重宝するモジュールです。

displacy.serve()はdisplacyモジュールの関数です。
serve()はサーバーを起動し、引数に渡されたdocオブジェクトをブラウザ上に描画します。
serve()はさまざまな引数を持っていて、それらの引数を変更することで出力方法を変えることが可能です。

displacy.serve()の構造

displacy.serve()は↓のような構造を持っています。

serve(  
    docs,           # DocまたはSpanなどのリスト  
    style='dep',    # 表示スタイル。'dep' または 'ent'.  
    page=True,      # マークアップを完全なHTMLページとして描画する  
    minify=False,   # HTMLマークアップを小さくする  
    options={},     # 表示のオプション  
    manual=False,   # マニュアルのパースの指定  
    port=5000,      # サーバーのポート  
    host='0.0.0.0'  # サーバーのアドレス  
)  

serve()は最大で8つの引数を取ります。

docs(第1引数)

視覚的に出力するオブジェクトです。
この引数に出力したいDocSpanなどのオブジェクトを渡します。
リスト、または単体のDocなどを渡せます。

displacy.serve(doc)  

lis = [doc1, doc2]  
displacy.serve(lis)  

style(第2引数)

出力スタイルを文字列で指定します。
指定できるスタイルはdepまたはentです。
デフォルトはdepです。

depを指定するとserve()はグラフィカルな依存構造ツリーを出力します。
entを指定するとserve()はカラーリングされた固有表現を出力します。

page(第3引数)

ブラウザに出力するHTMLを完全なHTMLページとして出力するか指定します。

Trueを指定すると完全なHTMLページとして出力します。
<html></html>タグなども含めて出力します。

Falseだと表示部分を部分的なHTMLとして出力します。
<html></html>は含まず、部分的なHTMLで出力します。

デフォルトはTrueです。

minify(第4引数)

出力するHTMLを圧縮するか指定します。
圧縮と言うのはHTMLから余分な空白や改行を除去することです。
出力されるHTMLソースを確認したい場合はFalseを指定したほうが見やすいソースになります。

デフォルトはFalseです。

options(第5引数)

ビジュアライザーのオプションを指定します。
デフォルトは空です。
オプションは↓のオプションを指定できます。

manual(第6引数)

出力をマニュアル方式に変更するか指定します。
Trueにすると出力がマニュアルになります。

マニュアルと言うのは、出力するデータ(第1引数)をPythonの辞書で指定できるということです。
具体的な使用例については後述します。

デフォルトはFalseです。

port(第7引数)

サーバーを公開するポートを指定します。
デフォルトは5000です。

host(第8引数)

サーバーを公開するホストを指定します。
デフォルトは0.0.0.0です。

displacy.serve()を使う

displacy.serve()の使い方です。

依存構造を出力する

displacy.serve()で依存構造を出力するには、まずは普通にspaCyで文章を解析し、docを生成します。
あとはこのdocdisplacy.serve()に渡せばサーバーが起動します。

import spacy  
from spacy import displacy  

nlp = spacy.load('ja_ginza')  # モデルをロード  
doc = nlp('太郎は花子に鍵を渡した。')  # 文章を解析  

displacy.serve(doc)  # サーバーを起動  

↑のコードをsample.py等に保存しpython sample.pyを実行すると、↓のようにサーバーが起動します。

$ python sample.py  

Using the 'dep' visualizer  
Serving on http://0.0.0.0:5000 ...  

Using the 'dep' visualizer, つまりスタイルはdepを使っているという表示が出ています。
それからhttp://0.0.0.0:5000でサーバーを公開していると言っています。

ブラウザでhttp://localhost:5000にアクセスすると、↓のような依存構造ツリーが出力されます。

ちなみに複数のdocを指定したい場合は↓のようにリストで指定します。

displacy.serve([doc, doc])  # サーバーを起動  

固有表現を出力する

displacy.serve()style引数にentを指定すると固有表現などを出力できます。

import spacy  
from spacy import displacy  

nlp = spacy.load('ja_ginza')  # モデルをロード  
doc = nlp('太郎は花子に鍵を渡した。')  # 文章を解析  

displacy.serve(doc, style='ent')  # サーバーを起動  

↑のコードを実行すると↓のような結果になります

出力をカスタマイズする

displacy.serve()options引数にオプションを指定すると出力方法を細かく変更することができます。
たとえばcompactTrueにすると矢印の表現が四角形に近くなります。
それからcolorHEXまたはRGBのカラー値を指定すると、テキストのカラーを変更できます。
bgにも同様にカラー値を指定すると背景色を変更できます。
fontには使用するフォント名を指定できます。

たとえば↓のように指定します。

import spacy  
from spacy import displacy  

nlp = spacy.load('ja_ginza')  # モデルをロード  
doc = nlp('太郎は花子に鍵を渡した。')  # 文章を解析  

displacy.serve(doc, options={  
    'compact': True,  
    'color': '#ffffff',  
    'bg': '#0099ff',  
    'font': 'sans-serif',  
})  # サーバーを起動  

↑のコードを実行すると↓のような結果になります。

マニュアルでデータを指定する

displacy.serve()manual引数をTrueにすると、第1引数に辞書などのデータを指定できるようになります。
辞書のデータは表示するテキストやタグ、それから矢印の詳細など具体的に指定可能です。
たとえば↓のように指定します。

import spacy  
from spacy import displacy  

nlp = spacy.load('ja_ginza')  # モデルをロード  
data = {  
    "words": [  
        {"text": "This", "tag": "DT"},  
        {"text": "is", "tag": "VBZ"},  
        {"text": "a", "tag": "DT"},  
        {"text": "sentence", "tag": "NN"}  
    ],  
    "arcs": [  
        {"start": 0, "end": 1, "label": "nsubj", "dir": "left"},  
        {"start": 2, "end": 3, "label": "det", "dir": "left"},  
        {"start": 1, "end": 3, "label": "attr", "dir": "right"}  
    ]  
}  

displacy.serve(data, manual=True)  # サーバーを起動  

↑のコードを実行すると↓のような結果になります。

おわりに

今回はspaCyのdisplacy.serve()について見てきました。
spaCyの依存構造を視覚的に確認したい時に使えるメソッドです。