Tôi không biết gói nltk (chưa bao giờ sử dụng nó), nhưng dường như bạn có câu trả lời ngay lập tức. Nếu bạn nhìn vào ví dụ về cây phân tích cú pháp trên nltk.org, nó cho thấy rằng chủ đề được dán nhãn thành công với một thẻ 'NP-SBJ'. Đây không phải là những gì bạn đang tìm kiếm?
(Trước đó, tôi đã bỏ qua phần 'nltk' trong tiêu đề và tôi đã viết phần bên dưới. Tôi nghĩ nó có thể thú vị như giới thiệu chung về cách giải quyết các vấn đề như thế này (đặc biệt là nếu bạn không có một gói có sẵn), vì vậy tôi sẽ để nó ở đây :)
Đây là câu hỏi “ngôn ngữ tự nhiên” (nghĩa là tiếng Anh) hơn là một câu hỏi Python. Bạn có thể cụ thể hơn về loại câu bạn mong đợi không? Nó có phù hợp với tất cả các câu tiếng Anh không? Tôi nghĩ điều đó thực sự khó khăn.
Nếu các câu đủ 'dễ' đủ, có thể giả định rằng mọi thứ trước động từ đầu tiên là chủ ngữ. Điều này phù hợp với ví dụ của bạn, nhưng không hoạt động đối với các câu sau:
yesterday the princess looked from the palace, she was happy.
the princes who drank tea looked from the palace, she was happy.
(lưu ý rằng câu sau là chủ đề "uống trà" là một 'tính từ').
Ngoài ra, xác định những gì sẽ xảy ra nếu các đại danh từ không trỏ đến đề tài này (nhưng đến đối tượng ví dụ):
the princess looked at the prince, he was happy.
Để giải quyết vấn đề của bạn trong trường hợp chung nhất, bạn nên tìm (hoặc thực hiện) một đặc tả chính thức của tiếng Anh (hoặc bất kỳ ngôn ngữ nào khác), có thể cho bạn biết chính xác phần nào của câu là chủ ngữ, động từ, đối tượng, v.v. Ví dụ: nhiều câu tiếng Anh đơn giản có dạng (phần giữa các dấu ngoặc [] là tùy chọn, các phần giữa dấu ngoặc đơn() là lựa chọn, nghĩa là (a | a) có nghĩa là bạn nên chọn 'the' hoặc 'a'):
sentence := subject verb [object]
Mỗi phần trên bên phải của đặc điểm kỹ thuật cần phải được quy định cụ thể hơn, ví dụ:
subject, object := (noun_part_of_sentence|noun_part_of_sentence_plural)
noun_part_of_sentence := article [adjectivelist] [noun_modifier] noun # I guess there is a formal name for this...
noun_part_of_sentence_plural := [adjectivelist] [noun_modifier] noun_plural # note: no article
adjectivelist:= adjective [adjectivelist] # i.e., one or more adjectives
Đối với câu phức tạp hơn, chẳng hạn như một ở trên bằng cụm từ tính từ, các đặc điểm kỹ thuật trên không đủ và phải giống như sau:
noun_part_of_sentence := (the|a) [adjectivelist] [noun_modifier] [noun] [adjective_phrase]
adjective_phrase := relative_pronoun verb [object]
relative_pronoun := (who|which|that)
Lưu ý rằng đặc tả ở trên đã khá mạnh: (nếu bạn có thể xác định chính xác loại của từng từ, ví dụ: động từ, danh từ, bài viết, vv) nó có thể phát hiện thành công các câu sau đây:
The princess drank the tea.
The beautiful princess drank the tea.
The beautiful princess drank delicious the tea.
A beautiful princess drank delicious the lemon tea.
The beautiful princess who saw the handsome prince drank the refreshing tea.
The beautiful princess who saw the handsome prince who made the tea drank the refreshing tea.
Tuy nhiên, nó không cho phép (chưa) cho câu như 'công chúa nhìn vào cung điện', 'công chúa uống trà' (lưu ý: không phải 'trà') và vô hạn những người khác. Bí quyết là mở rộng đặc tả chính thức của bạn đến mức phù hợp với loại câu bạn mong đợi.
Sau khi bạn đã phân tích cú pháp câu thành công, bạn (do đó) biết chủ đề, đại từ bất kỳ và bạn có thể thay thế. Tuy nhiên, lưu ý rằng ngôn ngữ tiếng Anh không rõ ràng, ví dụ:
The princess looked at her mother, she was happy.
Cô ấy chỉ vào công chúa hoặc với mẹ của cô ấy?
Chúc may mắn!
P.S. Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi, vì vậy tôi hy vọng tôi đã sử dụng đúng thuật ngữ cho mọi thứ!
Bạn nên xem xét sử dụng hệ thống [độ phân giải lõi] (http://en.wikipedia.org/wiki/Coreference) của [Stanford CoreNLP] (http://nlp.stanford.edu/software/corenlp.shtml). Đây là một [Python wrapper cho nó] (https://github.com/dasmith/stanford-corenlp-python). – Jared