Nlp 名词和名词组块的散化

Nlp 名词和名词组块的散化,nlp,spacy,lemmatization,Nlp,Spacy,Lemmatization,我正在尝试创建一个文档语料库,它由柠檬化的名词和名词块组成。我正在使用以下代码: import spacy nlp = spacy.load('en_core_web_sm') def lemmatizer(doc, allowed_postags=['NOUN']): doc = [token.lemma_ for token in doc if token.pos_ in al

我正在尝试创建一个文档语料库,它由柠檬化的名词和名词块组成。我正在使用以下代码:

import spacy
nlp = spacy.load('en_core_web_sm')

def lemmatizer(doc, allowed_postags=['NOUN']):                                                     
    doc = [token.lemma_ for token in doc if token.pos_ in allowed_postags]
    doc = u' '.join(doc)
    return nlp.make_doc(doc)


nlp.add_pipe(nlp.create_pipe('merge_noun_chunks'), after='ner')
nlp.add_pipe(lemmatizer, name='lemm', after='merge_noun_chunks')

doc_list = []                                                                                      
for doc in data:                                                                                    
    pr = nlp(doc)
    doc_list.append(pr) 

   
“欧元区作为一个货币联盟已经前进了很长的一段路”这句话是在识别了大量的名词后的
[“欧元区”,“先进的”,“漫长的”,“道路”,“货币联盟”]
和柠檬化:
[“欧元”,“区域”,“道路”,“货币”,“联盟”]
。 有没有一种方法可以将已识别名词块的单词组合起来,得到如下输出:
[‘欧元区’、‘路’、‘货币联盟’]
[‘欧元区’、‘路’、‘货币联盟’]


谢谢你的帮助

我认为你的问题不在于柠檬化。 此方法适用于您的示例

# merge noun phrase and entities
def merge_noun_phrase(doc):
    spans = list(doc.ents) + list(doc.noun_chunks)
    spans = spacy.util.filter_spans(spans)
    
    with doc.retokenize() as retokenizer:
        for span in spans:
            retokenizer.merge(span)
    return doc

sentence = "the euro area has advanced a long way as a monetary union"
doc = nlp(sentence)
doc2 = merge_noun_phrase(doc)
for token in doc2:
    print(token)
    #['the euro area', 'way', 'a monetary union']
我必须注意,我使用的是spacy2.3.5,最新版本中可能不推荐使用
spacy.util.filter\u span
。这个答案对你有帮助。:)

而且,如果您仍然尝试将名词块柠檬化,您可以按照以下方式进行:

doc = nlp("the euro area has advanced a long way as a monetary union")
for chunk in doc.noun_chunks:
    print(chunk.lemma_)
    #['the euro area', 'a monetary union']
根据中的答案,“在跨度级别上查看引理可能不是很有用,在标记级别上工作更有意义。”