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

本記事は[株式会社Works Human Intelligence](https://www.works-hi.co.jp/)のアドベントカレンダー、[「Develop fun!」を体現する Works Human Intelligence #2](https://qiita.com/advent-calendar/2020/whi-2)の[6日目の記事](https://qiita.com/cold-wisteria/items/cab1548d71bec5d8ec50)の蛇足記事になります！
弊社ではアドベントカレンダーを2枚実施しておりますので、[1枚目](https://qiita.com/advent-calendar/2020/whi)もぜひご覧ください！

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

>[Sudachi/SudachiPy](https://worksapplications.github.io/Sudachi/)は、弊社の分社前の会社であるワークスアプリケーションズの、[徳島人工知能NLP研究所](https://www.worksap.co.jp/about/csr/nlp/)が提供するOSSの日本語形態素解析器です。企業提供のOSSであることによる、辞書を含めたライブラリのメンテナンス/開発の継続性や、[日本語分割のモード](https://github.com/WorksApplications/Sudachi#%E5%88%86%E5%89%B2%E3%83%A2%E3%83%BC%E3%83%89)を用途に合わせて3種類から選択できる点などを特徴にしています。

しかし、GiNZAを利用した湯婆婆のネタは既に[湯婆婆アドベントカレンダー](https://qiita.com/advent-calendar/2020/yubaba)の[1日目の記事](https://qiita.com/kuro_take/items/3ff7d71a9be4a20898e9)で先を越されてしまっていました。
ネタがかぶるのもよくないなあ、ということで、自分の記事は急遽[namedivider-python](https://github.com/rskmoi/namedivider-python)を利用したものに変更したわけです。

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

## PerfectYubabaLivingInGiNZAの実装
```python3: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](https://www.works-hi.co.jp/products)"の新機能開発やリアーキテクチャ、SREといった職種も募集しています。
https://www.career.works-hi.co.jp/career/engineer

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