spaCyやNLTKをベースにした学習済みの固有表現抽出モデルは素晴らしい結果をもたらしますが、職種やVAT番号、医薬品などの非固有表現を検出するためには、面倒なアノテーションと学習プロセスが必要です。GPT-3、GPT-J、GPT-NeoXのような大規模言語モデルのおかげで、アノテーションや学習なしに、数発の学習であらゆる種類の実体を抽出することができるようになったのです。今回は、その方法を紹介します。
NER(固有表現抽出)とは、基本的に非構造化テキストから構造化情報を抽出することである。NERに初めて触れる方は、まず簡単なイントロダクションをお読みください。 NERの紹介です。
スパシーは、ここ数年、NERのデファクトスタンダードになっています。 (スパシーのウェブサイトを見る). SpaCyは、使いやすさと、制作に適したスピード感が魅力のフレームワークです。
SpaCyはPythonの自然言語処理フレームワークで、多言語の学習済みモデルを多数提案しているため、自分でモデルを学習しなくても、複数のエンティティタイプ(会社、都市、住所、日付など)を自分の言語で簡単に抽出することが可能です。
NLTKもPythonによるエンティティ抽出のための興味深い選択肢ですが、デフォルトで提案されるエンティティが少なく、一般的にNLTKは実稼働には推奨されません(教育・研究用フレームワークの意味合いが強いです)。
しかし、これらのフレームワークでは、ネイティブでサポートされているエンティティの数が限られているため、すぐに限界に達してしまう。多くの企業は、人物情報、財務データ、医療行為など、特定のビジネス情報を抽出するためにNERを活用したいと考えています。もちろん、これらのエンティティはspaCyの事前学習済みモデルではデフォルトでサポートされていないため、これを実現するには、独自のデータセットを作成し、そこから独自のモデルを学習させる必要があります。
スパシーモデルの学習は、膨大な数のサンプルを作成し、それにアノテーションを施すという、長く退屈なアノテーション作業である。モデルが適切に学習するためには、非常に大量の例が必要です。優れたアノテーションツール(spaCyのProdigyなど)もありますが、それでも多くの自然言語処理プロジェクトが頓挫する原因となっている、つらい作業です。
GPT-3、GPT-J、GPT-NeoXなどの大規模言語モデルの台頭により、アノテーションや新しいモデルの学習なしに、任意のエンティティを抽出することが可能になりました!良いニュースです。
テキスト生成のための大規模な言語モデルは、最近GPT-3で登場し始めました。 (GPT-3について詳しくはOpenAIのウェブサイトをご覧ください。). OpenAIが1750億のパラメータからなるGPT-3モデルを発表したとき、それは革命だった。なぜなら、自然言語処理に基づく多くの最先端AIアプリケーションに、追加のトレーニングを必要としない道を開いたからである。
GPT-3のようなGPTモデルの最初の目標は、テキストを生成することです:モデルに入力を与えるだけで、あとは生成してくれます。テキスト生成をベースに、分類、要約、会話AI、言い換え...そしてもちろん固有表現抽出など、あらゆる自然言語処理のユースケースを実現することができる。
GPT-3はオープンソースのモデルではないので、オープンソースコミュニティはGPT-3の代替品に取り組み、現在では2つの素晴らしいオープンソースの同等品があります。GPT-JとGPT-NeoXです。GPT-JとGPT-NeoXです。まだGPT-3ほど大きくはありませんが、オープンソースコミュニティがOpenAIに追いつくのは時間の問題であることは間違いないでしょう。
これらのモデルを適切に活用するためには、「数撃ちゃ当たる学習」という新しい手法が必要です。
このような大型のGPTモデルは、非常に迅速に学習することができます。
例えば、GPT-3に短い商品説明文を生成してもらうとします。以下は、数撃ちゃ当たるの学習をしない例です。
Generate a product description containing these specific keywords: t-shirt, men, $50
得られる反応は無駄なものでしょう。例えばこんな感じでしょうか。
Generate a product description containing these specific keywords: t-shirt, men, $50 and short.
The product description needs to be a few words long. Don’t use plurals, use the keywords in the order they are
良い知らせです。モデルにいくつかの例を与えるだけで、ずっと良い結果を得ることができます。
Generate a product description containing specific keywords.
Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1499
Result:
このような結果になります。
Generate a product description containing specific keywords.
Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1,499
Result: The best gaming GPU on the market, at the price of $1,499 only.
このように、最初に与えた3つの例のおかげで、モデルからの応答は完璧に目的通りとなっていることがわかります。しかし、このモデルはこのような商品説明文生成のタスクで訓練されたことは一度もありません。これが「数撃ちゃ当たる」の手法で、数個の例だけでその場で「転移学習」を行うのです。このような結果を得るためには、通常、自然言語処理モデルを大量の例で学習させることが期待されますが、ここではそうではありません。
ここで、数撃ちゃ当たるの学習により、エンティティ抽出を行う。
例えば、Webサイトから職種名を抽出したいとします。実際に依頼する前に、いくつかの職種名抽出の例を挙げるだけでよいのです。
Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:
という結果になります。
Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title: CTO
お気づきのように、数撃ちゃ当たるの例を作るには頭を使わなければなりません。職種が全く見つからないこともあり得るので、「none」を返す例を作成しました(誤検出を避けるためです)。同時に複数の職種を抽出したい場合はどうすればよいでしょうか。その場合は、複数のジョブタイトルを返す例も作成することが重要です(たとえば、カンマで区切られたジョブタイトルなど)。
さらに多くの例を追加することで、さらに良い結果を得ることができます。そして、例題は実際の最終的なリクエストにできるだけ近いものにすることが重要です。例えば、単なる文章ではなく、段落全体を分析することがわかっている場合は、段落のある例を作成するのがベストです。
GPTモデルを利用できない場合は、単純にNLPクラウドAPIを利用することができます。いくつかのクライアントが利用可能です(Python, Go, Node.js, Ruby, PHP...)。ここでは、PythonクライアントでGPT-Jを使う例を紹介します。
import nlpcloud
client = nlpcloud.Client("gpt-j", "your API token", gpu=True)
client.generation("""Extract job titles from the following sentences.
Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:""",
top_p=0.1,
length_no_input=True,
remove_input=True,
end_sequence="###",
remove_end_sequence=True
)
という結果になります。 CTO
先ほどのテキスト生成のパラメータについて、簡単に説明します。
GPT-Jがあまり独創的な結果を作らないように、非常に低いトップp値を設定しました。
"length_no_input" は、最大長の値に入力テキストを考慮しないことを意味します。
"remove_input" は、入力テキストを結果から削除することを意味します。
"end_sequence "は、モデルがこの文字に出会ったとき、テキストの生成を停止することを意味します。数撃ちゃ当たるの例では、各回答の最後に「##」を追加したので、モデルは回答生成後に自動的に「##」を生成し、そこで停止することになります。
"remove_end_sequence" は、レスポンスから "###" を削除したいことを意味します。
詳細は、NLPクラウドのドキュメントで確認できます。 はこちらでご覧ください。
GPTモデルでエンティティを抽出すると、モデルが学習していなくても、その場で新しいエンティティを抽出することができるため、自由度が高いのです
しかし、その代償として、これらの大規模な言語モデルは巨大であり、比較的遅い。
例えば、GPT-JやGPT-NeoXを使う場合は、NVIDIA RTX A6000やA40のようなVRAMを大量に搭載した巨大なGPUが必要になるのです。また、多少のレイテンシも発生します(エンティティの抽出には500ms程度かかります)。逆に、spaCyやNLTKの方がインフラ的にはずっと高速で、コストもかからないでしょう。
2022年には、アノテーションやトレーニングなしで、高度なNERを非常に簡単に実行できるようになるのですこれは、企業がエンティティ抽出プロジェクトをより早く提供することに大いに役立ち、また、自然言語処理に基づくより最先端のアプリケーションを可能にします。
しかし、GPT-3、GPT-J、GPT-NeoXのような大規模な言語モデルはコストがかかるので、インフラにかかるコストは軽視できません。
この記事があなたの時間とお金の節約に役立てば幸いです
Julien Salinas
NLP CloudのCTO。