ワードエンベディングモデルしか触らないNLPエンジニアとしての仕事の紹介

この記事は、自然言語処理 Advent Calendar 2019の16日目の記事です。
https://qiita.com/advent-calendar/2019/nlp

この記事では、私が勤めるLuminosoという会社及びその技術、そこで私がどのような仕事をしているか、ということを紹介します。

どんな会社なの?

アンケートや口コミなどのデータを解析して顧客の声や従業員の声を解析したり、業務報告書などを解析してあいまい検索を行うようなサービスを提供するボストン発のMITスピンアウトのスタートアップです。

もう少しNLPの技術者向けに説明すると、セマンティック辞書に基づいて補正したワードエンベディングベクトルモデルを、ドメインデータでfine-tuningすることで、少量のデータで前処理込でユーザ毎のモデルを高速に作成するサービスを提供している会社です。

何をやっているの?

ソリューションアーキテクトとして、会社製品の活用についてコンサルティングしたり、出力結果を活用するツールを開発してお客様に提供したりしています。

自社ワードエンベディングモデルの概要

ConceptNet という、人間の常識を蓄積したオープンナレッジグラフをセマンティック辞書として、従来手法によって作成されたワードエンベディングモデルにレトロフィッティングやバイアス除去などを適用して作成したオープンデータのワードエンベディングモデル、 ConceptNet-Numberbatch をベースとしています。

詳細はこのビデオのこのあたりを観てください。
https://youtu.be/IEZxMhm1kV0?t=1289

ワードエンベディングについてはこのアドベントカレンダーの読者のほとんどには既知の話だと思うので省略します。

ConceptNetは、人間世界における常識をナレッジグラフとして集積したオープンデータです。例えば、「りんご」は「果物」の類型の一つであり、「赤い」や「赤または緑」という要素を持ち、「🍎」という記号で表される、などです。
ConceptNetは公開Webサイトで誰でも試すことができます。りんごの例は以下のURLからアクセスして確認することができます。
http://conceptnet.io/c/ja/%E3%82%8A%E3%82%93%E3%81%94

レトロフィッティング(Retrofitting)というのは、ワードエンベディングモデルをセマンティック辞書を使って意味的な情報に基づいて補正をかけるという手法です。例えば、「実行」と「実施」は類義語の関係にあるので、データソースにおいて文脈上何も関係がなかったとしてもベクトルの距離を近づける、などです。

バイアス除去というのは、元データに存在する様々な偏見を除去するための手法です。例えば、ある国におけるマイノリティがネガティブな単語と結びつくというのはバイアスの一つなので、これの除去を行います。

こうして作成されたものが ConceptNet-Numberbatch で、出力結果のモデルはGitHub上で公開されています。
https://github.com/commonsense/conceptnet-numberbatch

製品版はここからさらに拡張していて、ドメインデータを取り込んだ後、前処理を自動で実施した後にfine-tuningしてドメイン毎のモデルを作成します。

どういうメリットがあるの?

数千行のデータで、辞書作成や前処理をせずに、非常に小さい計算リソースしか利用せず(GPUも使わない)、数分から数十分という単位でベクトルモデルを作成できます。

最大のメリットは、未知語、表記ゆれ、略語などに非常に強いということです。たとえば「自然言語」と「NLP」は、適切な例文さえ用意できれば辞書がなくても容易に類義語だと見分けることができるでしょう。社内の専門用語も、他のどの用語と意味的に関連が深いかということを見分けることができるようになります。

銀の弾丸なの?

残念ながらそうは甘くありません。

skip-gram モデルによって基礎となる単語ベクトルを作成している以上、単語の出現順番が大きく影響します。そのため、テンプレート文に非常に弱いという特徴があります。「いつもお世話になっております。」という文章が繰り返し出現するだけで、「いつも」と「お世話」が非常に関連が高いと解釈してしまうでしょう。

文単位での解析しか行わないため、パラグラフ単位や章単位などの大きな単位のメタ情報を考慮できないという問題もあります。しかし、こうした長文を解析したいというニーズはあるため、色々な工夫をしてお客様にご提供しています。(業務に深く関わる話なのでこの辺は省略)

どうやって仕事をしているの?

私は、業務としてはNLPを扱うエンジニアではありますが、辞書作成もモデル作成も全くしていません。ひたすらベクトルを扱い続けます。 ELMo や BERT といった流行りの技術も全く扱いません。

扱うライブラリはほぼ pandas と numpy です。
たとえば一番高頻度に実施する処理は、ドット積を取ることによるベクトルの距離計算です。これはそのまま類似度に使うことができるため、この結果をもとに様々な処理に応用できます。

テンプレートの削除など、現場では結局のところ前処理が必要になります。不要なテンプレート文の削除などの処理を行わないと、効率よく解析できなくなります。前処理はほとんどPython標準の文字列関数や正規表現で行っていますが、たまに spaCy を使うこともあります。

解析した結果を使いながら、お客様が望むような仕組みを作るためにコードを書いたり仕組みを設計したりするということを行っています。

多分、NLPと名のつくエンジニアの中でもかなり特殊な仕事をしているでしょうし、NLPのエンジニアの中には、私のような仕事はNLPではないと言う人もいるかもしれません。

製品としてモデルを勝手に作ってくれるので、そのモデルをいじるのではなく、そのクセを考えながら、お客様が望むようなシステムを提供するにはどうすればいいかを検討するというのが普段私がやっている仕事になります。

仕事の一例として、ベクトルデータを使った検索アプリケーションというものがあります。

明日の情報検索・検索エンジン Advent Calendar 2019ではそちらについて簡単に触れたいと思います。
https://qiita.com/advent-calendar/2019/search

まとめ

Luminosoは、自社製のワードエンベディングモデルを提供する会社です。そこで働くエンジニアである私は、辞書作成やモデル作成といったことを行わず、ベクトルばかり触っているという、NLPのエンジニアとしてはちょっと変わった仕事をしていますよ、ということを紹介しました。