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 におけるチャンキングは、小さな情報断片を大きな単位にグループ化するプロセスです。チャンキングの主な用途は、「名詞句」のグループを作成することです。これは、POS タグ付けと正規表現を組み合わせて、文に構造を追加するために使用されます。結果として得られる単語のグループは「チャンク」と呼ばれます。これは、浅い解析とも呼ばれます。
浅い解析ではルートとリーフの間に最大 XNUMX レベルが存在しますが、深い解析では複数のレベルで構成されます。 浅い解析は、軽い解析またはチャンキングとも呼ばれます。
チャンク化のルール
事前に定義されたルールはありませんが、必要に応じてそれらを組み合わせることができます。
たとえば、文の名詞、動詞 (過去形)、形容詞、等位結合をタグ付けする必要があります。 以下のようにルールを使用できます
かたまり:{ * * * ?}
次の表は、さまざまな記号の意味を示しています。
シンボル名 | 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})
コードの精緻化
- タグをカウントするには、コレクションのモジュールからパッケージ Counter を使用できます。カウンターは、キー値操作の原則に基づいて動作する辞書のサブクラスです。これは順序付けされていないコレクションであり、要素は辞書のキーとして格納され、カウントはその値になります。
- テキストをトークン化するモジュールを含む nltk をインポートします。
- pos_tagをカウントしたいテキストを記述します。
- 一部の単語は大文字で、一部は小文字であるため、トークン化を適用する前にすべての単語を小文字に変換することが適切です。
- nltk から word_tokenize を通して単語を渡します。
- 各トークンの 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')]
- 次は辞書カウンターの役割です。 コード行 1 にインポートしました。単語がキー、タグが値で、カウンターはテキスト内に存在する各タグの合計数をカウントします。
頻度分布
頻度分布は、実験の結果が発生する回数を指します。 これは、文書内で出現する各単語の頻度を見つけるために使用されます。 それは使用しています FreqDistclass で定義されます nltk.確率 モジュールを開きます。
頻度分布は通常、繰り返し実行される実験のサンプルをカウントすることによって作成されます。 カウント数は毎回 XNUMX ずつ増加します。 例えば
freq_dist = FreqDist()
ドキュメント内のトークンの場合:
freq_dist.inc(token.type())
どの単語についても、特定の文書内でその単語が何回出現したかを確認できます。 例えば
- カウント方法: 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()
コードの説明:
- nltkモジュールをインポートします。
- 単語の分布を調べる必要があるテキストを書きます。
- nltk の FreqDist モジュールへの入力として提供されるテキスト内の各単語をトークン化します。
- 各単語をリスト形式で nlk.FreqDist に適用します
- グラフに単語をプロットするには、plot() を使用します。
書かれたテキストをよりよく理解するためにグラフを視覚化してください
注: 上記のグラフを表示するには、matplotlib がインストールされている必要があります
上のグラフを見てください。 これは、テキスト内の各単語の出現をカウントすることに対応します。 これは、テキストの研究、さらにはテキストベースの感情分析の実装に役立ちます。 一言で言えば、nltk には、自然言語特徴の統計を準備するのに役立つ、テキスト内の各単語の出現をカウントするモジュールがあると結論付けることができます。 テキスト内のキーワードを見つけるのに重要な役割を果たします。 また、extract、PyPDF2 などのライブラリを使用して PDF からテキストを抽出し、そのテキストを nlk.FreqDist にフィードすることもできます。
キーワードは「トークン化」です。トークン化後、特定の段落またはテキスト ドキュメント内の各単語をチェックして、その単語が出現した回数を判断します。このために NLTK ツールキットは必要ありません。独自の Python プログラミング スキルを使用して行うこともできます。NLTK ツールキットは、さまざまな操作にすぐに使用できるコードのみを提供します。
各単語を数えることはあまり役に立たないかもしれません。代わりに、ペアで多くの単語を扱うコロケーションとバイグラムに焦点を当てるべきです。これらのペアは、機械に入力できるより優れた自然言語機能に役立つキーワードを識別します。詳細については以下を参照してください。
コロケーション: バイグラムとトリグラム
コロケーションとは何ですか?
コロケーションは、文書内で何度も同時に出現する単語のペアです。 これは、文書全体の単語数に対して同時に出現するこれらのペアの数によって計算されます。
紫外線、赤外線などの言葉を使って電磁スペクトルを考えてみましょう。
紫外線と光線という言葉は単独では使用されないため、コロケーションとして扱うことができます。 別の例は 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')、('.'、'.')]
コードの説明:
- nltk (文のトークン化や単語のトークン化などのサブモジュールを含む自然言語ツールキット) をインポートするコード。
- タグを印刷するテキスト。
- 文のトークン化
- for ループが実装されており、文から単語がトークン化され、各単語のタグが出力として出力されます。
コーパスには XNUMX 種類の POS タガーがあります。
- ルールベース
- 確率的 POS タガー
1.ルールベースのPOSタガー: 意味が曖昧な単語については、文脈情報に基づいたルールベースのアプローチが適用されます。これは、前後の単語の意味を確認または分析することによって行われます。情報は、単語の周囲または単語自体から分析されます。したがって、単語は、大文字化や句読点などの特定の言語の文法規則によってタグ付けされます。たとえば、Brill のタグ付けツールなどです。
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 におけるチャンク化は、小さな情報を取り出して大きな単位にグループ化するプロセスです。
- 事前に定義されたルールはありませんが、必要に応じてそれらを組み合わせることができます。
- チャンクはエンティティの検出に使用されます。 エンティティは、マシンが何らかの意図の値を取得する文の一部です。
- チャンク化は、異なるトークンを同じチャンクに分類するために使用されます。