spacy 3 - 返回的 lemma_ 将为空字符串
spacy 3 - lemma_ returned will be empty string
我使用 spacy 3 规范化了数万个文档。
- 为了加快这个过程,我尝试这样,
nlp = spacy.load('en_core_web_sm')
docs = nlp.tokenizer.pipe(doc_list)
return [[word.lemma_ for word in doc if word.is_punct == False and word.is_stop == False] for doc, _ in doc_list]
但返回的所有 lemma_
都是空字符串。
- 所以我直接像下面这样使用nlp(doc),但是太慢了
a = [[word.lemma_ for word in nlp(doc) if word.is_punct == False and word.is_stop == False] for doc in doc_list]
我怎样才能正确地做到这一点?
区别在于您创建文档的方式。
- 在第一个示例中,您使用
nlp.tokenizer.pipe()
- 这只会 运行 您所有文档的分词器,而不是词形还原器。因此,您得到的只是将文档拆分为标记,但未设置 lemma_
属性。
- 在您使用
nlp(doc)
的第二个示例中,这将 运行 所有默认组件(即 ['tok2vec', 'tagger', 'parser', 'ner', 'attribute_ruler', 'lemmatizer']
。由于 lemmatizer
是管道的一部分 lemma_
属性已设置。但是,速度较慢,因为您正在 运行 安装所有组件,甚至是您不需要的组件。
你应该做什么:
import spacy
# Exclude components not required when loading the spaCy model.
nlp = spacy.load("en_core_web_sm", exclude=["tok2vec", "parser", "ner", "attrbute_ruler"])
# Extract lemmas as required.
a = [[word.lemma_ for word in nlp(doc) if word.is_punct == False and word.is_stop == False] for doc in doc_list]
我使用 spacy 3 规范化了数万个文档。
- 为了加快这个过程,我尝试这样,
nlp = spacy.load('en_core_web_sm')
docs = nlp.tokenizer.pipe(doc_list)
return [[word.lemma_ for word in doc if word.is_punct == False and word.is_stop == False] for doc, _ in doc_list]
但返回的所有 lemma_
都是空字符串。
- 所以我直接像下面这样使用nlp(doc),但是太慢了
a = [[word.lemma_ for word in nlp(doc) if word.is_punct == False and word.is_stop == False] for doc in doc_list]
我怎样才能正确地做到这一点?
区别在于您创建文档的方式。
- 在第一个示例中,您使用
nlp.tokenizer.pipe()
- 这只会 运行 您所有文档的分词器,而不是词形还原器。因此,您得到的只是将文档拆分为标记,但未设置lemma_
属性。 - 在您使用
nlp(doc)
的第二个示例中,这将 运行 所有默认组件(即['tok2vec', 'tagger', 'parser', 'ner', 'attribute_ruler', 'lemmatizer']
。由于lemmatizer
是管道的一部分lemma_
属性已设置。但是,速度较慢,因为您正在 运行 安装所有组件,甚至是您不需要的组件。
你应该做什么:
import spacy
# Exclude components not required when loading the spaCy model.
nlp = spacy.load("en_core_web_sm", exclude=["tok2vec", "parser", "ner", "attrbute_ruler"])
# Extract lemmas as required.
a = [[word.lemma_ for word in nlp(doc) if word.is_punct == False and word.is_stop == False] for doc in doc_list]