Natural-language-toolkit-basics-of-part-of-speech-tagging

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

品詞(POS)タグ付けの基本

POSタグ付けとは何ですか?

分類の一種であるタグ付けは、トークンの説明の自動割り当てです。 記述子を「タグ」と呼びます。これは、品詞(名詞、動詞、副詞、形容詞、代名詞、接続詞とそのサブカテゴリ)、意味情報などの1つを表します。

一方、品詞(POS)のタグ付けについて言えば、単語のリスト形式の文をタプルのリストに変換するプロセスと定義できます。 ここでは、タプルは(word、tag)の形式です。 また、指定された単語に品詞の1つを割り当てるプロセスにPOSタグを付けることもできます。

次の表は、ペンツリーバンクコーパスで使用される最も頻繁なPOS通知を示しています-

Sr.No Tag Description
1 NNP Proper noun, singular
2 NNPS Proper noun, plural
3 PDT Pre determiner
4 POS Possessive ending
5 PRP Personal pronoun
6 PRP$ Possessive pronoun
7 RB Adverb
8 RBR Adverb, comparative
9 RBS Adverb, superlative
10 RP Particle
11 SYM Symbol (mathematical or scientific)
12 TO to
13 UH Interjection
14 VB Verb, base form
15 VBD Verb, past tense
16 VBG Verb, gerund/present participle
17 VBN Verb, past
18 WP Wh-pronoun
19 WP$ Possessive wh-pronoun
20 WRB Wh-adverb
21 # Pound sign
22 $ Dollar sign
23 . Sentence-final punctuation
24 , Comma
25 : Colon, semi-colon
26 ( Left bracket character
27 ) Right bracket character
28 " Straight double quote
29 ' Left open single quote
30 " Left open double quote
31 ' Right close single quote
32 " Right open double quote

Pythonの実験でそれを理解しましょう-

import nltk
from nltk import word_tokenize
sentence = "I am going to school"
print (nltk.pos_tag(word_tokenize(sentence)))

出力

[('I', 'PRP'), ('am', 'VBP'), ('going', 'VBG'), ('to', 'TO'), ('school', 'NN')]

なぜPOSタグ付けなのか?

POSタグ付けは、NLPの重要な部分です。次のように、NLP分析をさらに進めるための前提条件として機能するためです。

  • チャンキング
  • 構文解析
  • 情報抽出
  • 機械翻訳
  • 感情分析
  • 文法分析と単語の明確化

TaggerI-基本クラス

すべてのタガーは、NLTKのnltk.tagパッケージにあります。 これらのタガーの基本クラスは TaggerI であり、すべてのタガーがこのクラスから継承することを意味します。

メソッド-TaggerIクラスには次の2つのメソッドがあり、すべてのサブクラスで実装する必要があります-

  • * tag()メソッド*-名前が示すように、このメソッドは単語のリストを入力として受け取り、タグ付けされた単語のリストを出力として返します。
  • * evaluate()メソッド*-このメソッドを使用して、タガーの精度を評価できます。

TaggerI

POSタギングのベースライン

POSタグ付けのベースラインまたは基本ステップは Default Tagging であり、NLTKのDefaultTaggerクラスを使用して実行できます。 デフォルトのタグ付けは、すべてのトークンに同じPOSタグを割り当てるだけです。 デフォルトのタグ付けは、精度の向上を測定するためのベースラインも提供します。

DefaultTaggerクラス

デフォルトのタグ付けは、 DefaultTagging クラスを使用して実行されます。このクラスは、単一の引数、つまり適用するタグを取ります。

それはどのように機能しますか?

前述のとおり、すべてのタガーは TaggerI クラスから継承されます。 DefaultTagger は* TaggerIクラス*のサブクラスである SequentialBackoffTagger から継承されます。 次の図でそれを理解しましょう-

TaggerIクラス

*SeuentialBackoffTagger* の一部であるため、 *DefaultTagger* は次の3つの引数を取るchoose_tag()メソッドを実装する必要があります。
  • トークンのリスト
  • 現在のトークンのインデックス
  • 前のトークンのリスト、つまり履歴

import nltk
from nltk.tag import DefaultTagger
exptagger = DefaultTagger('NN')
exptagger.tag(['Tutorials','Point'])

出力

[('Tutorials', 'NN'), ('Point', 'NN')]

この例では、最も一般的なタイプの単語であるため、名詞タグを選択しました。 さらに、 DefaultTagger は、最も一般的なPOSタグを選択するときにも最も役立ちます。

精度評価

*DefaultTagger* は、タガーの精度を評価するためのベースラインでもあります。 これが、* evaluate()*メソッドと一緒に使用して精度を測定できる理由です。 * evaluate()*メソッドは、タグ付けされたトークンのリストを、タグ付け機能を評価するためのゴールドスタンダードとして受け取ります。

以下は、上記で作成した exptagger という名前のデフォルトのタガーを使用して、 treebank コーパスのタグ付けされた文のサブセットの精度を評価する例です-

import nltk
from nltk.tag import DefaultTagger
exptagger = DefaultTagger('NN')
from nltk.corpus import treebank
testsentences = treebank.tagged_sents() [1000:]
exptagger.evaluate (testsentences)

出力

0.13198749536374715

上記の出力は、すべてのタグに NN を選択することにより、 treebank コーパスの1000エントリで約13%の精度テストを達成できることを示しています。

文のリストにタグを付ける

NLTKの TaggerI クラスは、1つの文にタグを付けるのではなく、* tag_sents()*メソッドを使用して、文のリストにタグを付けることができます。 以下は、2つの単純な文にタグを付けた例です

import nltk
from nltk.tag import DefaultTagger
exptagger = DefaultTagger('NN')
exptagger.tag_sents([[Hi', ','], ['How', 'are', 'you', '?']])

出力

[
   [
      ('Hi', 'NN'),
      (',', 'NN')
   ],
   [
      ('How', 'NN'),
      ('are', 'NN'),
      ('you', 'NN'),
      ('?', 'NN')
   ]
]

上記の例では、以前に作成した exptagger という名前のデフォルトタガーを使用しました。

文のタグ付けを解除する

文のタグ付けを解除することもできます。 NLTKは、この目的のためにnltk.tag.untag()メソッドを提供します。 タグ付きの文を入力として受け取り、タグなしの単語のリストを提供します。 例を見てみましょう-

import nltk
from nltk.tag import untag
untag([('Tutorials', 'NN'), ('Point', 'NN')])

出力

['Tutorials', 'Point']