本記事は株式会社Works Human Intelligenceのアドベントカレンダー、「Develop fun!」を体現する Works Human Intelligence #2の6日目の記事の蛇足記事になります!
弊社ではアドベントカレンダーを2枚実施しておりますので、1枚目もぜひご覧ください!
はじめに
元々のパーフェクト湯婆婆の構想では、姓と名の分割をGiNZAで行うことを考えておりました。
GiNZAはワンステップで導入可能な自然言語処理ライブラリで、日本語トークナイザとしてSudachiPyを組み込んでいることが特徴の一つです。
Sudachi/SudachiPyは、弊社の分社前の会社であるワークスアプリケーションズの、徳島人工知能NLP研究所が提供するOSSの日本語形態素解析器です。企業提供のOSSであることによる、辞書を含めたライブラリのメンテナンス/開発の継続性や、日本語分割のモードを用途に合わせて3種類から選択できる点などを特徴にしています。
しかし、GiNZAを利用した湯婆婆のネタは既に湯婆婆アドベントカレンダーの1日目の記事で先を越されてしまっていました。
ネタがかぶるのもよくないなあ、ということで、自分の記事は急遽namedivider-pythonを利用したものに変更したわけです。
ただ、筆者がGiNZAでやりたかったことはnamedividerで実際にやったことと同じで、姓名の分割です。この点、先駆者様の記事と完全にかぶっているわけではないので、ネタとソースコードを本記事で供養させていただきます。
PerfectYubabaLivingInGiNZAの実装
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
興味をお持ちいただければ幸いです!