Spacy提取特定名词短语

8

我可以在Python中使用Spacy来查找具有特定邻居的名词短语吗?我想要从我的文本中获取在其前后有动词的名词短语。


文本和输出示例? - DhruvPathak
3个回答

13
  1. 您可以合并名词短语(以便它们不会被单独标记化)。
  2. 分析依存句法树,并查看相邻标记的POS。

>>> import spacy
>>> nlp = spacy.load('en')
>>> sent = u'run python program run, to make this work'
>>> parsed = nlp(sent)
>>> list(parsed.noun_chunks)
[python program]
>>> for noun_phrase in list(parsed.noun_chunks):
...     noun_phrase.merge(noun_phrase.root.tag_, noun_phrase.root.lemma_, noun_phrase.root.ent_type_)
... 
python program
>>> [(token.text,token.pos_) for token in parsed]
[(u'run', u'VERB'), (u'python program', u'NOUN'), (u'run', u'VERB'), (u',', u'PUNCT'), (u'to', u'PART'), (u'make', u'VERB'), (u'this', u'DET'), (u'work', u'NOUN')]
  • 通过分析相邻标记的词性,您可以得到所需的名词短语。

  • 更好的方法是分析依赖解析树,查看名词短语的左右,即使名词短语和动词之间有标点符号或其他词性标签,也可以增加搜索范围。

  • 看起来不错,但我想自动获取所有在其前后有动词的名词短语。对于一个句子,人们可以轻松地阅读、分析和解析,但是如果是一个包含5000条记录的panda数据框,每个记录都有一个要分析的文本单元,该怎么办呢? - Vivek Khetan
    那应该也很简单。 - DhruvPathak
    (u'run', u'VERB'), (u'python program', u'NOUN'), (u'run', u'VERB')这一行代码表示关于"python程序"的什么信息? - DhruvPathak
    1
    这不是所有带有它们的词性标签的分词单词吗?在这种情况下,它们恰好按照动词+名词+动词的顺序排列。我想从大量文本语料库中提取所有这样的组合。我进行了一些阅读,我认为可以通过导航解析树轻松完成。 - Vivek Khetan
    1
    我觉得你基本上已经得到了答案,几乎可以说是送到你面前了,但你似乎没有看到。正如@DhruvPathak所指出的那样,要么你的问题表达不清楚,实际上你想表达的是其他意思,否则这段代码看起来确实做到了你所要求的。 - Igor
    显示剩余3条评论

    2

    来自 https://spacy.io/usage/linguistic-features#dependency-parse

    您可以使用名词短语。名词短语是“基本名词短语”——具有名词作为其头部的平面短语。您可以将名词短语视为名词加上描述名词的单词,例如,“奢华的绿草”或“世界最大的技术基金”。要获取文档中的名词短语,只需迭代Doc.noun_chunks

    In:
            import spacy
        ​    nlp = spacy.load('en_core_web_sm')
            doc = nlp(u"Autonomous cars shift insurance liability toward manufacturers")
            for chunk in doc.noun_chunks:
                print(chunk.text)
    
    Out:
    
            Autonomous cars
            insurance liability
            manufacturers
    

    2
    这不会过滤名词块,只有在其前后有动词的块。 - Joshua Stafford

    1
    如果您想使用合并短语进行重新标记化,我更喜欢这种方法(而不是名词块):
    import spacy
    nlp = spacy.load('en_core_web_sm')
    nlp.add_pipe(nlp.create_pipe('merge_noun_chunks'))
    doc = nlp(u"Autonomous cars shift insurance liability toward manufacturers")
    for token in doc:
        print(token.text)
    

    输出将是:

    Autonomous cars
    shift
    insurance liability
    toward
    manufacturers
    

    我选择这种方式是因为每个令牌都具有进一步处理的属性 :)

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接