【问题标题】:NLTK: How do I traverse a noun phrase to return list of strings?NLTK:如何遍历名词短语以返回字符串列表?
【发布时间】:2015-11-19 22:18:10
【问题描述】:

在 NLTK 中,如何遍历已解析的句子以返回名词短语字符串列表?

我有两个目标:
(1) 创建名词短语列表,而不是使用 'traverse()' 方法打印它们。我目前使用 StringIO 来记录现有 traverse() 方法的输出。这不是一个可接受的解决方案。
(2) 对名词短语字符串进行反解析,这样:'(NP Michael/NNP Jackson/NNP)' 变为'Michael Jackson'。 NLTK 中是否有反解析的方法?

NLTK 文档建议使用 traverse() 来查看名词短语,但是如何在此递归方法中捕获“t”,以便生成字符串名词短语列表?

from nltk.tag import pos_tag

def traverse(t):
  try:
      t.label()
  except AttributeError:
      return
  else:
      if t.label() == 'NP': print(t)  # or do something else
      else:
          for child in t: 
              traverse(child)

def nounPhrase(tagged_sent):
    # Tag sentence for part of speech
    tagged_sent = pos_tag(sentence.split())  # List of tuples with [(Word, PartOfSpeech)]
    # Define several tag patterns
    grammar = r"""
      NP: {<DT|PP\$>?<JJ>*<NN>}   # chunk determiner/possessive, adjectives and noun
      {<NNP>+}                # chunk sequences of proper nouns
      {<NN>+}                 # chunk consecutive nouns
      """
    cp = nltk.RegexpParser(grammar)  # Define Parser
    SentenceTree = cp.parse(tagged_sent)
    NounPhrases = traverse(SentenceTree)   # collect Noun Phrase
    return(NounPhrases)

sentence = "Michael Jackson likes to eat at McDonalds"
tagged_sent = pos_tag(sentence.split())  
NP = nounPhrase(tagged_sent)  
print(NP)  

目前打印:
(NP 迈克尔/NNP 杰克逊/NNP)
(NP 麦当劳/NNP)
并将“无”存储到 NP

【问题讨论】:

标签: python parsing recursion nltk traversal


【解决方案1】:
def extract_np(psent):
  for subtree in psent.subtrees():
    if subtree.label() == 'NP':
      yield ' '.join(word for word, tag in subtree.leaves())


cp = nltk.RegexpParser(grammar)
parsed_sent = cp.parse(tagged_sent)
for npstr in extract_np(parsed_sent):
    print (npstr)

【讨论】:

  • 谢谢,您的代码帮了大忙。你能告诉我为什么你选择在第四行使用'yield'而不是'return'吗?
  • 不错!谢谢。我将 subtree.node 更改为 subtree.label() 并将 npstr 更改为 print(npstr) 并且它在 python 3 中工作。
猜你喜欢
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2020-06-17
  • 2014-07-06
  • 2023-03-29
相关资源
最近更新 更多