Namelti : 人名の読み仮名候補を自動列挙するためのライブラリ

メリークリスマス !! 

LINE Advent Calendar 2018の最終日は、Clovaの自然言語理解システムの開発に携わっている佐藤敏紀(@overlast)が担当します。今年のクリスマスプレゼントは自分で自分に、超小型ジンバル付きカメラを買いました。いつかまた子供の頃の様にサンタさんからプレゼント貰いたいです。

はじめに: 今回のテーマについて

今回のテーマはタイトルにも含まれている、”人名の読み仮名候補の自動列挙”についてです。

このテーマがどんなものか具体例を挙げてご説明すると、以下の様な入力データに対して

  入力データ
サンプル1 出澤剛
サンプル2 佐藤敏紀
サンプル3 Timothy Donald Cook

以下の様に、人名の範囲で考えられる読み仮名を列挙した出力データを返すだけです。とてもシンプルですね。

  出力データ
サンプル1 イデサワタケシ, イデサワツヨシ, イデサワゴウ, イデザワタケシ, イデザワツヨシ,
イデザワゴウ, デザワタケシ, デザワツヨシ, デザワゴウ
サンプル2 サトウトシノリ, サトウトシキ
サンプル3 ティモシードナルドクック

上記のような出力結果の用途として僕が想定したのは、ユーザーが過去に入力した人名の表記のデータに対する読み仮名を追加で入力する必要に迫られた場合や、未知の人名リストにまとめて読み仮名を付与したい場合などです。

最近は電話帳を見かけなくなったので、人名リストではなく店名リストの画像になってしまいましたけど、この画像のように沢山の名前が列挙されている時に、それらに漏れなく読み仮名を付けたい場合があるのです。そして人間はとても賢いので、この様なリストに対してかなり高精度で読み仮名を付与できます。

めぐみやっきょく、うえのやっきょく、やまむらやっきょく、とまったく間違う気がしませんね。

同様にユーザーが過去に入力した人名の正解な読み方はユーザーに直接聞いたら分かるでしょう。しかし、その際にユーザーからすると読み仮名を入力する手間がかかります。これは1件くらいなら些細な時間の差ですが、500件、1000件と増えたときに大きな差になります。また、人手によるクリーニングや修正を前提にしたデータの作成をする際は、可能な限り自動化することで、データを作成するための時間を削減できますし、単純な入力ミスを防げます。

この様な問題を解決する方法として、一旦、人名の表記に対する読み仮名の候補を列挙して(可能なら一致度順でソートする)、表記と読み仮名の候補の組を作ります。その後に、ユーザーが読み仮名の候補から適切な読み仮名を選ぶ機会を作ります。そして、提案した候補集合に適切な読み仮名が含まれて無い場合に限り、ユーザーに適切な読み仮名を手入力してもらうのです。

人名の読み仮名候補の自動列挙とは、どんなタスクか

人名の読み仮名候補の自動列挙のために最低限実装すべき処理の内容を、箇条書きで整頓します。

  • 入力データ
    • 人物の名前の表記
      • 文字列
        • 姓、名、ミドルネーム、ニックネーム、フルネームなど
        • 日本語表記とは限らない
  • 出力データ
    • 入力データに対する読み仮名の候補
      • 文字列のリスト
        • 各文字列は日本語のカタカナ表記
        • 日本人が思いつきそうな順でソート
        • 可能なら存命な人物や、直近で有名な読み方を優先

以上の様な入出力の条件を満たせるのであれば、どんな方法でも良いでしょう。

このタスクにおけめ出力データの様に、表記の発音を読み仮名や発音記号などによって音声・音韻表記することを、一般的には転写(transcription)と呼びます。転写は翻字(transliteration)と混同しやすいですが、今回は僕の理解だと転写です。

関連する先行研究

これから取り組むタスクはとてもシンプルですし、人名というあらゆる人にとって身近なデータを対象にしていますから、先行研究はとても多そうだと思っていました。しかし実際にはそれほど多くなかったです。アカデミック的な視点から見ると簡単すぎて研究する価値が無いのかもしれません。以下にブラウザで読みやすい文献をいくつか挙げます。紹介した文献は記事末尾にまとめてあります。

一番最初に考えられる素朴な方法は、形態素解析器の解析結果を利用する方法です。 N-Best解を出力すれば、任意の数の表記に対する読み仮名の候補を得られます。 ただ、多くの形態素解析器が入力として想定しているデータは、人名に限られていません。 そのため、普通に解析した場合は、人名として適切な読み仮名以外にも読み方の候補を出力されます。 これを防ぐためには、解析結果をフィルタリングしたり、形態素解析器が使う学習済みモデルや辞書を変更したりする必要があります。

形態素解析器が使う学習済みモデルや辞書を変更することで、形態素解析器を外国人名のカタカナ表記の自動推定に使う研究はすでにあります[1]。この研究で解決を試みているタスクと、今回のタスクの差異は入力データが日本人以外の人名の表記であり、出力される結果の読み仮名を選択する際に、各国における独特な発音を加味しようと意図している点でしょう。今回の私のタスクでは、これらの違いの両方が不要です。

より以前には、音声合成システムの出力結果を改善する目的で、未知語の読み誤りを防ぐための辞書を、ニュース記事とその読み上げデータの組から効率よく作成し、文の読み推定の精度を向上させた研究[2]もあります。私のタスクとの差異は、表記に対する読み上げデータを入力に使える点と、読みを推定する対象が人名に限らない点です。今回の私のタスクでは、読み仮名を付与すべき名前の表層データ以外は入力に使えません。そのため、列挙した読み仮名の候補の中から正しい読み仮名を選択するためには人間が判断が必要です。

過去には検索エンジンを用いての読みの推定をした研究[3]もあります。この研究が行われた当時と比べると、検索エンジンのAPIが大量な日本語の検索結果のスニペットを取得できる無料のWeb検索APIが無くなりました。そのため、同様の手法を試すために必要な対応は、お金を使うか、時間を使うか、自前でWeb検索エンジンを運用するかのどれかになります。我々は人物の名前の表記に解析対象を絞っていますが、人物の名前の読み仮名のバリエーション数はとても多くなります。そのため無料の範囲でできる検索ではお金も時間も足りません。また、今回の目的のために検索エンジンを開発して運用するのはやりすぎです。

私のタスクとは少し毛色が違いますが、人名の表記の1字ごとに獲得済みの読み仮名を割り当てる研究[4]があります。この研究が残した課題からは、漢字と仮名の紐づけが難しく、人名全体で1つの読み仮名を付与する必要がある場合の存在を示唆しています。また、Wikipediaの様な大規模なデータをコーパスとして活用することが有益であると述べており、人名の表記を扱う課題を解いていく過程においてデータ収集の継続が欠かせないと分かります。

読み仮名候補の自動列挙ライブラリ Namelti

研究を以外に目を向けると、商用の名刺管理アプリケーションや、個人情報を入力するためのフォーム画面などに、私達が求めるものと同等かそれ以上の実装が活用されていそうです。

しかし事前調査では、それらの様な商用サービスで利用されているライブラリはOSSとして配布されていない様です。飯のタネですから仕方無いですよね。私達の目的にあった処理や近い処理ができる商用可能な実装が、想定する用途に利用しやすい形のOSSとしては公開されていない状況でしたので、自分で実装してみることにしました。

以下ではそんな理由で実装してみたNamelti(ネイメルティ)という名前のライブラリを紹介します。

このライブラリを使うと、入力された名前文字列の読み仮名として可能性がある候補を列挙して出力できます。

READMEに従ってCentOS 7上でNameltiインストールをしたあと、以下の様にしてサンブルの設定ファイルを使って、サーバを起動してください。

$ ./namelti_server -c ../conf/namelti_server.json.sample

その後、以下の様にしてサンプルのクライアントで、任意の名前を変換してみましょう。今回は僕の名前を使います。

$ ./misc/grpc/python/namelti_sample_client.py 佐藤敏紀
サトウトシノリ
サトウトシキ

結果として、佐藤敏紀の読み仮名の候補を複数取得できました。とても簡単ですね。これだけ?、と拍子抜けするかもしれませんが、様々な名前文字列に対して少ないノイズで読み仮名の候補を列挙する実装を書いて、それをメンテするのは地味に手間がかかるのです。

Nameltiの実装は安江らの研究[1]の方向性とかなり近いです。ベースとなる結果はMeCabの解析結果です。形態素解析用の辞書としてmecab-ipadic-NEologdも使います。普通のMeCab + mecab-ipadic-NEologdな使い方と違うのは、入力されるデータとして存命な人物の名前のみを想定している点です。その違いを最大限に利用すると、MeCabの解析結果を大胆にフィルタリングできるし、人名の読み仮名を獲得するという目的に合致しているなら一般的な用途の単語分かち書き用の辞書に足せない様な辞書エントリも追加できます。

たとえば、渋谷、という単語が一般には、地名なのか人名の一部なのか判別できないのですが、我々のタスクでは人名以外の可能性を無視できます。他方で、焼肉先生”の様に、一般名詞の組み合わせで作られたあだ名が人名として入力される場合があります。そのため入力データの全文字列のうち、表記の姓や名が含まれない部分は通常の形態素解析の結果を尊重しています。

Nameltiは今まさに活発に開発しています。開発コストを最小化するため、今年度中はmasterブランチを直接いじって開発します。Stableな状態ではないので、開発状況によって動作確認できない瞬間もあります。予めご了承ください。

現在はCentOS 7上で開発していますが、MacOS上でも動作する手順書を用意する予定があります。また、クライアントのサンプルプログラムではgRPCを採用していますが、個人的にはC++なライブラリとして利用します。なので、人気のあるプログラミング言語向けに言語拡張を作成することも予定しています。

Nameltiの今後

いろいろ書いてきましたが、この記事を書くために手を挙げたときには、こんな内容になると思っていませんでした。なぜなら、夏休みのブログを書いた後は、記事に関連して書いたコードを整備してOSSにするぞ、と意気込んでいたのです。

しかし、人生いろいろあるもので、他のことに興味が移ってしまい、別のネタ(この記事で取り上げた、人名の読み仮名候補の自動列挙)でも書き始めたのです。結果として、あとで書き始めた方が早く出ました。課題が明確で、解く必要がある小問題の領域が見積もれることは、ソフトを書く際にとても大切ですね。

今回紹介したNameltiは、今後も機能や付帯する辞書資源を徐々に拡張します。また、今回は存命な人物というカテゴリに属する名前の読み仮名に着目しましたけど、辞書を入れ替えてパラメタを調整すれば、別のカテゴリに属する何かの名前の読み仮名も、後段の人手による選択に活用しやすい形で自動列挙できると思います。同じ様な課題に取り組んでいるエンジニアの方が様々な組織に少しづつだけいらっしゃると想像していますので、気軽に情報交換できたら嬉しいです。

今後、Nameltiを業務で使う機会があった場合は、このブログやイベントにおけるブース出展時などにご報告します。

おわりに

冒頭で述べたとおり LINE Advent Calendar 2018 はこれでオシマイです。読んでくださった方ありがとうございます。全記事読んでくださった方は素晴らしいです。是非一緒に働いてみたいので、弊社の採用情報もぜひ全読破して頂けますと嬉しいです(笑)

それでは、夏にやってくる Summer Homework 2019 をお楽しみに !!

参考文献

[1] 外国人名のカタカナ表記自動推定システムの改良, 安江祐貴, 佐藤理史, 松崎拓也, 2017


[2] 音声とテキストからの語彙獲得による読み推定精度の向上, 笹田鉄郎, 森信介, 河原達也, 2008


[3] 検索エンジンを用いた人名読みの推定, 酒巻智宏, 大向一輝, 丹英之, 武田英明, 2010


[4] 人名のモノルビ自動付与手法, 宮﨑太郎, 加藤直人, 2013


Related Post