10. カスタム解析モジュールの開発

ここでは、より高度な解析を行うモジュールを独自に開発したい場合に 必要な情報を提供します。

10.1. デフォルトの解析フローをカスタマイズ

テキストを解析する pygeonlp.api.geoparse() は、実際には pygeonlp.api.default_workflow() が返すデフォルトの Workflow インスタンスを取得し、 そのクラスメソッドである geoparse() を呼び出すショートカットです。 そのため解析フローをカスタマイズするには、Workflow クラスの動作を 理解する必要があります。

デフォルトの Workflow の geoparse() が実行する解析手順は次の通りです。

Workflow クラスは parser, filters, evaluator の3つのメンバーを持ちます。

上記の手順をカスタマイズしたい場合、これらのメンバーを操作すれば 処理を変更することができます。

単純な例として、市区町村クラスを持つ候補以外を削除する EntityClassFilter をセットするコードは以下のようになります。

import pygeonlp.api as api
from pygeonlp.api.filter import EntityClassFilter
api.init()
api.default_workflow().filters = [
    EntityClassFilter(r'市区町村/?.*')]
results = api.geoparse(text)

もう少し複雑な例として、 Parser を独自拡張した MyParser に 置き換えるには、 parser を次のように上書きします。

import pygeonlp.api as api
api.init()
myparser = MyParser(my_parameter)
api.default_workflow().parser = myparser
results = api.geoparse(<text>)

10.2. 独自ワークフロークラスを定義

デフォルト Workflow のメンバを書き換えるとその後の処理にも影響するため、 想定しない副作用を生じる可能性があります。 そのため、 Workflow クラスから派生した独自のワークフロークラス MyWorkflow を定義し、その geoparse() を呼び出す方が安全です。

from pygeonlp.api.workflow import Workflow

class MyWorkflow(Workflow):

    def __init__(self, my_parameter, **params):
        super().__init__(**params)
        self.parser = MyParser(my_parameter)

myworkflow = MyWorkflow(my_parameter)
results = myworkflow.geoparse(text)

もし parser, filters, evaluator を置き換えるだけでは実現できない ロジックを実装したい場合、 Workflow.geoparse() を参考にして 独自ワークフロークラスの geoparse() メソッドを再定義してください。

10.3. 実装サンプル

Filter, Evaluator, Workflow の拡張実装例が GitHub にありますので、参考にしてください。