Skip to main content

A library for dialog systems that attempt to respond to messages as Reflective Listening.

Project description

Dialog Reflection

A library for dialog systems that attempt to respond to messages as Reflective Listening.

Demo

Need git and poetry to run this demo.

$ git clone git@github.com:sadahry/dialog-reflection.git
$ cd dialog-reflection
$ poetry install
$ poetry run python examples/interactive_ja.py

Install

Need python >= 3.10

$ pip install dialog-reflection

How to Use (Japanese)

SpaCyの日本語モデルのインストールが必要

  • ja_ginza==5.1.2 でテスト済
  • 他モデルの利用は可能だが推奨しない
    • 係り受けや形態素解析によって不整合があるため利用前にテストを推奨
$ pip install ja_ginza==5.1.2

実行例

from dialog_reflection.lang.ja.reflector import JaSpacyReflector


refactor = JaSpacyReflector(model="ja_ginza")

message = "今日は旅行へ行った"
reflection_text = refactor.reflect(message)

print(reflection_text)
# => 旅行へ行ったんですね。

Builderを使う例

from dialog_reflection.lang.ja.reflection_text_builder import (
    JaSpacyPlainReflectionTextBuilder,
)
import spacy


nlp = spacy.load("ja_ginza")
builder = JaSpacyPlainReflectionTextBuilder()

message = "今日は旅行へ行った"
doc = nlp(message)
# some code...
reflection_text = builder.build(doc)

print(reflection_text)
# => 旅行へ行ったんですね。

語尾の調整

op を変更することで語尾を調整可能

from dialog_reflection.lang.ja.reflector import JaSpacyReflector
from dialog_reflection.lang.ja.reflection_text_builder import (
    JaSpacyPlainReflectionTextBuilder,
)
from dialog_reflection.lang.ja.reflection_text_builder_option import (
    JaSpacyPlainReflectionTextBuilderOption,
)


refactor = JaSpacyReflector(
    model="ja_ginza",
    builder=JaSpacyPlainReflectionTextBuilder(
        op=JaSpacyPlainRelflectionTextBuilderOption(
            fn_last_token_taigen=lambda token: token.text + "なんだね。",
            fn_last_token_yougen=lambda token: token.lemma_ + "んだね。",
        )
    ),
)

message = "今日は旅行へ行った"
reflection_text = refactor.reflect(message)

print(reflection_text)
# => 旅行へ行ったんだね。

その他設定項目は reflection_text_builder_option.py を確認してください

ロジックのカスタマイズ

JaSpacyPlainReflectionTextBuilder を override することでロジックをカスタマイズ可能

from dialog_reflection.reflection_cancelled import (
    ReflectionCancelled,
)
from dialog_reflection.cancelled_reason import (
    NoValidSentence,
)
from dialog_reflection.lang.ja.reflector import JaSpacyReflector
from dialog_reflection.lang.ja.reflection_text_builder import (
    JaSpacyPlainReflectionTextBuilder,
)
import spacy


class CustomReflectionTextBuilder(JaSpacyPlainReflectionTextBuilder):
    def extract_tokens(self, doc: spacy.tokens.Doc) -> spacy.tokens.Span:
        propn_token = next(filter(lambda token: token.pos_ == "PROPN", doc), None)
        if propn_token is None:
            raise ReflectionCancelled(reason=NoValidSentence(doc=doc))
        if propn_token.dep_ in ["compound", "numpound"]:
            return doc[propn_token.i : propn_token.head.i + 1]
        return doc[propn_token.i : propn_token.i + 1]


refactor = JaSpacyReflector(
    model="ja_ginza",
    builder=CustomReflectionTextBuilder(),
)


message = "今日は田中さんと旅行へ行った"
reflection_text = refactor.reflect(message)

print(reflection_text)
# => 田中さんなんですね。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dialog-reflection-0.1.2.tar.gz (22.4 kB view hashes)

Uploaded Source

Built Distribution

dialog_reflection-0.1.2-py3-none-any.whl (24.0 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page