見出し画像

Google Colab で SudachiPy による会話文の人称と語尾の設定を試す

「Google Colab」で「SudachiPy」による会話文の「人称」と「語尾」の設定を試したのでまとめました。

1. SudachiPy

「SudachiPy」はワークス徳島人工知能NLP研究所が開発している形態素解析器「Sudachi」のPython版です。バージョン0.6.0からはRust実装になり、以前のバージョンより20倍ほど実行速度が速くなっています。

2. Colabでの実行

Colabでの実行手順は次のとおりです。

(1) Colabの新規ノートブックを開く。

(2) パッケージのインストール。

# パッケージのインストール
!pip install sudachipy sudachidict_core

(3) 人称と語尾を設定する関数の準備。
今回は、一人称を「ボク」、です・ます調の語尾を「なのだ」に変換する関数を準備します。

from sudachipy import Dictionary

# トークナイザーの準備
dict = Dictionary()
tokenizer = dict.create()

# 人称と語尾の設定
def add_character(text):
    m = tokenizer.tokenize(text)
    result = ""
    for i in range(len(m)): 
        # print(m[i].surface(), m[i].dictionary_form(), m[i].part_of_speech(), m[i].reading_form(), m[i].normalized_form())
        result += m[i].surface()

        # 一人称変換
        if m[i].part_of_speech()[0] == "代名詞" and m[i].normalized_form() in ("私", "自分", "僕", "俺") :
            tg_text = m[i].surface()
            result = result[:-len(tg_text)] + "ボク"

        # 語尾変換
        elif i >= 2 and m[i].part_of_speech()[1] == "句点":
            tg_text = m[i-2].surface() + m[i-1].surface() + m[i].surface()

            # 名詞 + 助動詞
            if m[i-2].part_of_speech()[0] in ("名詞", "形状詞") and m[i-1].part_of_speech()[0] == "助動詞":
                result = result[:-len(tg_text)] + m[i-2].surface() + "なのだ" + m[i].surface()
            # 形容詞 + 助動詞
            elif m[i-2].part_of_speech()[0] in ("形容詞") and m[i-1].part_of_speech()[0] == "助動詞":
                result = result[:-len(tg_text)] + m[i-2].surface() + "のだ" + m[i].surface()
            # 動詞・助動詞・接尾辞 + 助動詞
            elif m[i-2].part_of_speech()[0] in ("動詞", "助動詞") and m[i-1].part_of_speech()[0] == "助動詞":
                if m[i-1].part_of_speech()[4] == "助動詞-タ":
                    result = result[:-len(tg_text)] + m[i-2].surface() + m[i-1].surface() + "のだ" + m[i].surface()
                else:
                    result = result[:-len(tg_text)] + m[i-2].dictionary_form() + "のだ" + m[i].surface()

    return result

解析結果の要素 (Morpheme) から取得できる情報は、次のとおりです。

・surface() : 表層形    (言っ)
・dictionary_form() : 辞書表現    (言う)
・part_of_speech() : 品詞    ('動詞', '一般', '*', '*', '五段-ワア行', '連用形-促音便')
・reading_form() : 言う    (イッ)
・normalized_form() : 正規化表現    (言う)

(4) 動作確認。
「人称」と「語尾」の変換される・されないが期待通りか確認します。

# テスト
text_list = [
    "私はずんだもんです。",
    "こんど彼に聞いてみます。",
    "言ってみました。",
    "やってみました。",
    "思います。",
    "面白いですか?",
    "東京タワー。",
    "こんにちは!",
    "今日の天気は晴れのち雨です。",
    "この猫かわいいです。",
    "面白いです。",
    "私はずんだ餅好きです。",
    "あなたはずんだ餅すきですか?",
    "あの人です。",
    "私が猫になりきります!",
    "富士山に行ってきました。",
    "富士山でした。",
]
for text in text_list:
    result = add_character(text)
    print(text, "→", result, "\n")
私はずんだもんです。 → ボクはずんだもんなのだ。 

こんど彼に聞いてみます。 → こんど彼に聞いてみるのだ。 

言ってみました。 → 言ってみましたのだ。 

やってみました。 → やってみましたのだ。 

思います。 → 思うのだ。 

面白いですか? → 面白いですか? 

東京タワー。 → 東京タワー。 

こんにちは! → こんにちは! 

今日の天気は晴れのち雨です。 → 今日の天気は晴れのち雨なのだ。 

この猫かわいいです。 → この猫かわいいのだ。 

面白いです。 → 面白いのだ。 

私はずんだ餅好きです。 → ボクはずんだ餅好きなのだ。 

あなたはずんだ餅すきですか? → あなたはずんだ餅すきですか? 

あの人です。 → あの人なのだ。 

私が猫になりきります! → ボクが猫になりきるのだ! 

富士山に行ってきました。 → 富士山に行ってきましたのだ。 

富士山でした。 → 富士山でしたのだ。 

参考



この記事が気に入ったらサポートをしてみませんか?