どう名寄せすれば「同じ企業であること」を判定できる?
まず発表されたのは、奥田氏によるセッション「文字のゆらぎをどう扱うか? - Sansanにおける自然言語処理の活用」だ。
「Sansanにおける名刺データ化の精度は99.9%を誇っていますが、一方で、残り0.1%をどう上げるかは非常に難しい課題となっています。ここでは、『会社名をどう名寄せするか』というテーマに絞ってお話をさせていただきます」(奥田氏)
名刺に掲載されている会社名には、表記のゆらぎがある。例えば、かつてSansan株式会社は漢字の三を2つ並べた「三三株式会社」という社名だった。英語表記であれば「Sansan.inc」になる。
つまり、特定の企業に多種多様な社名がひもづくケースがあるのだ。それらすべての社名を、同一の企業であると判定しなければならない。この課題に対して、Sansanでは自然言語処理を用いて精度向上に取り組もうとしている。用いている手法は主に3つだ。
「1つ目は『文字列の編集距離を元にした類似度』を用いる手法です。例えば、Sansan株式会社とYonyon株式会社という2つの社名があった場合、『n』や『株式会社』は両方に共通する文字です。しかし、『s』と『y』、『a』と『o』という文字は異なっています。
1つの文字を変更するコストを1とするならば、両者を同じ文字列にするのに必要なコストの合計は4になります。これがSansan株式会社とYonyon株式会社との編集距離です。この距離が大きければ、別の会社であると判定します」
この手法のメリットは、高速に動作することやインデックスを事前に作成しておけば処理を大幅に削減できることだ。一方で、まとまった単位の文字の入れ替わり(Sansan株式会社が株式会社Sansanになっているなど)に弱い、文字の長さによる影響を受けやすい(重要でない文字列に引っ張られる)などの欠点を持つ。
「2つ目は『単語埋め込みを用いた文章類似度』を用いる手法です。人間は特定の文字列を読む際に、その意味や類似性を理解しながら解読します。例えば、『Sansan』と『日本名刺』よりも、『日本名刺』と『活版印刷』の方が意味が近そうだと判別しているわけです。これと同様に、単語の意味をベクトルで表現し、ベクトル間の距離を計ることで類似度を算出するのがこの手法です。
3つ目の手法は、『Encoder-Decoderを用いた文字列のノイズ除去』です。ディープラーニングを使用し、ノイズを含む文字列を正しい文字列に変換するというものです。この手法はGoogle翻訳の基礎となる技術を応用しており、Cookpadのレシピ素材の正規化などにも用いられています」
Sansanではこうした手法を組み合わせ、トライ&エラーを続けながら精度改善に取り組んでいるそうだ。
ニューラルネットを用いて、「姓」と「名」を分割する
次に奥田氏が解説したのは、ニューラルネットを用いた姓名分割について。これは、与えられた文字列がどのような構造を持つかを推定するタスクである。例えば、「加賀美早紀」という氏名があるとする。このように名前と名字がつながっている文字列に対し、どちらが名字でどちらが名前であるかを正確に分割するというものだ。
「私たちは、複数の手法を用いてこの推定を実現しようとしています。代表的な手法としては、先頭2文字で区切ったり、入力された頻度スコアを使ってもっともらしい分割かどうかを判定したり、ディープラーニングの手法である『BiDirectional LSTM』という系列のモデルや、その派生系である『複数系統の入力を持つBiDirectional LSTM』を用いたりなどがあります」
頻度スコアとは、該当する文字列が「どれほど一般的に用いられているか」を示す指標である。「奥田」という名字は非常にありふれている。一方で、「奥」という名字は珍しい。「奥田裕」という名字は日本には存在しないだろう。このように氏名の登場する“頻度”を指標とすることで、どの箇所で分割するのが正しいかを判別するのだ。
BiDirectional LSTMとは、ニューラルネットの一種で系列のモデルを扱うものだ。このモデルでは、ありとあらゆる「文字列を区切るパターン」を用意し、正解の情報とセットで学習させる。そうすることで、名字と名前を区別させるという試みなのだという。
その亜種である複数系統の入力を持つBiDirectional LSTMは、名字と名前を扱うユニットを別々に用意し、それぞれの出力を統合したニューラルネットワークを構築することで、判定の精度を上げる手法となっている。
「名寄せ」「姓名分割」という領域だけをとっても、数多くの手法がSansanのDSOCでは用いられていることがわかる。同社の分析技術の高さがうかがえるセッションとなった。