【NLTK】NLTKに収録されているコーパスの利用方法

はじめに

本記事ではnltkに収録されているコーパスの利用方法を紹介します.

公式ドキュメント:

www.nltk.org

以下では,まずは収録コーパスを扱うためのメソッドを紹介した後,収録されている主なコーパスの紹介を行います.なお,メソッドの紹介のサンプルコードでは,収録コーパスとしてreutersを使用することにします.

モジュールのインポート

from nltk.corpus import コーパス名

仮にReutersコーパスをインポートしたければ

from nltk.corpus import reuters

と書けます.

メソッド

ファイルIDの一覧を取得

.fileids()でファイルIDの一覧を取得できます.

返り値は <class 'list'>です.

コーパスは一つのファイルに大量に記述されているわけではなくて,多数のファイルに分割されて収録されています.また,各ファイルにはファイルID(=ファイル名)が割り振られているので,その一覧を取得できます.

from nltk.corpus import reuters
fileids = reuters.fileids()
print(fileids[:5])
print('ファイル数:', len(fileids))
'''
出力:
['test/14826', 'test/14828', 'test/14829', 'test/14832', 'test/14833']
ファイル数: 10788
'''

あるファイルIDのコーパスを取得

.raw(ファイルID)で,ファイルIDと対応したコーパスを取り出せます.ファイルIDはリストによる複数指定もできます.

返り値は<class 'str'>です.

from nltk.corpus import reuters
fileid = reuters.fileids()
print(reuters.raw(fileid[0]))
'''
出力:
ASIAN EXPORTERS ...(省略)... the dispute.
'''

カテゴリ一覧を取得

.categories()で,コーパスのカテゴリ一覧を取得できます.

返り値は <class 'list'>です.

カテゴリーはいわゆるトピックです.

from nltk.corpus import reuters
categories = reuters.categories()
print(categories[:5])
print('カテゴリ数:',len(categories))
'''
出力:
['acq', 'alum', 'barley', 'bop', 'carcass']
カテゴリ数: 90
'''

あるファイルIDのカテゴリを取得

.categories(ファイルID)とすることで,ファイルIDに対応するカテゴリを取得できます.ファイルIDはリストによる複数指定もできます.

from nltk.corpus import reuters
fileids = reuters.fileids()
print(reuters.categories(fileids[0]))
'''
出力:
['trade']
'''

あるファイルIDのコーパスの単語リストを取得

.words(ファイルID)で,単語リストを取得できます.ファイルIDはリストによる複数指定もできます.

この単語リストは,単にコーパスを単語分割したものです.よって要素に重複があります.単語集合を得たい場合はset()で変換するなどの工夫が必要です.

from nltk.corpus import reuters
fileids = reuters.fileids()
print(reuters.words(fileids))
'''
出力:
['ASIAN', 'EXPORTERS', 'FEAR', 'DAMAGE', 'FROM', 'U', ...]
'''

また,categories=オプションで,特定のカテゴリに属する単語リストを取得できます.トピックに依存した何かを研究する際に有効です.

以下の例は意図的に出力の範囲をいじっていますが,単語が重複する具体例になっています.

from nltk.corpus import reuters
print(reuters.words(categories=['earn'])[216:228])
'''
出力:
['Trading', 'profit', '63', '.', '4', 'mln', 'vs', '45', '.', '1', 'mln', 'Trading']
'''

また,以下では単語リストを単にset()でくくり,集合に変換しています.結果を見ると,reutersコーパスのearnカテゴリでは,41万単語のうち39万単語ほどは重複していることが分かります.

from nltk.corpus import reuters
words = reuters.words(categories=['earn'])
print(len(words), len(set(words))) # 414011 16914

あるファイルIDのコーパスの文リストを取得

.sents(ファイルID).sents(categories=カテゴリ)で,文リストを取得できます.

from nltk.corpus import reuters
sents = reuters.sents(categories=['earn'])
print(sents[3])
'''
出力:
['Amatil', ',', 'in', 'which', 'B', '.', 'A', '.', 'T', '.']
'''

主な収録コーパス

Gutenberg Corpus

(おそらく文学作品を中心とした)文献の一部が利用できる英語コーパスです.著作権切れの文献を電子化する「プロジェクト・グーテンベルク」によって収集されたものの一部になります.例えば,シェイクスピアハムレットなんかが収録されています.カテゴリは付与されていないようです.

from nltk.corpus import gutenberg
print('ファイル数:',len(gutenberg.fileids()))
print('単語数:', len(gutenberg.words()))
print('文数:', len(gutenberg.sents()))
'''
ファイル数: 18
単語数: 2621613
文数: 98552
'''

Web and Chat Text

あまり整理されていない,ちょっと雑な文章が集められた英語コーパスです.入手元として,FireFoxのフォーラム,ニューヨークで聞こえてきた会話,ワインのレビューなどが挙げられています.カテゴリは付与されていません.

from nltk.corpus import webtext
print('ファイル数:',len(webtext.fileids()))
print('単語数:', len(webtext.words()))
print('文数:', len(webtext.sents()))
'''
ファイル数: 6
単語数: 396733
文数: 25728
'''

Brown Corpus

ブラウン大学による英語のコーパスです.文書にはカテゴリが付与されています.主なカテゴリの説明については以下が参考になります.

https://www.nltk.org/book/ch02.html#tab-brown-sources

from nltk.corpus import brown
print('ファイル数:',len(brown.fileids()))
print('カテゴリ数:',len(brown.categories()))
print('単語数:', len(brown.words()))
print('文数:', len(brown.sents()))
'''
ファイル数: 500
カテゴリ数: 15
単語数: 1161192
文数: 57340
'''

Reuters Corpus

ロイターのニュース記事コーパスです.trainとtestのファイルに分けられていて,ファイルIDを見ればどちらなのか分かるようになっています.

ニュース記事なのでタイトルと本文が含まれますが,タイトルを示す文字列は全て大文字で保存されています.

from nltk.corpus import reuters
print('ファイル数:',len(reuters.fileids()))
print('カテゴリ数:',len(reuters.categories()))
print('単語数:', len(reuters.words()))
print('文数:', len(reuters.sents()))
'''
ファイル数: 10788
カテゴリ数: 90
単語数: 1720901
文数: 54716
'''

Inaugural Address Corpus

歴代アメリカ大統領の演説コーパスです.ファイルIDは西暦-大統領名になっています.カテゴリの付与はありません.

from nltk.corpus import inaugural
print('ファイル数:',len(inaugural.fileids()))
print('カテゴリ数:',len(inaugural.categories()))
print('単語数:', len(inaugural.words()))
print('文数:', len(inaugural.sents()))
'''
ファイル数: 58
単語数: 149797
文数: 5050
'''

様々なアノテーション済みコーパス

上記で紹介したコーパス以外にも,NLTKは様々なコーパスを収録しています.

詳しくは以下のリンクを参照ください.

http://www.nltk.org/nltk_data/