如何使用SpaCy从句子列表中获取名词短语

时间:2019-01-22 21:46:35

标签: python spacy

我有一个句子列表,需要使用SpaCy为每个句子找到名词短语。当前,输出仅附加所有句子中的所有名词短语。如何获得每个句子的名词短语并打印为列表列表?

假设我们列表中有两个句子元素-

A = ["I am a boy", "I am a girl"]

A_np = []
for x in A:
    doc = nlp(x)
    for np in doc.noun_chunks:
        story_np.append(np.text)
A_np

我期望得到这样的东西:

[['I','boy'],['I','girl']]

3 个答案:

答案 0 :(得分:0)

您需要做两个即兴创作:

1 / noun_chunks是跨度,而不是标记。因此,最好对名词块的各个标记进行迭代。

2 /您需要一个中间列表来存储单个句子的名词块。

即兴代码,您可以根据需要进行调整:

>>> A = ["I am a boy", "I am a girl"]
>>> nlp = spacy.load('en')
>>> A_np = []
>>> for x in A:
...     doc = nlp(x)
...     sent_nps = []
...     for np in doc.noun_chunks:
...             sent_nps.extend([token.text for token in np])
...     A_np.append(sent_nps)
...
>>> A_np
[['I', 'a', 'boy'], ['I', 'a', 'girl']]

答案 1 :(得分:0)

在从句子中创建单词列表并除去杂音和停用词,然后将所有这些都变为相同的情况之后,数据中将剩下一组单词。

然后您可以调用图书馆

nlp = spacy.load('en', disable=['parser', 'ner'])

或喜欢

nlp = spacy.load('en_core_web_sm', disable=['parser', 'ner'])

然后,您可以定义一个函数来过滤出名词单词,例如:

def filter_nouns(texts, tags=['NOUN']):
       output = []
       for x in texts:
             doc = nlp(" ".join(x)) 
             output.append([token.lemma_ for token in doc if token.pos_ in tags])
       return output

然后您可以将已定义的功能应用于已清除的数据

我希望它能证明有用

答案 2 :(得分:0)

我通过在第二个循环之前添加一个空列表并将doc块插入到该空列表的最后一个元素中来解决这个问题。这两个循环将保持短语短语的短语不变,并插入经过处理的名词短语。

A = ["I am a boy", "I am a girl"]

A_np = []
    for x in A:
        doc = nlp(x)
        A_np.append([])
        for np in doc.noun_chunks:
            story_np[-1].append(np.text)
A_np