spaCy在有点表示缩写时会错误地拆分句子。
import spacy tool = spacy.load('en') x = tool('It starts at 9:00 a.m. Eastern Standard Time.') list(x.sents)
产生两个句子而不是一个。我如何正确地做到这一点?
lo8azlld1#
如果你使用的是标准的英语模型,en_core_web_sm或en_core_web_md或en_core_web_lg,最常见的缩写应该已经处理过了:
en_core_web_sm
en_core_web_md
en_core_web_lg
>>> import spacy >>> nlp = spacy.load('en_core_web_sm') >>> doc = nlp('It starts at 9:00 a.m. Eastern Standard Time.') >>> list(doc.sents) [It starts at 9:00 a.m. Eastern Standard Time.]
但是,如果您有一个缩写不能被您使用的模型识别,您可以使用add_special_case来正确处理它。例如,在下面的情况下,Pres.不能被识别为缩写,因此返回两个句子而不是一个句子:
add_special_case
Pres.
>>> import spacy >>> nlp = spacy.load('en_core_web_sm') >>> doc = nlp('I want to talk to Pres. Michael') >>> list(doc.sents) [I want to talk to Pres., Michael]
你必须加载你自己的特殊情况库,以通知模型这是一个缩写,而不是一个句子的结尾。令牌的逐字文本(ORTH)可以是任何你想要的,也可以包括点。
ORTH
>>> from spacy.attrs import ORTH, LEMMA >>> nlp.tokenizer.add_special_case('Pres.', [{ORTH: 'Pres', LEMMA: 'president'}]) >>> doc = nlp('I want to talk to Pres. Michael') >>> list(doc.sents) [I want to talk to Pres Michael]
yeotifhr2#
在@augustomen的anwser -- update for spaCy v3. 5之后从spaCy v3.0开始,从快捷方式加载模型已过时
>>> import spacy >>> nlp = spacy.load("en_core_web_sm")
>>> doc = nlp('I want to talk to Pres. Michael') >>> list(doc.sents) [I want to talk to Pres., Michael]
tokenizer无法覆盖token的引理,请使用norm代替
>>> from spacy.attrs import ORTH, NORM >>> nlp.tokenizer.add_special_case('Pres.', [{ORTH: 'Pres.', NORM: 'president'}]) >>> doc = nlp('I want to talk to Pres. Michael') >>> list(doc.sents) [I want to talk to Pres. Michael]
2条答案
按热度按时间lo8azlld1#
如果你使用的是标准的英语模型,
en_core_web_sm
或en_core_web_md
或en_core_web_lg
,最常见的缩写应该已经处理过了:但是,如果您有一个缩写不能被您使用的模型识别,您可以使用
add_special_case
来正确处理它。例如,在下面的情况下,Pres.
不能被识别为缩写,因此返回两个句子而不是一个句子:你必须加载你自己的特殊情况库,以通知模型这是一个缩写,而不是一个句子的结尾。令牌的逐字文本(
ORTH
)可以是任何你想要的,也可以包括点。yeotifhr2#
在@augustomen的anwser -- update for spaCy v3. 5之后
从spaCy v3.0开始,从快捷方式加载模型已过时
tokenizer无法覆盖token的引理,请使用norm代替