python - 只有 "Whitespace"规则的 Spacy 分词器

标签 python python-3.x nlp spacy

我想知道 spacy 分词器是否可以仅使用“空格”规则分词。 例如:

sentence= "(c/o Oxford University )"

通常使用spacy的如下配置:

nlp = spacy.load("en_core_news_sm")
doc = nlp(sentence)
for token in doc:
   print(token)

结果是:

 (
 c
 /
 o
 Oxford
 University
 )

相反,我想要如下输出(使用 spacy):

(c/o 
Oxford 
University
)

是否可以使用 spacy 获得这样的结果?

最佳答案

让我们用自定义 Tokenizer 更改 nlp.tokenizer使用 token_match 正则表达式:

import re
import spacy
from spacy.tokenizer import Tokenizer

nlp = spacy.load('en_core_web_sm')
text = "This is it's"
print("Before:", [tok for tok in nlp(text)])

nlp.tokenizer = Tokenizer(nlp.vocab, token_match=re.compile(r'\S+').match)
print("After :", [tok for tok in nlp(text)])

Before: [This, is, it, 's]
After : [This, is, it's]

您可以通过添加自定义后缀、前缀和中缀规则进一步调整 Tokenizer

另一种更细粒度的方法是找出为什么 it's token 像 nlp.tokenizer.explain() 一样被拆分:

import spacy
from spacy.tokenizer import Tokenizer
nlp = spacy.load('en_core_web_sm')
text = "This is it's. I'm fine"
nlp.tokenizer.explain(text)

你会发现拆分是由于 SPECIAL 规则造成的:

[('TOKEN', 'This'),
 ('TOKEN', 'is'),
 ('SPECIAL-1', 'it'),
 ('SPECIAL-2', "'s"),
 ('SUFFIX', '.'),
 ('SPECIAL-1', 'I'),
 ('SPECIAL-2', "'m"),
 ('TOKEN', 'fine')]

可以更新以从异常中删除“它是”,例如:

exceptions = nlp.Defaults.tokenizer_exceptions
filtered_exceptions = {k:v for k,v in exceptions.items() if k!="it's"}
nlp.tokenizer = Tokenizer(nlp.vocab, rules = filtered_exceptions)
[tok for tok in nlp(text)]

[This, is, it's., I, 'm, fine]

或完全删除撇号上的拆分:

filtered_exceptions = {k:v for k,v in exceptions.items() if "'" not in k}
nlp.tokenizer = Tokenizer(nlp.vocab, rules = filtered_exceptions)
[tok for tok in nlp(text)]

[This, is, it's., I'm, fine]

注意标记上的点,这是由于未指定后缀规则。

关于python - 只有 "Whitespace"规则的 Spacy 分词器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65160277/

相关文章:

python - 我可以使用 httplib2 进行抢先式身份验证吗?

Python子类调用父类的方法

python-3.x - 如何使用 asyncio 优雅地超时

python - 以 UTF-32 编码的单个字符的长度

python-3.x - 协程的 Python 回溯

java - 使用 MapReduce 作业调用斯坦福CoreNLP API

python - Numpy 将数组广播到更小的数组,每一行都有精确的位置

python代码问题

python - NN VBD IN DT NNS RB 在 NLTK 中是什么意思?

algorithm - 识别一个人的名字与字典中的单词