我想知道spacy tokenizer是否可以只使用“空格”规则对单词进行tokenize。例如:
sentence= "(c/o Oxford University )"
通常,使用以下空间配置:
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可以得到这样的结果吗?
3条答案
按热度按时间r1wp621o1#
让我们将
nlp.tokenizer
更改为一个自定义Tokenizer
,并使用token_match
正则表达式:您可以通过添加自定义后缀、前缀和中缀规则来进一步调整
Tokenizer
。另一种更细粒度的方法是找出为什么
it's
令牌像nlp.tokenizer.explain()
一样被拆分:你会发现拆分是由
SPECIAL
规则引起的:可以更新以从例外中删除“it's”,例如:
或完全删除撇号上的分裂:
请注意标记上附加的点,这是由于未指定后缀规则。
qv7cva1a2#
你可以在spaCy文档中找到这个问题的解决方案:简单https://spacy.io/usage/linguistic-features#custom-tokenizer-example地说,你创建了一个函数,它接受一个字符串
text
并返回一个Doc
对象,然后将这个可调用函数赋给nlp.tokenizer
:lf5gs5x23#
根据文件
https://spacy.io/usage/spacy-101#annotations-token www.example.com
-- splitting on whitespace是Tokenizer的基本行为。
因此,这个简单的解决方案应该有效:
有一个小小的警告。您没有指定如何处理多个空格。SpaCy将这些标记作为单独的标记,以便可以从标记中恢复确切的原始文本。
"hello world"
(有两个空格)将标记为"hello", " ", "world"
。(对于一个空格,它当然只是"hello", "world"
)。