Natural-language-toolkit-corpus-readers-and-custom-corpora

提供:Dev Guides
移動先:案内検索

コーパスリーダーとカスタムコーパス

コーパスとは?

コーパスは、自然なコミュニケーション環境で生成された機械可読テキストの構造化された形式の大規模なコレクションです。 コーパスという言葉はコーパスの複数形です。 コーパスは次のように多くの方法で導出できます-

  • もともと電子だったテキストから
  • 話し言葉の筆記録から
  • 光学式文字認識などから

コーパスの代表性、コーパスバランス、サンプリング、コーパスサイズは、コーパスを設計する際に重要な役割を果たす要素です。 NLPタスクの最も人気のあるコーパスのいくつかは、TreeBank、PropBank、VarbNet、WordNetです。

カスタムコーパスを構築する方法は?

NLTKのダウンロード中に、NLTKデータパッケージもインストールしました。 したがって、NLTKデータパッケージがコンピューターにインストールされています。 Windowsについて説明する場合、このデータパッケージは C:\ natural_language_toolkit_data にインストールされていると想定し、Linux、Unix、Mac OS Xについて説明する場合は、このデータパッケージが /usrにインストールされていると想定します。/share/natural_language_toolkit_data

次のPythonレシピでは、NLTKで定義されたパスの1つに含まれている必要があるカスタムコーパスを作成します。 NLTKで見つけられるからです。 公式のNLTKデータパッケージとの競合を回避するために、ホームディレクトリにカスタムのnatural_language_toolkit_dataディレクトリを作成します。

import os, os.path
path = os.path.expanduser('~/natural_language_toolkit_data')
if not os.path.exists(path):
   os.mkdir(path)
os.path.exists(path)

出力

True

さて、ホームディレクトリにnatural_language_toolkit_dataディレクトリがあるかどうか確認してみましょう-

import nltk.data
path in nltk.data.path

出力

True

出力がTrueになったので、ホームディレクトリに nltk_data ディレクトリがあることを意味します。

次に、 wordfile.txt という名前のワードリストファイルを作成し、 nltk_data ディレクトリ*(〜/nltk_data/corpus/wordfile.txt)のcorpusという名前のフォルダーに配置し、 *nltkを使用してそれをロードします。 data.load

import nltk.data
nltk.data.load(‘corpus/wordfile.txt’, format = ‘raw’)

出力

b’finddevguides\n’

コーパスリーダー

NLTKは、さまざまなCorpusReaderクラスを提供します。 以下のpythonレシピでそれらをカバーします

単語リストコーパスの作成

NLTKには、単語のリストを含むファイルへのアクセスを提供する WordListCorpusReader クラスがあります。 次のPythonレシピでは、CSVまたは通常のテキストファイルであるワードリストファイルを作成する必要があります。 たとえば、次のデータを含む「list」という名前のファイルを作成しました-

finddevguides
Online
Free
Tutorials

次に、作成したファイル ‘list’ から単語のリストを生成する WordListCorpusReader クラスをインスタンス化します。

from nltk.corpus.reader import WordListCorpusReader
reader_corpus = WordListCorpusReader('.', ['list'])
reader_corpus.words()

出力

['finddevguides', 'Online', 'Free', 'Tutorials']

POSタグ付き単語コーパスの作成

NLTKには TaggedCorpusReader クラスがあり、これを使用してPOSタグ付き単語コーパスを作成できます。 実際、POSタグ付けは、単語の品詞タグを識別するプロセスです。

タグ付きコーパスの最も単純な形式の1つは、茶色のコーパスからの抜粋に続く「単語/タグ」の形式です-

The/at-tl expense/nn and/cc time/nn involved/vbn are/ber
astronomical/jj ./.

上記の抜粋では、各単語にそのPOSを示すタグがあります。 たとえば、 _ vb_ は動詞を指します。

ここで、* TaggedCorpusReader クラスをインスタンス化して、上記の抜粋を含むファイル *‘list.pos’ からPOSタグ付きの単語を生成してみましょう。

from nltk.corpus.reader import TaggedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.pos')
reader_corpus.tagged_words()

出力

[('The', 'AT-TL'), ('expense', 'NN'), ('and', 'CC'), ...]

チャンク句コーパスの作成

NLTKには、チャンクフレーズコーパスを作成できる ChnkedCorpusReader クラスがあります。 実際、チャンクは文の短いフレーズです。

たとえば、タグ付きの treebank コーパスからの次の抜粋があります-

[Earlier/JJR staff-reduction/NN moves/NNS] have/VBP trimmed/VBN about/
IN [300/CD jobs/NNS] ,/, [the/DT spokesman/NN] said/VBD ./.

上記の抜粋では、すべてのチャンクは名詞句ですが、括弧内にない単語は文ツリーの一部であり、名詞句サブツリーの一部ではありません。

*ChunkedCorpusReader* クラスをインスタンス化して、上記の抜粋を含むファイル *‘list.chunk’* からチャンクフレーズを生成してみましょう。
from nltk.corpus.reader import ChunkedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.chunk')
reader_corpus.chunked_words()

出力

[
   Tree('NP', [('Earlier', 'JJR'), ('staff-reduction', 'NN'), ('moves', 'NNS')]),
   ('have', 'VBP'), ...
]

分類されたテキストコーパスの作成

NLTKには、分類されたテキストコーパスを作成できる CategorizedPlaintextCorpusReader クラスがあります。 大きなテキストのコーパスがあり、それを別々のセクションに分類したい場合に非常に役立ちます。

たとえば、茶色のコーパスにはいくつかの異なるカテゴリがあります。 次のPythonコードの助けを借りてそれらを見つけましょう-

from nltk.corpus import brown^M
brown.categories()

出力

[
   'adventure', 'belles_lettres', 'editorial', 'fiction', 'government',
   'hobbies', 'humor', 'learned', 'lore', 'mystery', 'news', 'religion',
   'reviews', 'romance', 'science_fiction'
]

コーパスを分類する最も簡単な方法の1つは、カテゴリごとに1つのファイルを用意することです。 たとえば、 movie_reviews コーパスからの2つの抜粋を見てみましょう-

movie_pos.txt

細い赤い線に欠陥がありますが、それは誘発します。

movie_neg.txt

大きな予算と光沢のある作品は、テレビ番組に浸透する自発性の欠如を埋め合わせることができません。

したがって、上記の2つのファイルから、 posneg という2つのカテゴリがあります。

次に、 CategorizedPlaintextCorpusReader クラスをインスタンス化します。

from nltk.corpus.reader import CategorizedPlaintextCorpusReader
reader_corpus = CategorizedPlaintextCorpusReader('.', r'movie_.*\.txt',
cat_pattern = r'movie_(\w+)\.txt')
reader_corpus.categories()
reader_corpus.fileids(categories = [‘neg’])
reader_corpus.fileids(categories = [‘pos’])

出力

['neg', 'pos']
['movie_neg.txt']
['movie_pos.txt']