我有一个句子列表,需要使用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']]
答案 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