GiNZAに住むパーフェクト湯婆婆を供養する


本記事は株式会社Works Human Intelligenceのアドベントカレンダー、「Develop fun!」を体現する Works Human Intelligence #26日目の記事の蛇足記事になります!
弊社ではアドベントカレンダーを2枚実施しておりますので、1枚目もぜひご覧ください!

はじめに

元々のパーフェクト湯婆婆の構想では、姓と名の分割をGiNZAで行うことを考えておりました。
GiNZAはワンステップで導入可能な自然言語処理ライブラリで、日本語トークナイザとしてSudachiPyを組み込んでいることが特徴の一つです。

Sudachi/SudachiPyは、弊社の分社前の会社であるワークスアプリケーションズの、徳島人工知能NLP研究所が提供するOSSの日本語形態素解析器です。企業提供のOSSであることによる、辞書を含めたライブラリのメンテナンス/開発の継続性や、日本語分割のモードを用途に合わせて3種類から選択できる点などを特徴にしています。

しかし、GiNZAを利用した湯婆婆のネタは既に湯婆婆アドベントカレンダー1日目の記事で先を越されてしまっていました。
ネタがかぶるのもよくないなあ、ということで、自分の記事は急遽namedivider-pythonを利用したものに変更したわけです。

ただ、筆者がGiNZAでやりたかったことはnamedividerで実際にやったことと同じで、姓名の分割です。この点、先駆者様の記事と完全にかぶっているわけではないので、ネタとソースコードを本記事で供養させていただきます。

PerfectYubabaLivingInGiNZAの実装

perfectYubabaLivingInGiNZA.py
from ginza import *
import spacy
import random

MODE_OF_SPLITTING = "B"

GIVEN_NAME_INDEX = 1
LENGTH_OF_SPLITTED = 2

print("契約書だよ。そこに名前を書きな、働かせてやる。")

full_name = input("乙 ")
if len(full_name.split()) == LENGTH_OF_SPLITTED:
    given_name = full_name.split()[GIVEN_NAME_INDEX]
else:
    nlp = spacy.load('ja_ginza')
    set_split_mode(nlp, MODE_OF_SPLITTING)
    doc = nlp(full_name)
    given_name=""
    for sent in doc.sents:
        given_name=sent[GIVEN_NAME_INDEX].orth_

print(f"フン、{given_name}というのかい。贅沢な名だねぇ。")

extracted_character = random.choice(given_name)

print(f"乙 {extracted_character}")
print(f"今からお前の名前は{extracted_character}だ。いいかい。{extracted_character}だよ。分かったら返事をするんだ、{extracted_character}!!")

実践

/mnt/c/workspace/python-workspace/ginza-yubaba$ python perfectYubabaLivingInGiNZA.py 
契約書だよ。そこに名前を書きな、働かせてやる。
乙 萩野千尋
フン、千尋というのかい。贅沢な名だねぇ。
乙 千
今からお前の名前は千だ。いいかい。千だよ。分かったら返事をするんだ、千!!
/mnt/c/workspace/python-workspace/ginza-yubaba$ python perfectYubabaLivingInGiNZA.py 
契約書だよ。そこに名前を書きな、働かせてやる。
乙 萩野 千尋
フン、千尋というのかい。贅沢な名だねぇ。
乙 千
今からお前の名前は千だ。いいかい。千だよ。分かったら返事をするんだ、千!!
/mnt/c/workspace/python-workspace/ginza-yubaba$ python perfectYubabaLivingInGiNZA.py 
契約書だよ。そこに名前を書きな、働かせてやる。
乙 菅義偉
フン、義偉というのかい。贅沢な名だねぇ。
乙 義
今からお前の名前は義だ。いいかい。義だよ。分かったら返事をするんだ、義!!
/mnt/c/workspace/python-workspace/ginza-yubaba$ python perfectYubabaLivingInGiNZA.py 
契約書だよ。そこに名前を書きな、働かせてやる。
乙
Traceback (most recent call last):
  File "perfectYubabaLivingInGiNZA.py", line 18, in <module>
    doc = nlp(full_name)
  File "/home/works/.local/lib/python3.8/site-packages/spacy/language.py", line 449, in __call__
    doc = proc(doc, **component_cfg.get(name, {}))
  File "/home/works/.local/lib/python3.8/site-packages/ginza/bunsetu_recognizer.py", line 185, in __call__
    bunsetu_bi[0] = "B"
IndexError: list assignment index out of range

We live in GiNZA!!!
I’m a perfect yubaba!!!

/mnt/c/workspace/python-workspace/ginza-yubaba$ python perfectYubabaLivingInGiNZA.py 
契約書だよ。そこに名前を書きな、働かせてやる。
乙 琥珀川
フン、川というのかい。贅沢な名だねぇ。
乙 川
今からお前の名前は川だ。いいかい。川だよ。分かったら返事をするんだ、川!!

はい。

蛇足まで、最後までご覧いただきありがとうございました!

最後に

こんなネタ記事の締めで恐縮ですが……
弊社では、自然言語処理に関わるエンジニアを募集しています!
基礎研究やチャットボットサービスの開発に携わっていただける募集になります!
https://www.career.works-hi.co.jp/career/engineer/product_techlead_member

もちろん先述の募集だけでなく、弊社の看板製品"COMPANY"の新機能開発やリアーキテクチャ、SREといった職種も募集しています。
https://www.career.works-hi.co.jp/career/engineer

興味をお持ちいただければ幸いです!