自然言語処理をサービスで活用しよう! Sansanに学ぶ「多種多様なテキスト」からのデータ分析

自然言語処理をサービスに投入し、“できること”とは?名刺管理サービス「Sansan」を提供するSansan社では、名刺に記載された情報のデータ化において、自然言語処理を徹底的に活用しています。同社のデータ統括部門DSOCで日夜研究を続ける奥田裕樹さんと高橋寛治さんの2人に、サービスの裏で動く、自然言語処理のユースケースを語っていただきました。

自然言語処理をサービスで活用しよう! Sansanに学ぶ「多種多様なテキスト」からのデータ分析

名前や企業名、電話番号、メールアドレス──。名刺のなかには、重要な個人情報がテキストの形で記載されています。

そういった情報や企業のWebページ情報などを解析し、ユーザーに有効活用してもらうべく研究開発を続けているのが、法人向けクラウド名刺管理サービス「Sansan」や個人向け名刺アプリ「Eight」を提供するSansan株式会社です。同社はいわば、日本でも有数の自然言語処理に注力する企業なのですが、どのような手段でサービスに自然言語処理を組み込もうとしているのでしょうか?

Sansanのデータ統括部門であるDSOCData Strategy & Operation Centerで自然言語処理の研究に携わる奥田裕樹さんと高橋寛治さんに、これまで取り組んできたプロジェクトや、用いてきた手法について徹底解説してもらいました。

1
奥田 裕樹(おくだ・ゆうき/写真左)Sansan株式会社 DSOC(Data Strategy & Operation Center)、R&D Group 研究員
奈良先端科学技術大学院大学修士課程修了。大学院ではバイオインフォマティクス領域にて遺伝子の発現解析などを研究し、前職では機械学習や自然言語処理を用いた企画・開発に従事。現在は、研究分野にとらわれず、さまざまな機械学習の技術をプロダクトに活用する道を模索している。
高橋 寛治(たかはし・かんじ/写真右)Sansan株式会社 DSOC(Data Strategy & Operation Center)、R&D Group 研究員
長岡技術科学大学大学院工学研究科 修士課程 電気電子情報工学専攻修了。在学中は、解析ツールの研究開発や機械翻訳の評価手法の考案など、自然言語処理の研究開発に取り組む。現在は、キーワード抽出など自然言語処理に関連する研究開発に従事。

どの企業に関する記事か? を自動的に判別する

2

個人向け名刺アプリEightでは、過去に名刺を交換した人の近況や企業ニュースをフィード機能で知ることができる。ユーザーが関連企業ニュースを投稿する際、企業とニュースを紐付ける企業名の抽出に、自然言語処理が用いられている。

──フィード機能を実現するために、どのような手順を踏んでいるのでしょうか?

高橋 フィードの機能は、大きく次の3つのステップに分かれています。

  1. 投稿された記事のURL情報をもとにページのHTML情報を取得する
  2. HTML情報からタイトルと本文を抽出する
  3. 本文から企業名を取り出す

現在、3.を実現するための開発を続けています。いま動作しているものは、企業名の辞書登録やブラックリストの作成、省略語辞書といった素朴なルールを用いて対応しています。

──実装にあたり、苦労した部分はありますか?

高橋 いくつかありますが、まずは2.で適切に本文を抽出する処理です。後々のメンテナンスを考えなければ、各サイトの仕様に合わせて「○○のタグがあった場合には△△の中身を抽出する」といったような条件分岐をひたすら書いていけばいいでしょう。

ですが、その実装方法ではページ構造が変わった場合のメンテナンスがさすがに大変です。可能な限りメンテナンスの手間を省力化できる実装方法を検討しました。

3

──どのような方法が候補に挙がったのでしょうか?

高橋 最初は、機械学習を用いて系列ラベリングによってタグ付けをしていく方法も候補に挙がりました。ですが、サイボウズ・ラボの中谷秀洋さんが行っていた「CRFを使ったWeb本文抽出」という先行研究を発見したため、採用を断念したんです。

4WebDB Forum 2011で「CRFを使ったWeb本文抽出」を発表してきました - Mi manca qualche giovedi`?5

この研究では、系列ラベリングを解く手法であるCRFではあまり精度が出ず、うまくいかないと記載されていました。その代わり、HTMLタグの入れ子具合を数値化して、その閾値によって文字列を取得する・しないを決める手法は精度もパフォーマンスもよく、さらに中谷さんはExtractContentという本文抽出用のRubyモジュールも実装・公開されていました。

そこで、中谷さんが検証された内容を参考に、HTMLタグの入れ子具合をもとに判定する手法をとりました。私の作業は大きく2つで、既存スクリプトのPython 3対応と、パラメーターの調整です。

† 高橋さんが研究を開始した時点で、ExtractContentをPython用に書き直したpython-extracontentが既に存在していた。高橋さんはそれを修正し、次のリポジトリで公開している。
6GitHub - kanjirz50/python-extractcontent3: HTMLから本文抽出を行うextractcontent.rb の Python3版

──他に、より良いサービスにするために工夫した点はありますか?

高橋 大きく分けて2つの工夫をしています。まず、2~3文字の企業の場合、すべての企業を辞書登録するのではなくて、ある程度規模の大きな企業だけに絞ることです。要するに、「流通している名刺ということは、人がある程度多い企業である」という仮定を置いて、まずは大部分の企業をキャッチアップできる方向性にしました。

それから、フィード機能のインターフェースを工夫しました。候補となる企業を1つだけではなく、関連している可能性が高い企業をいくつか出して、ユーザー側で選択してもらう仕様にしたんです。これにより、精度が上がらない場合でも、ユーザーに問題なく使ってもらえるようになりました。

判定の精度を上げることは大事ですが、限られた時間やリソースのなかでは、高精度に持っていくことが難しいケースもあります。その場合でも、現状の精度をふまえた上で、どんな落とし所にすればサービスが実用可能なものになるかを考えることが大事だと思っています。

──3.は、どのような手段を用いて実現しようとしているのでしょうか?

高橋 固有表現抽出を使って、その系列の中で候補の文字列が企業名らしいかどうかをラベリングするという、よくある固有表現抽出の問題として解こうとしています。現在は学習データの作成に取り組んでいます。

名字と名前をニューラルネットによって分割する

名刺の姓名分割プロジェクトは、与えられた文字列がどのような構造を持つかを推定するタスクである。名字と名前が連結した「奥田裕樹」のような文字列に対し、どこが名字でどこが名前であるかを正確に分割する試みだ。
資料は「文字のゆらぎをどう扱うか? - Sansanにおける自然言語処理の活用」より

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く