NLTK による POS タグ付けと NLP でのチャンキング [例]

POSタグ付け

POSタグ付け (品詞タグ付け) は、定義とコンテキストに基づいて、スピーチの特定の部分の単語をテキスト形式でマークアップするプロセスです。 言語でテキストを読み取り、各単語に特定のトークン (品詞) を割り当てる役割を果たします。 文法的タグ付けとも呼ばれます。

NLTK 品詞の例で学習してみましょう。

入力: すべては私たちを許可するためです。

出力: [('すべて', NN),('to', TO), ('許可', VB), ('私たち', PRP)]

POS タグ付けの例に含まれる手順

  • テキストのトークン化 (word_tokenize)
  • pos_tag を上記のステップである nltk.pos_tag(tokenize_text) に適用します

NLTK POS タグの例は次のとおりです。

略語 意味
CC コーディネート・コネクティビティ
CD 基数
DT 限定詞
EX そこに存在する
FW 外来語
IN 前置詞/従属接続詞
JJ この NLTK POS タグは形容詞 (大きい) です
JJR 形容詞、比較級(大きい)
JJS 形容詞、最上級(最大の)
LS リストマーケット
MD モーダル(できる、する)
NN 名詞、単数形(猫、木)
NNS 名詞 複数 (机)
NNP 固有名詞、単数形(サラ)
NNPS 固有名詞、複数形(インド人またはアメリカ人)
PDT 事前決定子 (すべて、両方、半分)
POS 所有語尾 (親の)
PRP 個人代名詞(彼女、彼女、彼、彼自身)
PRP$ 所有代名詞 (彼女、彼の、私の、私の、私たちの)
RB 副詞(時々、素早く)
RBR 副詞、比較級(大きい)
RBS 副詞、最上級(最大の)
RP 粒子(約)
無限マーカー (to)
UH 間投詞(さようなら)
VB 動詞(尋ねる)
GBV 動詞動名詞(判断)
VBD 動詞過去形(嘆願)
VBN 動詞過去分詞(再結合)
VBP 動詞、現在時制は三人称単数ではありません(ラップ)
VBZ 動詞、三人称単数現在形(基底)
WDT wh-determiner (それ、何)
WP wh- 代名詞 (誰)
WRB wh- 副詞(どのように)

上記の NLTK POS タグ リストには、すべての NLTK POS タグが含まれています。 NLTK POS タガーは、文の各単語の文法情報を割り当てるために使用されます。 POS NLTK のすべてのパッケージのインストール、インポート、ダウンロードが完了しました。

NLP におけるチャンキングとは何ですか?

チャンキング NLP では、小さな情報を取り出して大きな単位にグループ化するプロセスです。 チャンキングの主な用途は、「名詞句」のグループを作成することです。 これは、follo によって文に構造を追加するために使用されます。wing POS タグ付けと正規表現の組み合わせ。 結果として得られる単語のグループは「チャンク」と呼ばれます。 浅い解析とも呼ばれます。

浅い解析ではルートとリーフの間に最大 XNUMX レベルが存在しますが、深い解析では複数のレベルで構成されます。 浅い解析は、軽い解析またはチャンキングとも呼ばれます。

チャンク化のルール

事前に定義されたルールはありませんが、必要に応じてそれらを組み合わせることができます。

たとえば、文の名詞、動詞 (過去形)、形容詞、等位結合をタグ付けする必要があります。 以下のようにルールを使用できます

かたまり:{ * * * ?}

Following 表は、さまざまな記号の意味を示しています。

シンボル名 Description
. 改行を除く任意の文字
* 0 回以上の繰り返しに一致
? 0 または 1 回の繰り返しに一致

ルールをよりよく理解するためにコードを書いてみましょう

from nltk import pos_tag
from nltk import RegexpParser
text ="learn php from guru99 and make study easy".split()
print("After Split:",text)
tokens_tag = pos_tag(text)
print("After Token:",tokens_tag)
patterns= """mychunk:{<NN.?>*<VBD.?>*<JJ.?>*<CC>?}"""
chunker = RegexpParser(patterns)
print("After Regex:",chunker)
output = chunker.parse(tokens_tag)
print("After Chunking",output)

出力:

After Split: ['learn', 'php', 'from', 'guru99', 'and', 'make', 'study', 'easy']
After Token: [('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN'), ('and', 'CC'), ('make', 'VB'), ('study', 'NN'), ('easy', 'JJ')]
After Regex: chunk.RegexpParser with 1 stages:
RegexpChunkParser with 1 rules:
       <ChunkRule: '<NN.?>*<VBD.?>*<JJ.?>*<CC>?'>
After Chunking (S
  (mychunk learn/JJ)
  (mychunk php/NN)
  from/IN
  (mychunk guru99/NN and/CC)
  make/VB
  (mychunk study/NN easy/JJ))

上記の品詞タグ付け Python の例からの結論: 「make」はルールに含まれない動詞であるため、mychunk としてタグ付けされません

チャンク化の使用例

チャンクはエンティティの検出に使用されます。 エンティティは、マシンが何らかの意図の値を取得する文の一部です。

Example: 
Temperature of New York. 
Here Temperature is the intention and New York is an entity. 

言い換えれば、チャンク化はトークンのサブセットを選択するために使用されます。 トークンを選択するためにチャンキングがどのように使用されるかを理解するには、以下のコードに従ってください。 この例では、名詞句のチャンクに対応するグラフが表示されます。 理解を深めるためにコードを書いてグラフを描きます。

ユースケースを実証するコード

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {<DT>?<JJ>*<NN>}"
cp  =nltk.RegexpParser(grammar)
result = cp.parse(tag)
print(result)
result.draw()    # It will draw the pattern graphically which can be seen in Noun Phrase chunking 

出力:

['learn', 'php', 'from', 'guru99']  -- These are the tokens
[('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN')]   -- These are the pos_tag
(S (NP learn/JJ php/NN) from/IN (NP guru99/NN))        -- Noun Phrase Chunking

グラフ

名詞フレーズチャンキンググラフ
名詞フレーズのチャンク化グラフ

グラフから、「learn」と「guru99」は XNUMX つの異なるトークンですが、名詞フレーズとして分類されるのに対し、トークン「from」は名詞フレーズに属さないと結論付けることができます。

チャンク化は、異なるトークンを同じチャンクに分類するために使用されます。 結果は選択した文法によって異なります。 さらに、チャンキング NLTK を使用してパターンにタグを付け、テキスト コーパスを探索します。

ポストタグのカウント

いろいろ議論してきましたが pos_tag 前のセクションで。 この特定のチュートリアルでは、これらのタグをカウントする方法を学習します。 タグのカウントは、テキストの分類だけでなく、自然言語ベースの操作のための機能の準備にも重要です。 guru99 がコードを準備する際に採用したアプローチと、出力について説明します。 これがお役に立てば幸いです。

タグの数え方:

ここでは、まず動作するコードを作成し、次にコードを説明するためのさまざまな手順を作成します。

from collections import Counter
import nltk
text = "Guru99 is one of the best sites to learn WEB, SAP, Ethical Hacking and much more online."
lower_case = text.lower()
tokens = nltk.word_tokenize(lower_case)
tags = nltk.pos_tag(tokens)
counts = Counter( tag for word,  tag in tags)
print(counts)

出力:

Counter({'NN': 5, ',': 2, 'TO': 1, 'CC': 1, 'VBZ': 1, 'NNS': 1, 'CD': 1, '.': 1 、'DT': 1、'JJS': 1、'JJ': 1、'JJR': 1、'IN': 1、'VB': 1、'RB': 1})

コードの精緻化

ポストタグのカウント

  1. タグをカウントするには、コレクションのモジュールの Counter パッケージを使用できます。 カウンタは、キーと値の操作の原則に基づいて動作する辞書のサブクラスです。 これは、要素が辞書キーとして格納され、カウントがその値となる順序なしのコレクションです。
  2. テキストをトークン化するモジュールを含む nltk をインポートします。
  3. pos_tagをカウントしたいテキストを記述します。
  4. 一部の単語は大文字で、一部は小文字であるため、トークン化を適用する前にすべての単語を小文字に変換することが適切です。
  5. nltk から word_tokenize を通して単語を渡します。
  6. 各トークンの pos_tag を計算します
    Output = [('guru99', 'NN'), ('is', 'VBZ'), ('one', 'CD'), ('of', 'IN'), ('the', 'DT'), ('best', 'JJS'), ('site', 'NN'), ('to', 'TO'), ('learn', 'VB'), ('web', 'NN'), (',', ','), ('sap', 'NN'), (',', ','), ('ethical', 'JJ'), ('hacking', 'NN'), ('and', 'CC'), ('much', 'RB'), ('more', 'JJR'), ('online', 'JJ')]
  7. 次は辞書カウンターの役割です。 コード行 1 にインポートしました。単語がキー、タグが値で、カウンターはテキスト内に存在する各タグの合計数をカウントします。

頻度分布

頻度分布は、実験の結果が発生する回数を指します。 これは、文書内で出現する各単語の頻度を見つけるために使用されます。 それは使用しています FreqDistclass で定義されます nltk.確率 モジュールを開きます。

頻度分布は通常、繰り返し実行される実験のサンプルをカウントすることによって作成されます。 カウント数は毎回 XNUMX ずつ増加します。 例えば

freq_dist = FreqDist()

ドキュメント内のトークンの場合:

freq_dist.inc(token.type())

どの単語についても、特定の文書内でその単語が何回出現したかを確認できます。 例えば

  1. カウント方法: freq_dist.count('and')この式は、「and」が発生した回数の値を返します。 それをカウント法といいます。
  2. 周波数法: freq_dist.freq('and')この式は、指定されたサンプルの周波数を返します。

小さなプログラムを作成し、その動作を詳しく説明します。 テキストを書き、テキスト内の各単語の頻度分布を計算します。

import nltk
a = "Guru99 is the site where you can find the best tutorials for Software Testing     Tutorial, SAP Course for Beginners. Java Tutorial for Beginners and much more. Please     visit the site guru99.com and much more."
words = nltk.tokenize.word_tokenize(a)
fd = nltk.FreqDist(words)
fd.plot()

頻度分布

コードの説明:

  1. nltkモジュールをインポートします。
  2. 単語の分布を調べる必要があるテキストを書きます。
  3. nltk の FreqDist モジュールへの入力として提供されるテキスト内の各単語をトークン化します。
  4. 各単語をリスト形式で nlk.FreqDist に適用します
  5. グラフに単語をプロットするには、plot() を使用します。

書かれたテキストをよりよく理解するためにグラフを視覚化してください

グラフ内の各単語の頻度分布

グラフ内の各単語の頻度分布

注: 上記のグラフを表示するには、matplotlib がインストールされている必要があります

上のグラフを見てください。 これは、テキスト内の各単語の出現をカウントすることに対応します。 これは、テキストの研究、さらにはテキストベースの感情分析の実装に役立ちます。 一言で言えば、nltk には、自然言語特徴の統計を準備するのに役立つ、テキスト内の各単語の出現をカウントするモジュールがあると結論付けることができます。 テキスト内のキーワードを見つけるのに重要な役割を果たします。 また、extract、PyPDF2 などのライブラリを使用して PDF からテキストを抽出し、そのテキストを nlk.FreqDist にフィードすることもできます。

キーワードは「トークン化」です。 トークン化後、特定の段落またはテキスト文書内の各単語をチェックして、その出現回数を判断します。 これには NLTK ツールキットは必要ありません。 自分の Python プログラミング スキルを使って実行することもできます。 NLTK ツールキットは、さまざまな操作にすぐに使用できるコードのみを提供します。

各単語を数えることはあまり役に立たないかもしれません。代わりに、多くの単語をペアで扱うコロケーションとバイグラムに焦点を当てる必要があります。これらのペアは、マシンに供給できるより優れた自然言語機能に役立つキーワードを識別します。詳細については以下をご覧ください。tails.

コロケーション: バイグラムとトリグラム

コロケーションとは何ですか?

コロケーションは、文書内で何度も同時に出現する単語のペアです。 これは、文書全体の単語数に対して同時に出現するこれらのペアの数によって計算されます。

紫外線、赤外線などの言葉を使って電磁スペクトルを考えてみましょう。

紫外線と光線という言葉は単独では使用されないため、コロケーションとして扱うことができます。 別の例は CT スキャンです。 CT と Scan を別々に言うわけではないため、これらもコロケーションとして扱われます。

連語を見つけるには、単語の頻度と他の単語の文脈での出現を計算する必要があると言えます。 これらの特定の単語のコレクションでは、有用なコンテンツ用語を保持するためにフィルタリングが必要です。 次いで、単語の各グラムが何らかの関連性尺度に従ってスコア付けされ、各イングラムが連語である相対的な尤度を決定することができる。

コロケーションは XNUMX つのタイプに分類できます。

  • バイグラムc二つの単語の組み合わせ
  • トリグラムXNUMXつの単語の組み合わせ

バイグラムとトリグラムは、特徴抽出段階でより意味のある便利な特徴を提供します。 これらは、テキストベースの感情分析に特に役立ちます。

バイグラムのサンプルコード

import nltk

text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.bigrams(Tokens))
print(output)

出力:

[('Guru99', 'is'), ('is', 'totally'), ('totally', 'new'), ('new', 'kind'), ('kind', 'of'), ('of', 'learning'), ('learning', 'experience'), ('experience', '.')]

トリグラムのサンプルコード

場合によっては、統計分析や頻度カウントのために、文中の XNUMX つの単語のペアを確認することが重要になります。 これも形成に重要な役割を果たします。 NLP (自然言語処理機能) だけでなく、テキストベースの感情予測も可能です。

トライグラムを計算するために同じコードが実行されます。

import nltk
text = “Guru99 is a totally new kind of learning experience.”
Tokens = nltk.word_tokenize(text)
output = list(nltk.trigrams(Tokens))
print(output)

出力:

[('Guru99', 'is', 'totally'), ('is', 'totally', 'new'), ('totally', 'new', 'kind'), ('new', 'kind', 'of'), ('kind', 'of', 'learning'), ('of', 'learning', 'experience'), ('learning', 'experience', '.')]   

文のタグ付け

広義のタグ付けとは、文の文脈によって動詞や名詞などのラベルを追加することを指します。 POS タグの識別は複雑なプロセスです。 したがって、一部の単語は文の構造に応じて異なる(曖昧な)意味を持つ可能性があるため、POS の一般的なタグ付けを手動で行うことはできません。 リスト形式のテキストの変換は、リスト内の各単語がループされて特定のタグに対してカウントされるため、タグ付けの前の重要なステップです。 よりよく理解するには、以下のコードを参照してください

import nltk
text = "Hello Guru99, You have to build a very good site, and I love visiting your site."
sentence = nltk.sent_tokenize(text)
for sent in sentence:
	 print(nltk.pos_tag(nltk.word_tokenize(sent)))

出力:

[('こんにちは', 'NNP'), ('Guru99', 'NNP'), (',', ','), ('あなた', 'PRP'), ('持っています', 'VBP') 、('ビルド'、'VBN')、('a'、'DT')、('非常に'、'RB')、('良い'、'JJ')、('サイト'、'NN') 、('および'、'CC')、('私'、'PRP')、('愛'、'VBP')、('訪問'、'VBG')、('あなたの'、'PRP$' )、('サイト'、'NN')、('.'、'.')]

文のタグ付け

コードの説明:

  1. nltk (文のトークン化や単語のトークン化などのサブモジュールを含む自然言語ツールキット) をインポートするコード。
  2. タグを印刷するテキスト。
  3. 文のトークン化
  4. for ループが実装されており、文から単語がトークン化され、各単語のタグが出力として出力されます。

コーパスには XNUMX 種類の POS タガーがあります。

  • ルールベース
  • 確率的 POS タガー

1.ルールベースのPOSタガー: 意味が曖昧な単語に対しては、文脈情報に基づいたルールベースのアプローチを適用します。 これは、前後の意味をチェックまたは分析することによって行われます。wing 言葉。 情報は単語の周囲または単語自体から分析されます。 したがって、単語は大文字や句読点などの特定の言語の文法規則によってタグ付けされます。 たとえば、ブリルのタガー。

2.確率的 POS タガー: この方法では、頻度や確率などのさまざまなアプローチが適用されます。 トレーニングセットで単語のほとんどが特定のタグでタグ付けされている場合、テスト文ではその特定のタグが付けられます。 単語タグは、それ自体のタグだけでなく、前のタグにも依存します。 この方法は必ずしも正確であるとは限りません。 もう XNUMX つの方法は、文中の特定のタグの出現確率を計算することです。 したがって、最終的なタグは、特定のタグを持つ単語の最も高い確率をチェックすることによって計算されます。

隠れマルコフ モデルによる POS タグ付け

タグ付けの問題は、HMM を使用してモデル化することもできます。 入力トークンを観察可能なシーケンスとして扱いますが、タグは隠れた状態とみなされ、目的は隠れた状態のシーケンスを決定することです。 例えば x = x1,x2、…………、バツn ここで、x はトークンのシーケンスです。 y = y1,y2,y3,y4……はいnは隠しシーケンスです。

隠れマルコフ モデル (HMM) はどのように機能するのでしょうか?

HMM は、P(x, y) である結合分布を使用します。ここで、x は入力シーケンス/トークン シーケンス、y はタグ シーケンスです。

x のタグ シーケンスは argmax になりますy1….ynp(x1,x2,….xn,y1,y2,y3,…..)。 テキストからタグを分類しましたが、そのようなタグの統計は非常に重要です。 次の部分では、統計調査のためにこれらのタグをカウントします。

まとめ

  • POSタグイン NLTK は、定義と文脈に基づいて、スピーチの特定の部分の単語をテキスト形式でマークアップするプロセスです。
  • NLTK POS タグ付けの例としては、CC、CD、EX、JJ、MD、NNP、PDT、PRP$、TO などがあります。
  • POS タガーは、文の各単語に文法情報を割り当てるために使用されます。 NLTK を使用した品詞タグ付けのすべてのパッケージのインストール、インポート、ダウンロードが完了しました。
  • NLP におけるチャンク化は、小さな情報を取り出して大きな単位にグループ化するプロセスです。
  • 事前に定義されたルールはありませんが、必要に応じてそれらを組み合わせることができます。
  • チャンクはエンティティの検出に使用されます。 エンティティは、マシンが何らかの意図の値を取得する文の一部です。
  • チャンク化は、異なるトークンを同じチャンクに分類するために使用されます。