2013-02-21 39 views
13

Tôi có một (lớn) danh sách các câu phân tích cú pháp (mà đã được phân tích bằng cách sử dụng phân tích cú pháp Stanford), ví dụ, câu "Bây giờ bạn có thể được giải trí" có cây sau:Làm thế nào để sử dụng NLTK để tạo câu từ ngữ pháp gây ra?

(ROOT 
    (S 
    (ADVP (RB Now)) 
    (, ,) 
    (NP (PRP you)) 
    (VP (MD can) 
     (VP (VB be) 
     (VP (VBN entertained)))) 
    (. .))) 

Tôi đang sử dụng tập hợp các cây câu để tạo ra một ngữ pháp sử dụng NLTK:

import nltk 

# ... for each sentence tree t, add its production to allProductions 
allProductions += t.productions() 

# Induce the grammar 
S = nltk.Nonterminal('S') 
grammar = nltk.induce_pcfg(S, allProductions) 

Bây giờ tôi muốn sử dụng grammar để tạo mới, câu ngẫu nhiên. Hy vọng của tôi là vì ngữ pháp đã được học từ một tập hợp các ví dụ đầu vào cụ thể, sau đó các câu được tạo ra sẽ tương tự về mặt ngữ nghĩa. Tôi có thể làm điều này trong nltk không?

Nếu tôi không thể sử dụng nltk để thực hiện việc này, hãy thực hiện bất kỳ công cụ nào khác có thể lấy (có thể được định dạng lại) grammar và tạo câu?

+0

Trong cùng một chỗ, xin vui lòng kiểm tra chủ đề này http: //stackoverflow.com/questions/39061349/paraphrasing-using-nltk –

Trả lời

4

Trước hết, nếu bạn tạo các câu ngẫu nhiên, chúng có thể đúng ngữ nghĩa, nhưng chúng có thể sẽ mất ý nghĩa của chúng.

(Đó là âm thanh với tôi một chút giống như những sinh viên MIT đã làm với họ SCIgen program đó là tính năng tự động tạo ra bài báo khoa học. Rất thú vị btw.)

Dù sao, tôi không bao giờ làm được điều đó bản thân mình, nhưng có vẻ như có thể với nltk.bigrams, bạn có thể cách have a look there dưới Tạo Văn bản Ngẫu nhiên với Bigrams.

Bạn cũng có thể generate all subtrees of a current tree, tôi cũng không chắc chắn đó là điều bạn muốn.

12

Trong NLTK 2.0, bạn có thể sử dụng để tạo ra nltk.parse.generatetất cả thể sentences for a given grammar.

Mã này xác định một hàm sẽ tạo ra một câu duy nhất dựa trên các quy tắc sản xuất trong một (P) CFG.

# This example uses choice to choose from possible expansions 
from random import choice 
# This function is based on _generate_all() in nltk.parse.generate 
# It therefore assumes the same import environment otherwise. 
def generate_sample(grammar, items=["S"]): 
    frags = [] 
    if len(items) == 1: 
     if isinstance(items[0], Nonterminal): 
      for prod in grammar.productions(lhs=items[0]): 
       frags.append(generate_sample(grammar, prod.rhs())) 
     else: 
      frags.append(items[0]) 
    else: 
     # This is where we need to make our changes 
     chosen_expansion = choice(items) 
     frags.append(generate_sample,chosen_expansion) 
    return frags 

Để tận dụng các trọng trong PCFG của bạn, bạn sẽ rõ ràng muốn sử dụng một phương pháp lấy mẫu tốt hơn so với choice(), mà ngầm giả định tất cả các bản mở rộng của nút hiện tại là equiprobable.

2

Giải pháp của tôi để tạo ra một câu ngẫu nhiên từ một ngữ pháp nltk.CFG hiện:

def generate_sample(grammar, prod, frags):   
    if prod in grammar._lhs_index: # Derivation 
     derivations = grammar._lhs_index[prod]    
     derivation = random.choice(derivations)    
     for d in derivation._rhs:    
      generate_sample(grammar, d, frags) 
    elif prod in grammar._rhs_index: 
     # terminal 
     frags.append(str(prod)) 

Và bây giờ nó có thể được sử dụng:

frags = [] 
generate_sample(grammar, grammar.start(), frags) 
print(' '.join(frags)) 
+1

Dòng 'generate_sample (d, frags)' nên đọc 'generate_sample (ngữ pháp, d, frags)'. –

Các vấn đề liên quan