Chunking phức tạp với NLTK


8

Tôi đang cố gắng tìm ra cách sử dụng chương trình xếp tầng của NLTK theo Chương 7 của cuốn sách NLTK . Thật không may, tôi gặp phải một số vấn đề khi thực hiện các biện pháp chunk không tầm thường.

Hãy bắt đầu với cụm từ này:

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

Tôi có thể tìm thấy tất cả các NP có liên quan khi tôi sử dụng ngữ pháp sau:

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

Tuy nhiên, tôi không chắc chắn làm thế nào để xây dựng các cấu trúc lồng nhau với NLTK. Cuốn sách đưa ra định dạng sau, nhưng rõ ràng có một vài điều còn thiếu (ví dụ: Làm thế nào để thực sự chỉ định nhiều quy tắc?):

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

Trong trường hợp của tôi, tôi muốn làm một cái gì đó như sau:

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

Tôi nhận thấy rằng CFG có thể phù hợp hơn cho vấn đề này, nhưng tôi chỉ nhận thức được sự hỗ trợ của NLTK cho chức năng này khoảng 5 phút trước (từ câu hỏi này ) và không xuất hiện nhiều tài liệu cho tính năng này.

Vì vậy, giả sử rằng tôi muốn sử dụng một bộ ghép tầng cho nhiệm vụ của mình, tôi cần sử dụng cú pháp nào? Ngoài ra, tôi có thể chỉ định các từ cụ thể (ví dụ: "được chỉ dẫn" hoặc "đã hành động") khi sử dụng một bộ đệm không?

Câu trả lời:


2

ngữ pháp của bạn là chính xác!

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

bằng cách chỉ định

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

bạn đang chỉ ra rằng có hai cách để tạo ra RELATIONchunk tức là {<V.*>}hoặc{<DT>?<JJ>*<NN.*>+}

vì thế

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

cho

RELATION: [('featuring', 'VBG')]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.