如何使用spacy从句子中打印名词和各自的形容词

时间:2018-03-08 07:30:25

标签: python spacy

这是python代码。

    import spacy
    from nltk import Tree
    en_nlp = spacy.load('en')
    doc = en_nlp(u"Photos under low lighting are poor, both front and back cameras.")
    def tok_format(tok):
    return "_".join([tok.orth_, tok.tag_])
    def to_nltk_tree(node):
        if node.n_lefts + node.n_rights > 0:
            return Tree(tok_format(node), [to_nltk_tree(child) for child in node.children])
    else:
        return tok_format(node)
   [to_nltk_tree(sent.root).pretty_print() for sent in doc.sents]

output看起来像这样:

                     are_VBP                              
        _________________|___________________               
       |     |   |   Photos_NNS              |             
       |     |   |       |                   |              
       |     |   |    under_IN          cameras_NNS        
       |     |   |       |                   |              
       |     |   |  lighting_NN           front_NN         
       |     |   |       |          _________|_________     
    poor_JJ ,_, ._.    low_JJ   both_CC    and_CC   back_NN

现在,我想要的东西, [(Photos,poor),(lighting,low)] as(名词,形容词)来自这棵树。

1 个答案:

答案 0 :(得分:0)

这是在spacy中提供的。

  1. 使用任何spacy模型进行依赖性解析。 请在此处查看解析树(请记得从菜单中关闭标点符号和短语标记) https://demos.explosion.ai/displacy/?text=Photos%20under%20low%20lighting%20are%20poor%2C%20both%20front%20and%20back%20cameras.&model=en_core_web_sm&cpu=0&cph=0
  2. enter image description here

    1. 令牌中的解析信息将具有dep(字符串)和dep_(数字)属性,您可以使用这些属性来确定名词使用的形容词。

    2. 使用令牌的pos属性可以获得特定令牌是名词的信息。

      >>> import spacy
      >>> nlp = spacy.load('en')
      >>> parsed = nlp(u"Photos under low lighting are poor, both front and back cameras.")
      >>> print(u'sentence:{0}'.format(parsed.text))
      sentence:Photos under low lighting are poor, both front and back cameras.
      >>> print(u'parsed_sentence_children::{0}'.format([(x.text,x.pos_,x.dep_,[(x.text,x.dep_) for x in list(x.children)]) for x in parsed]))
      parsed_sentence_children::[(u'Photos', u'NOUN', u'nsubj', [(u'under', u'prep')]), (u'under', u'ADP', u'prep', [(u'lighting', u'pobj')]), (u'low', u'ADJ', u'amod', []), (u'lighting', u'NOUN', u'pobj', [(u'low', u'amod')]), (u'are', u'VERB', u'ROOT', [(u'Photos', u'nsubj'), (u'cameras', u'attr'), (u'.', u'punct')]), (u'poor', u'ADJ', u'amod', []), (u',', u'PUNCT', u'punct', []), (u'both', u'DET', u'preconj', []), (u'front', u'ADJ', u'amod', [(u'both', u'preconj'), (u'and', u'cc'), (u'back', u'conj')]), (u'and', u'CCONJ', u'cc', []), (u'back', u'ADJ', u'conj', []), (u'cameras', u'NOUN', u'attr', [(u'poor', u'amod'), (u',', u'punct'), (u'front', u'amod')]), (u'.', u'PUNCT', u'punct', [])]
      >>> print(u'parsed_sentence_ancestors::{0}'.format([(x.text,x.pos_,x.dep_,[(x.text,x.dep_) for x in list(x.ancestors)]) for x in parsed]))
      parsed_sentence_ancestors::[(u'Photos', u'NOUN', u'nsubj', [(u'are', u'ROOT')]), (u'under', u'ADP', u'prep', [(u'Photos', u'nsubj'), (u'are', u'ROOT')]), (u'low', u'ADJ', u'amod', [(u'lighting', u'pobj'), (u'under', u'prep'), (u'Photos', u'nsubj'), (u'are', u'ROOT')]), (u'lighting', u'NOUN', u'pobj', [(u'under', u'prep'), (u'Photos', u'nsubj'), (u'are', u'ROOT')]), (u'are', u'VERB', u'ROOT', []), (u'poor', u'ADJ', u'amod', [(u'cameras', u'attr'), (u'are', u'ROOT')]), (u',', u'PUNCT', u'punct', [(u'cameras', u'attr'), (u'are', u'ROOT')]), (u'both', u'DET', u'preconj', [(u'front', u'amod'), (u'cameras', u'attr'), (u'are', u'ROOT')]), (u'front', u'ADJ', u'amod', [(u'cameras', u'attr'), (u'are', u'ROOT')]), (u'and', u'CCONJ', u'cc', [(u'front', u'amod'), (u'cameras', u'attr'), (u'are', u'ROOT')]), (u'back', u'ADJ', u'conj', [(u'front', u'amod'), (u'cameras', u'attr'), (u'are', u'ROOT')]), (u'cameras', u'NOUN', u'attr', [(u'are', u'ROOT')]), (u'.', u'PUNCT', u'punct', [(u'are', u'ROOT')])]