2013-07-30 30 views
7

Lấy một ví dụ từ Introduction to Latin Wikiversity, hãy xem xét câu:Parsing inflected ngôn ngữ không phải thứ tự từ (ví dụ Latin)

the sailor gives the girl money 

Chúng tôi có thể xử lý này trong Prolog với DCG khá thanh lịch với đống này các quy tắc:

sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP). 
noun_phrase(Noun) --> det, noun(Noun). 
noun_phrase(Noun) --> noun(Noun). 
verb_phrase(vp(Verb, DO, IO)) --> verb(Verb), noun_phrase(IO), noun_phrase(DO). 

det --> [the]. 
noun(X) --> [X], { member(X, [sailor, girl, money]) }. 
verb(gives) --> [gives]. 

Và chúng ta thấy rằng công trình này:

?- phrase(sentence(S), [the,sailor,gives,the,girl,money]). 
S = s(sailor, vp(gives, money, girl)) ; 

dường như với tôi rằng DCG là thực sự được tối ưu hóa để xử lý ngôn ngữ theo thứ tự từ. Tôi đang ở một mất hoàn toàn như thế nào để xử lý câu Latinh này:

nauta dat pecuniam puellae 

Điều này có nghĩa những điều tương tự (các thủy thủ cho tiền cô gái), nhưng thứ tự chữ hoàn toàn miễn phí: tất cả các hoán vị cũng có nghĩa là chính xác những điều tương tự:

nauta dat puellae pecuniam 
nauta puellae pecuniam dat 
puellae pecuniam dat nauta 
puellae pecuniam nauta dat 
dat pecuniam nauta puellae 

việc đầu tiên xảy ra với tôi là để liệt kê các hoán vị:

sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP). 
sentence(s(NP, VP)) --> verb_phrase(VP), noun_phrase(NP). 

nhưng điều này sẽ không làm, vì trong khi nauta thuộc s với cụm từ danh từ chủ đề, puellae thuộc về cụm từ danh từ đối tượng là phụ thuộc vào động từ, nhưng có thể đứng trước nó. Tôi tự hỏi nếu tôi nên tiếp cận nó bằng cách xây dựng một số loại danh sách do đầu tiên như vậy:

?- attributed([nauta,dat,pecuniam,puellae], Attributed) 
Attributed = [noun(nauta,nom), verb(do,3,s), noun(pecunia,acc), noun(puella,dat)] 

Điều này có vẻ như nó sẽ bật ra được cần thiết (và tôi không thấy một cách tốt để làm điều đó), nhưng về mặt ngữ pháp thì nó đang đẩy thức ăn xung quanh trên đĩa của tôi. Có lẽ tôi có thể viết một phân tích cú pháp với một số loại kinh hoàng contraption phi DCG như thế này:

parse(s(NounPhrase, VerbPhrase), Attributed) :- 
    parse(subject_noun_phrase(NounPhrase, Attributed)), 
    parse(verb_phrase(VerbPhrase, Attributed)). 

parse(subject_noun_phrase(Noun), Attributed) :- 
    member(noun(Noun,nom), Attributed). 

parse(object_noun_phrase(Noun), Attributed) :- 
    member(noun(Noun,acc), Attributed) 

Điều này có vẻ như nó sẽ làm việc, nhưng chỉ chừng nào tôi còn không có đệ quy; ngay sau khi tôi giới thiệu một mệnh đề cấp dưới, tôi sẽ sử dụng lại các đối tượng theo cách không lành mạnh.

Tôi chỉ không thấy cách lấy từ một câu không theo thứ tự từ đến một cây phân tích cú pháp. Có một cuốn sách thảo luận về điều này? Cảm ơn.

Trả lời

2

Here Tôi tìm thấy tài nguyên có liên quan (PERMUTATIONAL GRAMMAR FOR FREE WORD LANGUAGES WORD). Có vẻ đáng để đọc (Hey, tất cả chúng ta ghét rất nhiều những bài học tiếng Latin bắt buộc, trở lại trong thập niên 60!).

Trong phụ lục có triển khai để kiểm tra.

Tôi quên chỉ ra trình phân tích cú pháp tự do của Covington '(chỉ là một bản phác thảo ...) Bạn có thể tìm thấy trong bộ công cụ PRoNTo (Tôi báo cáo ở đây vì mục đích đầy đủ, nhưng tôi khá chắc chắn bạn đã Biết về nó).

+0

tôi không, thực sự. –

1

Có vẻ như (rút ra từ cực kỳ nhớ gỉ của trường trung học Latin), phân tích từ vựng của bạn cần phải nhìn vào từng thẻ (word) và thuộc tính mỗi mã thông báo với thích hợp meta-data:

  • loại từ (danh từ, động từ, tính từ, v.v.)
  • Đối với danh từ, tình trạng sa sút, giới tính, trường hợp và số
  • Đối với động từ, chia động từ, người, số, căng thẳng, giọng nói và tâm trạng
  • Đối với tính từ, giới tính, tình trạng sa sút, số ...
  • , vv (Đã lâu rồi LOL).

Sau đó, phân tích cú pháp của bạn nên được hướng dẫn bởi siêu dữ liệu, vì đó là những gì gắn kết mọi thứ với nhau.

+0

Có, rõ ràng, nhưng một khi tôi có mà tôi vẫn sẽ không có thẻ trong bất kỳ thứ tự cụ thể, mà dường như để đánh bại tiền đề của DCGs. –

1

Bạn có thể sử dụng khoản meta này:

unsorted([]) --> []. 
unsorted([H|T]) --> 
    H, unsorted(T). 
unsorted([H|T]) --> 
    unsorted(T), H. 

sentence(s(NP, VP)) --> unsorted([noun_phrase(NP), verb_phrase(VP)]). 
Các vấn đề liên quan