PythonのNLPライブラリ入門 - NLTKと spaCyの比較

NLPで使用されている2つの重要なライブラリはNLTKとspaCyです。両者にはそれぞれ性質が異なる。

機能性・言語対応

NLTKは、研究者のためさまざまな問題のために選択するアルゴリズムを提供するが、逆にこれは開発者のための悩みの種となっています. 一方、spaCyは、そのツールキット内の問題に最適なアルゴリズムを保持し、state of artを常に更新し続けている。 一方でNLTKは様々な言語に対応している点では分があると言える。spaCyは7つの言語(英語、ドイツ語、スペイン語、フランス語、ポルトガル語、イタリア語、オランダ語)に対応した統計モデルを持っている。また、多言語に対応した名前付きエンティティもサポートしている。 また最近リクルートからSpacy日本語対応の鍵となるライブラリGINZAがでたことで、実質日本語でも利用可能となった。 (spaCy と GiNZA の関係性は、自然言語の文字列を形態素に分割する Tokenizer, spaCy の統計モデルに相当する Language といった部分の実装を GiNZA が担当している。)

アーキテクチャ

NLTKは文字列処理ライブラリで、文字列を入力として受け取り、出力として文字列または文字列のリストを返します。一方 spaCy はオブジェクト指向のアアーキテクチャを採用している。テキストを解析すると、単語や文章をオブジェクト化したドキュメントオブジェクトが返されます。 また、NLTKがサポートしていないのに対し、spaCyは単語ベクトルをサポートしています。 spaCyは最新のアルゴリズムを使用しているため、NLTKと比較して性能は通常良好です。以下に示すように、単語のトークン化とPOSタグ付けではspaCyの方が性能が良いのですが、文のトークン化では、NLTKがspaCyを上回っています。文章のトークン化でのパフォーマンスが低いのは、アプローチの違いによるものです。NLTKは、テキストを文に分割しようとします。対照的に, spaCyは各文に対して構文木を構築します, テキストについてのより多くの情報が得られるよりロバストな方法といえる。