![見出し画像](https://assets.st-note.com/production/uploads/images/97811964/rectangle_large_type_2_828329438c7f18bb32fa0335618b1a78.png?width=800)
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")
私はずんだもんです。 → ボクはずんだもんなのだ。
こんど彼に聞いてみます。 → こんど彼に聞いてみるのだ。
言ってみました。 → 言ってみましたのだ。
やってみました。 → やってみましたのだ。
思います。 → 思うのだ。
面白いですか? → 面白いですか?
東京タワー。 → 東京タワー。
こんにちは! → こんにちは!
今日の天気は晴れのち雨です。 → 今日の天気は晴れのち雨なのだ。
この猫かわいいです。 → この猫かわいいのだ。
面白いです。 → 面白いのだ。
私はずんだ餅好きです。 → ボクはずんだ餅好きなのだ。
あなたはずんだ餅すきですか? → あなたはずんだ餅すきですか?
あの人です。 → あの人なのだ。
私が猫になりきります! → ボクが猫になりきるのだ!
富士山に行ってきました。 → 富士山に行ってきましたのだ。
富士山でした。 → 富士山でしたのだ。
参考
この記事が気に入ったらサポートをしてみませんか?