避免 <sos> 和 <eos> 被 Spacy 解析

SRC*_*SRC 1 python parsing nlp spacy

我被一个基本的事情困住了,但我不知道如何让它发挥作用。如果这是非常基本的东西,我很抱歉。只是我对 Spacy 很陌生,不知道该怎么做。在互联网上也找不到任何资源。

我有很多这样的句子

a = "<sos> Hello There! <eos>"
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码行使用 Spacy 对其进行标记

import spacy
nlp = spacy.load('en_core_web_sm')
for token in nlp(a):
    print(token.text)
Run Code Online (Sandbox Code Playgroud)

它打印的内容是这样的

<
sos
>
Hello
There
!
<
eos
>
Run Code Online (Sandbox Code Playgroud)

如您所见,它解析了<sos><eos>元标记。我怎样才能避免这种情况?我希望看到的输出类似于以下内容

<sos>
Hello
There
!
<eos>
Run Code Online (Sandbox Code Playgroud)

我不知道如何实现这一目标。任何帮助都会很棒。

提前致谢

小智 5

在 spaCy 中,分词器在分割文本之前检查异常。您需要向标记生成器添加例外,以将符号视为完整标记。

您的代码应如下所示:

import spacy
from spacy.attrs import ORTH, LEMMA

sent = "<sos> Hello There! <eos>"

nlp = spacy.load('en_core_web_sm')

nlp.tokenizer.add_special_case('<sos>', [{ORTH: "<sos>"}])
nlp.tokenizer.add_special_case('<eos>', [{ORTH: "<eos>"}])

for token in nlp(sent):
    print(token.text)
Run Code Online (Sandbox Code Playgroud)

您可以在这里阅读更多相关信息: https ://spacy.io/api/tokenizer#add_special_case