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

⚡ スマートサマリー

POS タグ付けは文中のすべての単語に品詞を割り当て、チャンキングはタグ付けされた単語を名詞句などの意味のあるフレーズにグループ化し、NLTK が正規表現で構築する浅い構造を追加します。 Python.

  • 🏷️ POSタグ付け: 各単語は、文脈からNN、VB、JJなどの文法的なトークンを受け取ります。
  • 🌿 チャンキング: タグ付けされた単語はフレーズにグループ化され、このプロセスは浅い構文解析とも呼ばれます。
  • 🔤 ワークフロー: まずテキストをトークン化し、次にpos_tagを適用し、最後にRegexpParser文法で解析します。
  • 📊 タグの数え方: CounterとFreqDistは、特徴量エンジニアリングのために、タグと単語の出現頻度を明らかにします。
  • 🔗 コロケーション: バイグラムとトライグラムは、単語のペアとトリプルを捉え、より強力なテキスト特徴量を提供します。
  • 🤖 AIの活用: 機械学習やHMMベースのタグ付けツールは、曖昧な単語を確率的に処理する。

NLTKによる品詞タグ付けと自然言語処理におけるチャンキング

POSタグ付け

POSタグ付け 品詞タグ付けとは、テキスト形式の単語を、その定義と文脈に基づいて特定の品詞に分類するプロセスです。言語のテキストを読み込み、各単語に特定のトークン(品詞)を割り当てる役割を担います。文法タグ付けとも呼ばれます。

NLTKの品詞の例を使って学んでみましょう。

Input: Everything to permit us.
Output: [('Everything', NN),('to', TO), ('permit', VB), ('us', PRP)]

POSタグ付け例の手順

  • テキストのトークン化 (word_tokenize)
  • 上記の手順にpos_tagを適用します。つまり、nltk.pos_tag(tokenize_text)を実行します。

NLTKの品詞タグの例を以下に示します。

略語 意味
CC コーディネート・コネクティビティ
CD 基数
DT 限定詞
EX そこに存在する
FW 外来語
IN 前置詞/従属接続詞
JJ 形容詞
JJR 形容詞、比較級
JJS 形容詞、最上級
LS リストマーケット
MD モーダル
NN 名詞、単数形
NNS 名詞の複数形
NNP 固有名詞(単数形)
NNPS 固有名詞(複数形)
PDT 決定詞
POS 所有格語尾
PRP 人称代名詞
PRP$ 所有代名詞
RB 副詞
RBR 副詞、比較級
RBS 副詞、最上級
RP 粒子
無限マーカー
UH 間投詞
VB 動詞
GBV 動詞の現在分詞
VBD 動詞の過去形
VBN 動詞の過去分詞
VBP 動詞、現在形、三人称単数形以外
VBZ 動詞、現在形、三人称単数
WDT 疑問詞限定詞
WP 疑問詞代名詞
WRB 疑問詞副詞

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

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

チャンキング 自然言語処理(NLP)におけるチャンキングとは、小さな情報をまとめて大きな単位にするプロセスです。チャンキングの主な用途は、「名詞句」のグループを作成することです。品詞タグ付けと正規表現を組み合わせることで、文に構造を与えるために使用されます。結果として得られる単語のグループは「チャンク」と呼ばれます。これは浅い構文解析とも呼ばれます。

浅い構文解析では、ルートとリーフの間に最大1つのレベルしかありませんが、深い構文解析では複数のレベルがあります。浅い構文解析は、ライト構文解析またはチャンキングとも呼ばれます。

チャンク化のルール

あらかじめ定義されたルールはありませんが、必要に応じて組み合わせることができます。たとえば、文から名詞、動詞(過去形)、形容詞、等位接続詞をタグ付けする必要があるとします。以下のルールを使用できます。

chunk:{***?}

以下の表は、各記号の意味を示しています。

シンボル名 詳細説明
. 改行を除く任意の文字
* 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:{***?}"""
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:
       '***?'>
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: {
?*}" 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」は異なるトークンですが、名詞句として分類されていることがわかります。一方、「from」は名詞句には属しません。チャンキングは、異なるトークンを同じチャンクに分類するために使用されます。結果は、選択された文法によって異なります。さらに、NLTK のチャンキングは、パターンにタグ付けしたり、テキストコーパスを探索したりするために使用されます。

POSタグのカウント

いろいろ議論してきましたが pos_tag 以前の値。ここでは、これらのタグをカウントする方法を学びます。タグのカウントは、テキスト分類や自然言語処理のための特徴量の準備において非常に重要です。まず動作するコードを記述し、次に手順を説明します。

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. collectionsモジュールのCounterパッケージを使用してください。Counterは、要素をキーとして、その出現回数を値として格納する辞書のサブクラスです。
  2. テキストをトークン化するためにnltkをインポートします。
  3. pos_tagをカウントしたいテキストを記述します。
  4. トークン化の前に、すべての単語を小文字に変換します。
  5. 単語をword_tokenizeに通し、各トークンのpos_tagを計算します。
  6. カウンターは、テキスト内の各タグの出現回数を合計します。

頻度分布

度数分布とは、実験結果が何回発生したかを示すものです。文書中の各単語の出現頻度を調べるのに使用されます。 周波数距離 定義されるクラス nltk.確率 モジュール。サンプルが発生するたびに、カウントが1ずつ増加します。

任意の単語について、文書内でその単語が何回出現したかを調べることができます。例:

  • カウント方法: freq_dist.count('and') は、「and」が出現した回数を返します。これはカウントメソッドと呼ばれます。
  • 周波数法: 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. 各単語をリストの形式で nltk.FreqDist に適用します。
  5. plot()関数を使って、単語をグラフにプロットします。

注:グラフを表示するにはmatplotlibがインストールされている必要があります。matplotlibはテキスト内の各単語の出現回数をカウントし、テキストベースの感情分析に役立ちます。重要な用語は「トークン化」です。トークン化後、各単語が何回出現したかがチェックされます。

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

連語とは、文書内で何度も一緒に現れる単語のペアのことです。これは、一緒に現れる単語ペアの数を文書全体の単語数で割った比率によって算出されます。

紫外線や赤外線といった単語を考えてみましょう。紫外線と光線は単独では使われないため、コロケーションとして扱うことができます。別の例としてCTスキャンがあります。CTとスキャンを別々に言うことはありません。コロケーションは2つのタイプに分類できます。

  • バイグラム: 2つの単語の組み合わせ
  • 卦: 3つの単語の組み合わせ

バイグラムとトライグラムは、特徴量に対してより意味のある有用な特徴量を提供するtrac段階。これらは特にテキストベースの感情分析に役立ちます。

バイグラムの例 Code:

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', '.')]

トリグラムの例 Code:

場合によっては、統計分析や頻度カウントのために、文中の 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', '.')]

文のタグ付け

文にタグ付けするとは、文の文脈に基づいて動詞や名詞などのラベルを追加することです。品詞タグの識別は複雑なため、文の構造によっては意味が曖昧になる単語もあるため、手動で一般的なタグ付けを行うことはできません。タグ付けの前にテキストをリストに変換することは重要なステップです。各単語はループ処理され、特定のタグごとにカウントされます。

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)))

Code 説明:

  1. Code nltk (Natural Language Toolキットには、文のトークン化や単語のトークン化などのサブモジュールが含まれています。
  2. タグを印刷するテキスト。
  3. 文のトークン化。
  4. forループが実装され、文から単語がトークン化され、各単語のタグが出力として表示されます。

コーパスには、2種類の品詞タグ付けツールがあります。

1. ルールベースの品詞タグ付けツール: 意味が曖昧な単語については、文脈情報に基づくルールベースのアプローチが適用されます。これは、前後の単語の意味を分析することによって行われます。そのため、単語は、大文字化や句読点など、特定の言語の文法規則によってタグ付けされます。たとえば、Brill のタガーなどです。

2. 確率的POSタグ付けツール: この手法では、頻度や確率といったアプローチが適用されます。訓練データセットにおいて、ある単語が特定のタグで頻繁にタグ付けされている場合、テスト文でもそのタグが付けられます。単語のタグは、自身のタグだけでなく、直前のタグにも依存するため、この手法は必ずしも正確とは限りません。

隠れマルコフモデルを用いたPOSタグ付け

タグ付けの問題は、隠れマルコフモデル(HMM)を使用してモデル化することもできます。HMMでは、入力トークンを観測可能なシーケンスとして扱い、タグを隠れ状態とみなし、隠れ状態のシーケンスを決定することが目標となります。たとえば、x = x1,x2,…,xn の場合、x はトークンのシーケンスであり、y = y1,y2,y3,y4…yn は隠れシーケンスです。

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

HMMは、入力トークンシーケンスxとタグシーケンスyの同時分布P(x, y)を使用します。xのタグシーケンスは、p(x1,x2,…xn,y1,y2,y3,…)のy1…ynに対するargmaxになります。テキストからタグを分類しましたが、これらのタグの統計は重要なので、次のパートでは統計的研究のためにこれらのタグをカウントします。

よくあるご質問

品詞タグ付けは、個々の単語に名詞や動詞などの品詞をラベル付けします。チャンキングはさらに一歩進んで、タグ付けされた単語を名詞句などのフレーズにグループ化し、文に浅い構造を与えます。

浅い構文解析(チャンキングまたは軽度構文解析とも呼ばれる)では、ルートとリーフの間に最大1つのレベルしか設けません。完全な構文木を構築せずに句の境界を識別するため、深い構文解析よりも高速です。

チャンキングはタグ付けされた単語をフレーズにグループ化し、システムが人、場所、日付、製品などのエンティティを検出できるようにします。固有表現認識はこれらのチャンクに依存して、trac生のテキストから意味のある値を取得します。

nltk.pos_tag() 関数は品詞タグを割り当てます。まず word_tokenize 関数でテキストをトークン化し、次にトークンリストを pos_tag 関数に渡します。pos_tag 関数は、NN、VB、JJ などのタグとペアになった各単語を返します。

はい。機械学習と深層ニューラルネットワークを用いて訓練された最新のAIタグ付けシステムは、大規模なコーパスから文脈を学習することで曖昧な単語を解決し、実際のテキストにおいてルールベースの手法よりも高い精度を実現します。

確率的タグ付けツールは、学習データから得られた確率を利用します。機械学習は、周囲のタグに基づいて各タグが単語に付けられる可能性を推定し、全体的な確率が最も高いタグの組み合わせを選択します。

ほかに NLTK人気のある選択肢には スパシー 高速な生産パイプラインにはStanford CoreNLP、トランスフォーマーベースのタグ付けにはHugging Face Transformersを使用します。

チャンク文法では、ドットは改行以外の任意の文字に一致し、アスタリスクは0回以上の繰り返しに一致し、疑問符は直前の品詞タグパターンの0回または1回の繰り返しに一致します。