如何识别句子的主语?

时间:2015-02-19 22:38:09

标签: python nlp nltk

可以使用Python + NLTK来识别句子的主语吗?从我所学到的,到现在为止,一句话可以被分解成一个头及其家属。对于例如"我拍了一头大象"。在这句话中,我和大象是家属拍摄的。但是,我怎么辨别这句话中的主语是I.

6 个答案:

答案 0 :(得分:17)

您可以使用Spacy

代码

import spacy
nlp = spacy.load('en')
sent = "I shot an elephant"
doc=nlp(sent)

sub_toks = [tok for tok in doc if (tok.dep_ == "nsubj") ]

print(sub_toks) 

答案 1 :(得分:14)

正如NLTK book(练习29)所说,“在英语中定义句子S的主题的一种常见方式是作为S的孩子和VP的兄弟的名词短语。”

看看tree example:的确,“我”是名词短语,它是S的孩子,是VP的兄弟,而“大象”则不是。

答案 2 :(得分:6)

英语有两种声音:主动语态和被动语态。让我们采用最常用的语音:主动语音。

遵循subject-verb-object模型。要标记主题,请编写带有POS标记的规则集。标记句子I[NOUN] shot[VERB] an elephant[NOUN]。如果你看到第一个名词是主语,那么就有一个动词然后有一个对象。

如果你想让它变得更复杂,那就是句子I shot an elephant with a gun。在这里,介词或从属连词如with,at,in可以被赋予角色。这句话将被标记为I[NOUN] shot[VERB] an elephant[NOUN] with[IN] a gun[NOUN]。你可以很容易地说这个词有助于发挥作用。您可以构建一个基于规则的系统来获取句子中每个单词的作用。

同时查看被动语态中的模式并为其编写规则。

答案 3 :(得分:1)

rake_nltkpip install rake_nltk)是一个包装nltk并显然使用RAKE算法的python库。

from rake_nltk import Rake

rake = Rake()

kw = rake.extract_keywords_from_text("Can Python + NLTK be used to identify the subject of a sentence?")

ranked_phrases = rake.get_ranked_phrases()

print(ranked_phrases)

# outputs the keywords ordered by rank
>>> ['used', 'subject', 'sentence', 'python', 'nltk', 'identify']

默认情况下,使用nltk中的停用词列表。您可以通过将其传递到构造函数中来提供自定义停用词列表和标点符号:

rake = Rake(stopwords='mystopwords.txt', punctuations=''',;:!@#$%^*/\''')

默认情况下,string.punctuation用于标点符号。

构造函数还接受language关键字,该关键字可以是nltk支持的任何语言。

答案 4 :(得分:0)

你可以通过doc = nlp(text.decode('utf8'))这样的方式来解决这个问题,但这可能会在将来给你带来更多错误。

致谢:https://github.com/explosion/spaCy/issues/380

答案 5 :(得分:0)

Stanford Corenlp工具还可以用于提取句子的主观关系对象信息。

附加相同的屏幕截图:

enter image description here