我使用 benepar 解析器 将句子解析成树。如何防止 benepar 解析器在解析字符串时分割特定的子字符串?
例如,令牌
gonna
被 benepar 分成两个令牌 gon
和 na
,这是我不想要的。
代码示例,附带先决条件:
pip install spacy benepar
python -m nltk.downloader punkt benepar_en3
python -m spacy download en_core_web_md
如果我跑步:
import benepar, spacy
import nltk
benepar.download('benepar_en3')
nlp = spacy.load('en_core_web_md')
if spacy.__version__.startswith('2'):
nlp.add_pipe(benepar.BeneparComponent("benepar_en3"))
else:
nlp.add_pipe("benepar", config={"model": "benepar_en3"})
doc = nlp("This is gonna be fun.")
sent = list(doc.sents)[0]
print(sent._.parse_string)
它会输出:
(S (NP (DT This)) (VP (VBZ is) (VP (TO gon) (VP (TO na) (VP (VB be) (NP (NN fun)))))) (. .))
问题在于代币
gonna
被分成了两个代币gon
和na
。我怎样才能防止这种情况发生?
使用
nlp.tokenizer.add_special_case
:
import benepar, spacy
import nltk
benepar.download('benepar_en3')
nlp = spacy.load('en_core_web_md')
from spacy.symbols import ORTH
nlp.tokenizer.add_special_case(u'gonna', [{ORTH: u'gonna'}])
if spacy.__version__.startswith('2'):
nlp.add_pipe(benepar.BeneparComponent("benepar_en3"))
else:
nlp.add_pipe("benepar", config={"model": "benepar_en3"})
doc = nlp("This is gonna be fun.")
sent = list(doc.sents)[0]
print(sent._.parse_string)
这是上述代码的输出:
(S (NP (DT This)) (VP (VBZ is) (VP (TO gonna) (VP (VB be) (NP (NN fun))))) (. .))