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引数)
視覚的に出力するオブジェクトです。
この引数に出力したいDoc
やSpan
などのオブジェクトを渡します。
リスト、または単体の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
を生成します。
あとはこのdoc
をdisplacy.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
引数にオプションを指定すると出力方法を細かく変更することができます。
たとえばcompact
をTrue
にすると矢印の表現が四角形に近くなります。
それからcolor
にHEX
または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の依存構造を視覚的に確認したい時に使えるメソッドです。