はじめに
本記事ではnltk
に収録されているコーパスの利用方法を紹介します.
公式ドキュメント:
以下では,まずは収録コーパスを扱うためのメソッドを紹介した後,収録されている主なコーパスの紹介を行います.なお,メソッドの紹介のサンプルコードでは,収録コーパスとして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は様々なコーパスを収録しています.
詳しくは以下のリンクを参照ください.