2013-07-17 48 views
9

Tôi đang làm việc trên một trình phân tích cú pháp không phải tiếng Anh có các ký tự Unicode. Vì vậy, tôi quyết định sử dụng NLTK.NLTK Bối cảnh Ngữ pháp tự do miễn phí

Nhưng nó đòi hỏi một bối cảnh tự do được xác định trước ngữ pháp như sau:

S -> NP VP 
    VP -> V NP | V NP PP 
    PP -> P NP 
    V -> "saw" | "ate" | "walked" 
    NP -> "John" | "Mary" | "Bob" | Det N | Det N PP 
    Det -> "a" | "an" | "the" | "my" 
    N -> "man" | "dog" | "cat" | "telescope" | "park" 
    P -> "in" | "on" | "by" | "with" 

Trong ứng dụng của tôi, nên anh phải để giảm thiểu cứng mã hóa với việc sử dụng một ngữ pháp dựa trên luật lệ. Ví dụ: tôi có thể giả sử bất kỳ từ nào kết thúc bằng số -ed hoặc -ing làm động từ. Vì vậy, nó sẽ làm việc cho bất kỳ bối cảnh nhất định.

Làm cách nào để có thể cung cấp các quy tắc ngữ pháp như vậy cho NLTK? Hoặc tạo ra chúng tự động bằng cách sử dụng máy nhà nước hữu hạn?

+1

Bạn có thể đọc [câu trả lời này] (http://stackoverflow.com/questions/14096237/can-someone-give-a-simple-but-non-toy-example-of-a-context-sensitive -grammar/14099421 # 14099421) bởi vì bạn đang viết CFG. –

+0

Cảm ơn. Tôi nhìn nhưng không thể hiểu được. Có cách nào tôi có thể ăn các biến python để CFG? – ChamingaD

+0

Nếu bạn muốn tự động tìm hiểu các quy tắc CFG, bạn có thể thử triển khai www.aclweb.org/anthology/O06-1004 =) – alvas

Trả lời

2

Có thể bạn đang tìm kiếm parse_cfg()?

Từ Chapter 7 của cuốn sách NLTK:

> grammar = nltk.parse_cfg(""" 
S -> NP VP 
VP -> V NP | V NP PP 
V -> "saw" | "ate" 
NP -> "John" | "Mary" | "Bob" | Det N | Det N PP 
Det -> "a" | "an" | "the" | "my" 
N -> "dog" | "cat" | "cookie" | "park" 
PP -> P NP 
P -> "in" | "on" | "by" | "with" 
""") 

> sent = "Mary saw Bob".split() 
> rd_parser = nltk.RecursiveDescentParser(grammar) 
> for p in rd_parser.nbest_parse(sent): 
     print p 
(S (NP Mary) (VP (V saw) (NP Bob))) 
+0

Cảm ơn. Nhưng nó vẫn khó mã những động từ và danh từ phải không? Có anyway để vượt qua giá trị chuỗi để CFG? như V = variable_a – ChamingaD

+0

Tôi chắc chắn rằng bạn có thể nối các chuỗi và sau đó truyền chúng vào! http://stackoverflow.com/questions/12169839/ – arturomp

+0

thực sự, từ những gì tôi hiểu trong câu hỏi ban đầu của bạn, một điều khác để thử (không hoàn toàn chắc chắn nếu nó có thể) là để làm một phần POS gắn thẻ chỉ trên các từ kết thúc trong - ing hoặc -ed, và đánh dấu chúng là V, vì vậy bạn không phải lo lắng về quy tắc V trong CFG của bạn. – arturomp

7

Nếu bạn đang tạo ra một phân tích cú pháp, sau đó bạn có thêm một bước của pos gắn thẻ trước khi phân tích thực tế - không có cách nào để thành công xác định thẻ POS của một từ trong ngữ cảnh. Ví dụ, 'đóng' có thể là một tính từ hoặc một động từ; một POS-tagger sẽ tìm ra đúng tag cho bạn từ ngữ cảnh của từ đó. Sau đó, bạn có thể sử dụng đầu ra của POS-tagger để tạo CFG của bạn.

Bạn có thể sử dụng một trong nhiều trình gắn thẻ POS hiện có. Trong NLTK, bạn chỉ có thể làm điều gì đó như:

import nltk 
input_sentence = "Dogs chase cats" 
text = nltk.word_tokenize(input_sentence) 
list_of_tokens = nltk.pos_tag(text) 
print list_of_tokens 

Kết quả sẽ là:

[('Dogs', 'NN'), ('chase', 'VB'), ('cats', 'NN')] 

mà bạn có thể sử dụng để tạo ra một chuỗi ngữ pháp và thức ăn nó để nltk.parse_cfg().

+0

Cảm ơn. Điều này có làm cho trình phân tích cú pháp không phải tiếng Anh không? – ChamingaD

+0

Không, nhưng NLTK cho phép bạn đào tạo trình gắn thẻ của riêng bạn theo cách rất đơn giản. Tuy nhiên, để làm điều đó, bạn sẽ cần một số kho được gắn thẻ của ngôn ngữ của bạn để đào tạo mô hình thống kê. Bạn có quyền truy cập vào tài nguyên như vậy không? Ngôn ngữ bạn đang làm việc là gì? – dkar

+0

Tôi cần phương pháp tạo ngữ pháp dựa trên quy tắc. Ví dụ các từ kết thúc bằng -ed hoặc -ing như một động từ (trong ứng dụng của tôi, tôi sẽ sử dụng ký tự unicode). Có anyway để làm điều đó với NLTK? – ChamingaD

0

Bạn không thể viết các loại quy tắc như vậy trong nltk ngay bây giờ mà không cần bất kỳ nỗ lực nào nhưng bạn có thể thực hiện một số thủ thuật.

Ví dụ: phiên âm câu của bạn trong một số loại nhãn thông tin từ và viết các quy tắc ngữ pháp của bạn cho phù hợp.

Ví dụ (sử dụng thẻ POS như nhãn):

Dogs eat bones. 

trở thành:

NN V NN. 

Và ngữ pháp luật terminal dụ:

V -> 'V' 

Nếu đó là không đủ, bạn nên tận một cái nhìn cho một thực hiện hình thức linh hoạt hơn.

1

Bạn có thể sử dụng NLTK RegexTagger có khả năng biểu thức chính quy của mã thông báo quyết định. Đây là chính xác bạn cần trong trường hợp của bạn. Khi mã thông báo kết thúc bằng 'ing' sẽ được gắn thẻ là gerund và mã thông báo kết thúc bằng 'ed' sẽ được gắn thẻ với động từ trước đây. xem ví dụ bên dưới.

patterns = [ 
    (r'.*ing$', 'VBG'), # gerunds 
    (r'.*ed$', 'VBD'), # simple past 
    (r'.*es$', 'VBZ'), # 3rd singular present 
    (r'.*ould$', 'MD'), # modals 
    (r'.*\'s$', 'NN$'), # possessive nouns 
    (r'.*s$', 'NNS') # plural nouns 
] 

Lưu ý rằng chúng được xử lý theo thứ tự và cột đầu tiên phù hợp được áp dụng. Bây giờ chúng tôi có thể thiết lập một trình gắn thẻ và sử dụng nó để gắn thẻ một câu. Sau bước này, điều này đúng về số thứ tự thời gian là .

regexp_tagger = nltk.RegexpTagger(patterns) 
regexp_tagger.tag(your_sent) 

bạn có thể sử dụng người gắn thẻ Kết hợp để sử dụng nhiều chung tagger trong một chuỗi.

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