NLTKによる複雑なチャンク


8

私は、NLTKブックの第7章に従って、NLTKのカスケードチャンカーの使用方法を理解しようとしています。残念ながら、重要なチャンク対策を実行するときにいくつかの問題が発生します。

このフレーズから始めましょう:

"adventure movies between 2000 and 2015 featuring performances by daniel craig"

次の文法を使用すると、関連するすべてのNPを見つけることができます。

grammar = "NP: {<DT>?<JJ>*<NN.*>+}"

ただし、NLTKを使用してネストされた構造を構築する方法がわかりません。この本は次の形式を示していますが、明らかにいくつか欠けているものがあります(たとえば、実際に複数のルールをどのように指定するのですか?):

grammar = r"""
  NP: {<DT|JJ|NN.*>+}          # Chunk sequences of DT, JJ, NN
  PP: {<IN><NP>}               # Chunk prepositions followed by NP
  VP: {<VB.*><NP|PP|CLAUSE>+$} # Chunk verbs and their arguments
  CLAUSE: {<NP><VP>}           # Chunk NP, VP
  """

私の場合、私は次のようなことをしたいと思います:

grammar = "MEDIA: {<DT>?<JJ>*<NN.*>+}
           RELATION: {<V.*>}{<DT>?<JJ>*<NN.*>+}
           ENTITY: {<NN.*>}"

CFGがこれに適しているかもしれませんが、この機能に対するNLTKのサポートに気付いたのは約5分前(この質問から)であり、機能に関する多くのドキュメントが存在しないようです。

それで、タスクにカスケードされたチャンカーを使用したい場合、どの構文を使用する必要がありますか?さらに、チャンカーを使用するときに、特定の単語(「directed」または「acted」など)を指定することは可能ですか?

回答:


2

あなたの文法は正しいです!

grammar = """MEDIA: {<DT>?<JJ>*<NN.*>+}
           RELATION: {<V.*>}
                     {<DT>?<JJ>*<NN.*>+}
           ENTITY: {<NN.*>}"""

指定して

RELATION: {<V.*>}
          {<DT>?<JJ>*<NN.*>+}

あなたが生成するための二つの方法があることを示しているRELATIONチャンクすなわち{<V.*>}{<DT>?<JJ>*<NN.*>+}

そう

grammar = """MEDIA: {<DT>?<JJ>*<NN.*>+}
               RELATION: {<V.*>}
                         {<DT>?<JJ>*<NN.*>+}
               ENTITY: {<NN.*>}"""
    chunkParser = nltk.RegexpParser(grammar)
    tagged = nltk.pos_tag(nltk.word_tokenize("adventure movies between 2000 and 2015 featuring performances by daniel craig"))

    tree = chunkParser.parse(tagged)

    for subtree in tree.subtrees():
        if subtree.label() == "RELATION": 
            print("RELATION: "+str(subtree.leaves()))

与える

RELATION: [('featuring', 'VBG')]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.