Natural LanguageToolkit-構文解析
NLPにおける構文解析とその関連性
ラテン語に由来する「構文解析」という単語 ‘pars’ (つまり、 ‘part’)は、テキストから正確な意味または辞書の意味を引き出すために使用されます。構文解析または構文解析とも呼ばれます。形式文法の規則を比較して、構文解析はテキストの意味をチェックします。たとえば、「Give me hot ice-cream」のような文は、パーサーまたは構文アナライザーによって拒否されます。
この意味で、構文解析、構文解析、構文解析、構文解析は次のように定義できます。
これは、形式文法の規則に準拠した自然言語の記号の文字列を分析するプロセスとして定義できます。
次の点の助けを借りて、NLPでの構文解析の関連性を理解できます-
パーサーは、構文エラーを報告するために使用されます。
プログラムの残りの部分の処理を続行できるように、一般的に発生するエラーから回復するのに役立ちます。
解析ツリーは、パーサーの助けを借りて作成されます。
パーサーは、NLPで重要な役割を果たすシンボルテーブルを作成するために使用されます。
パーサーは、中間表現(IR)の生成にも使用されます。
深い対浅い構文解析
ディープ解析 | シャローパーサ |
---|---|
深い構文解析では、検索戦略により、文に完全な構文構造が与えられます。 | これは、指定されたタスクからの構文情報の限られた部分を解析するタスクです。 |
複雑なNLPアプリケーションに適しています。 | それほど複雑でないNLPアプリケーションに使用できます。 |
対話システムと要約は、深い構文解析が使用されるNLPアプリケーションの例です。 | 情報抽出とテキストマイニングは、ディープ解析が使用されるNLPアプリケーションの例です。 |
これは、完全解析とも呼ばれます。 | チャンキングとも呼ばれます。 |
さまざまなタイプのパーサー
説明したように、パーサーは基本的に文法の手続き型解釈です。さまざまな木の空間を検索した後、与えられた文に最適な木を見つけます。以下の利用可能なパーサーのいくつかを見てみましょう-
再帰下降パーサー
再帰下降構文解析は、最も単純な形式の構文解析の1つです。以下は、再帰下降パーサーに関するいくつかの重要なポイントです。
それはトップダウンのプロセスに従います。
入力ストリームの構文が正しいかどうかを確認しようとします。
入力文を左から右に読みます。
再帰下降パーサーに必要な操作の1つは、入力ストリームから文字を読み取り、それらを文法の端末と照合することです。
Shift-reduceパーサー
以下は、shift-reduceパーサーに関するいくつかの重要なポイントです-
これは、単純なボトムアッププロセスに従います。
文法プロダクションの右側に対応する単語とフレーズのシーケンスを見つけようとし、それらをプロダクションの左側に置き換えます。
単語のシーケンスを見つける上記の試みは、文全体が縮小されるまで続きます。
言い換えると、shift-reduceパーサーは入力シンボルから開始し、開始シンボルまでパーサーツリーを構築しようとします。
チャートパーサ
以下はチャートパーサに関するいくつかの重要なポイントです-
これは主に、自然言語の文法を含むあいまいな文法に役立ちます。
動的計画法を構文解析の問題に適用します。
動的計画法のため、部分的に仮定された結果は「チャート」と呼ばれる構造に格納されます。
「チャート」は再利用することもできます。
正規表現パーサー
正規表現解析は、最もよく使用される解析手法の1つです。以下は、正規表現パーサーに関するいくつかの重要なポイントです。
名前が示すように、POSタグ付き文字列の上に文法の形式で定義された正規表現を使用します。
基本的に、これらの正規表現を使用して入力文を解析し、これから解析ツリーを生成します。
例
以下は、正規表現パーサーの実用的な例です。
import nltk
sentence = [
("a", "DT"),
("clever", "JJ"),
("fox","NN"),
("was","VBP"),
("jumping","VBP"),
("over","IN"),
("the","DT"),
("wall","NN")
]
grammar = "NP:{<DT>?<JJ>*<NN>}"
Reg_parser = nltk.RegexpParser(grammar)
Reg_parser.parse(sentence)
Output = Reg_parser.parse(sentence)
Output.draw()
出力
依存関係の解析
依存関係解析(DP)は、最新の構文解析メカニズムであり、その主な概念は、各言語単位、つまり単語が直接リンクによって相互に関連していることです。これらの直接リンクは実際には‘dependencies’言語学で。たとえば、次の図は、文の依存文法を示しています。“John can hit the ball”。
NLTKパッケージ
NLTKで依存関係の解析を行うには2つの方法があります-
確率的で射影的な依存関係パーサー
これは、NLTKを使用して依存関係の解析を実行できる最初の方法です。ただし、このパーサーには、限られたトレーニングデータセットを使用したトレーニングの制限があります。
スタンフォードパーサー
これは、NLTKを使用して依存関係の解析を行うことができるもう1つの方法です。スタンフォードパーサーは、最先端の依存関係パーサーです。NLTKにはラッパーがあります。それを使用するには、次の2つをダウンロードする必要があります-
スタンフォードCoreNLPパーサ。
希望する言語の言語モデル。たとえば、英語モデル。
例
モデルをダウンロードすると、NLTKを介して次のように使用できます-
from nltk.parse.stanford import StanfordDependencyParser
path_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'
dep_parser = StanfordDependencyParser(
path_to_jar = path_jar, path_to_models_jar = path_models_jar
)
result = dep_parser.raw_parse('I shot an elephant in my sleep')
depndency = result.next()
list(dependency.triples())
出力
[
((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
((u'elephant', u'NN'), u'det', (u'an', u'DT')),
((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))
]