8
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-06

本記事は株式会社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

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

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1